芯的搬砖工 发表于 2025-2-12 16:49:39

AI8051U 专属库函数 学习打卡

第一节   IO口模式设置   手敲代码 亮灯成功


一 图片


二 视频




三 主程序
#include <AI8051U.H>
#include "set_int.h"
#include "set_io.h"
#include "intrins.h"

void Delay1ms(void)      //@40MHz
{
      unsigned long edata i;

      _nop_();
      _nop_();
      _nop_();
      i = 9998UL;
      while (i) i--;
}


void main(void)
{
      //需要初始化部分的代码
      EAXFR=1;    //拓展寄存器访问使能
      CKCON=0;    //设置访问片内扩展的xdata部分速度
      WTST=0;   //设置取程序代码不等待,以最快的速度运行
      //设置io端模式,将P40置为低电平
      //设置P32和P33为高祖输入模式,同时打开内部的上拉电阻
      set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin02,Pin03,Pin_End);
      P40=0;
      //set_io_mode(pp_mode,Pin40,Pin00,Pin01,Pin_End);
      set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);
      //设置p32和p33、P34、P35为高祖输入模式
      set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);
      //打开内部上拉电阻后,最好加一段1MS的延时,以等待端口被拉高
      
Delay1ms();//1ms的延时
      
//打开p32和p33的内部上拉电阻
      //set_io_mode(dis_pur,Pin32,Pin33,Pin_End); //关闭P32 P33的内部上拉电阻
      //set_io_mode(en_pur,Pin33,Pin32,Pin_End); //关闭P32 P33的内部上拉电阻,参数顺序无所谓
      set_int_mode(falling_edge_mode,Int0,Int1,Int_End);
      //设置INT0 INT1为下降沿中断
      //set_int_mode(rising_falling_edge_mode,Int0,Int1,Int_End)
      //设置INT0 INT1为边沿中断
      
      EA=1;       //打开总中断
      while(1)
      {
                //需要循环执行的代码
                //INT0、INT1的下降沿时,改变P00和P01的电平状态
                if(get_int_state(Int0))
                {
                        //INT0中断时执行的部分
                        P00=~P00;
                }
                if(get_int_state(Int1))
                {
                        //INT1中断时执行的部分
                        P01=~P01;
                }
                P02=P34;
                P03=P35;
      }
}

芯的搬砖工 发表于 2025-2-14 16:14:08

第二集   所有普通IO口都支持的外部中断   手打代码测试成功

实验箱版
一 截图


二 程序
#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"
#include "set_uart.h"

void main(void)
{
      EAXFR=1;   //拓展寄存器访问使能
      CKCON=0;   //设置访问片内扩展的xdata部分速度为最快
      WTST=0;    //设置取程序代码不等待,以最快速度运行
      
      //初始化程序
      //按下P32按键,按下P33按键,通过串口打印出识别到的上升沿/下降沿
      set_io_mode(hz_mode,Pin32,Pin33,Pin36,Pin_End);    //设置p32/p33为高阻输入模式,默认就是高阻
      
      set_io_mode(en_pur,Pin32,Pin33,Pin36,Pin_End);       // 设置P32/P33内部的4K上拉电阻打开
      
      set_io_mode(pp_mode,Pin37,Pin_End);         //将串口发送脚P37设置为推挽输出,抗干扰
      
      set_ioint_mode(falling_edge_mode,Pin32,Pin_End);   //设置P32为下降沿中断
      //set_ioint_mode(rising_edge_mode,Pin32,Pin_End);   //设置P32为上升沿中断
      //set_ioint_mode(high_level_mode,Pin32,Pin_End);   //设置P32为高电平中断
      //set_ioint_mode(low_level_mode,Pin32,Pin_End);   //设置P32为低电平中断
      
      set_ioint_mode(rising_edge_mode,Pin33,Pin_End);   //设置P33为上升沿中断
      
      set_ioint_mode(en_int,Pin32,Pin33,Pin_End);   //同时打开P32/P33的io中断
      //set_ioint_mode(dis_int,Pin32,Pin33,Pin_End);   //同时关闭P32/P33的io中断
      
      set_uart_mode(Uart1,"115200bps",Use_Timer2,Base_8b,"64byte",Uart1_P36_7,Uart_End);

      //设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
      //超时中断长度选择64byte,引脚切换到P36/P37上
      
      //set_uart_mode(Uart1,"9600bps",Use_Timerx,"32byte",Odd_9b,Uart1_P16_7,Uart_End);
      //设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
      //超时中断长度选择32byte,引脚切换到P16/P17上
      
      //set_uart_mode(Uart1,Uart1_P36_7,Uart_End);
      //支持默认值操作,这部分设置等效为
      //设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
      //超时中断长度选择64byte,引脚切换到P36/P37上
      
      //set_uart_mode(Uart3,"9600bps",Use_Timerx,Base_8b,"64byte",Uart3_P50_1,Uart1_P36_7);
      //set_uart_mode(Uart4,"38400bps",Use_Timerx,Base_8b,"64byte",Uart4_P52_3,Uart1_P36_7);
      //实现设置两个串口工作在不同的波特率下,使用的是8位无校验模式
      
      //set_uart_mode(Uart3,"9600bps",Use_Timer2,Base_8b,"64byte",Uart3_P50_1,Uart1_P36_7);
      //set_uart_mode(Uart4,"9600bps",Use_Timer2,Base_8b,"64byte",Uart4_P52_3,Uart1_P36_7);
      //实现设置两个串口工作在相同的波特率下,使用的是8位无校验模式
      
      
      EA=1;
      while(1)
      {
                //循环执行的程序
                if(get_ioint_state(Pin32))    // 设置P32为下降沿中断
                {
                        uart_printf(Uart1,"P32 Click\r\n");
                }
                if(get_ioint_state(Pin33))    // 设置P33为上升沿中断
                {
                        uart_printf(Uart1,"P33 Click\r\n");
                }
      }
}

擎天柱版
一截图


二 视频


三 程序
#include <AI8051U.H>
#include "io_int.h"
#include "set_io.h"


void main(void)
{
      EAXFR=1;   //拓展寄存器访问使能
      CKCON=0;   //设置访问片内扩展的xdata部分速度为最快
      WTST=0;    //设置取程序代码不等待,以最快速度运行
      
      //初始化程序
      //按下P32按键,按下P33按键,通过串口打印出识别到的上升沿/下降沿
      set_io_mode(hz_mode,Pin32,Pin33,Pin_End);    //设置p32/p33为高阻输入模式,默认就是高阻
      
      set_io_mode(en_pur,Pin32,Pin33,Pin_End);       // 设置P32/P33内部的4K上拉电阻打开
      
      set_io_mode(pu_mode,Pin20,Pin21,Pin_End);
      
      set_ioint_mode(falling_edge_mode,Pin32,Pin_End);   //设置P32为下降沿中断
      //set_ioint_mode(rising_edge_mode,Pin32,Pin_End);   //设置P32为上升沿中断
      //set_ioint_mode(high_level_mode,Pin32,Pin_End);   //设置P32为高电平中断
      //set_ioint_mode(low_level_mode,Pin32,Pin_End);   //设置P32为低电平中断
      
      set_ioint_mode(rising_edge_mode,Pin33,Pin_End);   //设置P33为上升沿中断
      
      set_ioint_mode(en_int,Pin32,Pin33,Pin_End);   //同时打开P32/P33的io中断
      //set_ioint_mode(dis_int,Pin32,Pin33,Pin_End);   //同时关闭P32/P33的io中断
      
      
      
      EA=1;
      while(1)
      {
                //循环执行的程序
                if(get_ioint_state(Pin32))    // 设置P32为下降沿中断
                {
                        P20=~P20;
                }
                if(get_ioint_state(Pin33))    // 设置P33为上升沿中断
                {
                        P21=~P21;
                }
      }
}



页: [1]
查看完整版本: AI8051U 专属库函数 学习打卡