找回密码
 立即注册
查看: 382|回复: 4

Ai8051U创新风格库函数学习打卡

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

349

积分

版主

积分
349
发表于 2025-2-12 16:41:53 | 显示全部楼层 |阅读模式
第1集  I/O口模式和传统的外部中断
截图202502121636225513.jpg

  1. #include <AI8051U.H>
  2. #include "set_int.h"
  3. #include "set_io.h"
  4. #include "intrins.h"
  5. void Delay1us(void)        //@24.000MHz
  6. {
  7.         unsigned long edata i;
  8.         _nop_();
  9.         _nop_();
  10.         _nop_();
  11.         i = 4UL;
  12.         while (i) i--;
  13. }
  14. void main(void)
  15. {
  16.         
  17.         //需要初始化部分的代码
  18.         EAXFR = 1;//拓展寄存器访问使能
  19.         CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
  20.         WTST = 0;//设置取程序代码不等待,以最快速度运行
  21.         //设置io端口模式,将P40置为低电平
  22.         //设置P32和P33为高阻输入模式,同时打开内部的上拉电阻
  23.         set_io_mode(pu_mode, Pin40,Pin00,Pin01,Pin02,Pin03,Pin_End);
  24.         P40 = 0;
  25.         //set_io_mode(pu_mode, Pin40,Pin00,Pin01,Pin_End);
  26.         set_io_mode(hz_mode,Pin32,Pin33,Pin34,Pin35,Pin_End);
  27.         //设置P32、P33、P34、P35为高阻输入模式
  28.         set_io_mode(en_pur,Pin32,Pin33,Pin34,Pin35,Pin_End);
  29.         //打开内部上拉电阻后,最好加一段1ms的延时,以等待端口被拉高
  30.         Delay1us();
  31.         //打开P32和P33内部的上拉电阻
  32.         //set_io_mode(dis_pur,Pin32,Pin33,Pin_End);//关闭P32和P33的内部上拉电阻
  33.         //set_io_mode(en_pur,Pin32,Pin33,Pin_End);//关闭P32和P33的内部上拉电阻,参数顺序无所谓
  34.         set_int_mode(falling_edge_mode,Int0,Int1,Int_End);
  35.         //设置INT0和INT1为下降沿中断
  36.         set_int_mode(rising_falling_edge_mode,Int0,Int1,Int_End);
  37.         //设置INT0和INT1为边沿中断
  38.         
  39.         EA = 1;//打开总中断
  40.         while(1)
  41.         {
  42.                 //需要循环执行的代码
  43.                 //INT0、INT1的下降沿时,改变P00和P01的电平状态
  44.                 if(get_int_state(INT0))
  45.                 {
  46.                  //INT0中断执行的部分
  47.                         P00 = ~P00;
  48.                 }
  49.                 if(get_int_state(INT1))
  50.                 {
  51.                  //INT1中断执行的部分
  52.                         P01 = ~P01;
  53.                 }
  54.                 P02 = P34;
  55.                 P03 = P35;
  56.         }
  57. }
复制代码

IO.zip

75.15 KB, 下载次数: 11

回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

349

积分

版主

积分
349
发表于 2025-2-14 11:06:18 | 显示全部楼层
第2集 所有普通IO口都支持的外部中断
截图202502141105181500.jpg

  1. #include <AI8051U.H>
  2. #include "io_int.h"
  3. #include "set_io.h"
  4. #include "set_uart.h"
  5. void main(void)
  6. {
  7.         EAXFR = 1;//拓展寄存器访问使能
  8.         CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
  9.         WTST = 0;//设置取程序代码不等待,以最快速度运行
  10.         //初始化程序
  11.         //按下P32按键,按下P33按键,通过串口打印出识别到的上升沿/下降沿
  12.         set_io_mode(hz_mode,Pin32,Pin33,Pin36,Pin_End);
  13.         //设置P32和P33为高阻输入模式,默认就是高阻
  14.         set_io_mode(en_pur,Pin32,Pin33,Pin36,Pin_End);
  15.         //设置P32和P33内部的4K上拉电阻打开
  16.         set_io_mode(pp_mode,Pin37,Pin_End);
  17.         //将串口发送脚P37设置为推挽输出,抗干扰
  18.        
  19.         set_ioint_mode(falling_edge_mode,Pin32,Pin_End);
  20.         //设置P32为下降沿中断
  21.         //set_ioint_mode(rising_edge_mode,Pin32,Pin_End);
  22.         //设置P32为上升沿中断
  23.         //set_ioint_mode(low_level_mode,Pin32,Pin_End);
  24.         //设置P32为低电平中断
  25.         //set_ioint_mode(high_level_mode,Pin32,Pin_End);
  26.         //设置P32为高电平中断
  27.         set_ioint_mode(rising_edge_mode,Pin33,Pin_End);
  28.         //设置P33为上升沿中断
  29.         set_ioint_mode(en_int,Pin32,Pin33,Pin_End);
  30.         //同时打开P32和P33的io中断
  31.         //set_ioint_mode(dis_int,Pin32,Pin33,Pin_End);
  32.         //同时关闭P32和P33的io中断
  33.        
  34.         set_uart_mode(Uart1,"115200bps",Use_Timer2,Base_8b,"64byte",Uart1_P36_7,Uart_End);
  35.         //设置串口1为115200bps的波特率,使用定时器2作为串口波特率发生器
  36.         //超时中断长度选择64byte,引脚切换到P36、P37上
  37.     //set_uart_mode(Uart1,"9600bps",Use_Timerx,"32byte",Odd_9b,Uart1_P16_7,Uart_End);
  38.         //设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
  39.         //超时中断长度选择32byte,引脚切换到P16、P17
  40.         //set_uart_mode(Uart1,Uart1_P36_7,Uart_End);
  41.         //支持默认值操作,这部分设置等效为
  42.         //设置串口1为9600bps的波特率,使用定时器1作为串口波特率发生器
  43.         //超时中断长度选择32byte,引脚切换到P36、P37上
  44.         //set_uart_mode(Uart3,"9600bps",Use_Timerx,Base_8b,"64byte",Uart3_P50_1,Uart_End);
  45.         //set_uart_mode(Uart4,"38400bps",Use_Timerx,Base_8b,"64byte",Uart4_P52_3,Uart_End);
  46.         //实现设置两个串口工作在不同的波特率下,使用的是8位无校验模式
  47.         //set_uart_mode(Uart3,"9600bps",Use_Timer2,Base_8b,"64byte",Uart3_P50_1,Uart_End);
  48.         //set_uart_mode(Uart4,"9600bps",Use_Timer2,Base_8b,"64byte",Uart4_P52_3,Uart_End);
  49.         //实现设置两个串口工作在相同的波特率下,使用的是8位无校验模式
  50.         EA = 1;
  51.         while(1)
  52.         {
  53.                 //循环执行的程序
  54.                 if(get_ioint_state(Pin32))//设置P32为下降沿中断
  55.                 {
  56.                         uart_printf(Uart1,"P32 Click\r\n");
  57.                 }
  58.                 if(get_ioint_state(Pin33))//设置P33为上升沿中断
  59.                 {
  60.                         uart_printf(Uart1,"P33 Click\r\n");
  61.                 }
  62.         }
  63. }
复制代码

io_int.zip

140.86 KB, 下载次数: 8

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

349

积分

版主

积分
349
发表于 2025-2-20 10:54:25 | 显示全部楼层
第3集  24位定时器

(1)学习截图
1c997150c1cfe347ffd2f2b4a6e9467d.png

(2)学习截图

2

2



  1. #include <AI8051U.H>
  2. #include "set_io.h"
  3. #include "set_timer.h"
  4. void main(void)
  5. {
  6.         EAXFR = 1;
  7.         CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
  8.         WTST = 0;//设置取程序代码不等待,以最快速度运行
  9.         //初始化的代码
  10.         //P40设置为准双向口,,同时置为低电平
  11.         set_io_mode(pu_mode,Pin40,Pin00,Pin01,Pin02,Pin03,Pin04,Pin05,Pin_End);
  12.         //设置P00--P05 I/O口为准双向口
  13.         P40 = 0;
  14.         //设置定时器0为0.5s,定时器1为1s,定时器2为200ms,定时器3为10hz
  15.         //定时器4为2s,定时器11为300ms
  16.         //暂时只能支持秒、毫秒、赫兹三个单位,如果想要使用微秒,0.5ms=500us
  17.         //set_timer_fosc(11059200UL);
  18.         set_timer_mode(Timer0,"0.5s",Timer_End);
  19.     //set_timer_mode(Timer1,"1s",Timer_End);//设置1s的定时
  20.         set_timer_mode(Timer1,"100000hz",En_OutClk,Dis_Int,Timer_End);
  21.         //设置用定时器1对系统时钟分频对外输出时钟,如100Khz
  22.         //产生较高频率对外输出时,系统时钟需要满足要求,并且需要关闭中断
  23.         //如1khz为set_timer_mode(Timer1,"1000hz",En_OutClk,Dis_Int,Timer_End);
  24.         //如1Mhz为set_timer_mode(Timer1,"1000000hz",En_OutClk,Dis_Int,Timer_End);
  25.         set_timer_mode(Timer2,"200ms",Timer_End);
  26.         set_timer_mode(Timer3,"10hz",Timer_End);
  27.         set_timer_mode(Timer4,"2s",Timer_End);
  28.         set_timer_mode(Timer11,"300ms",Timer_End);
  29.         
  30.         EA = 1;
  31.         while(1)
  32.         {
  33.                 //循环的代码
  34.                 //检测定时器是否有中断
  35.                 //将对应IO口的电平进行取反
  36.                 if(get_timer_state(Timer0))
  37.                 {
  38.                         //执行的代码
  39.                         P00 = ~P00;
  40.                 }
  41. //                if(get_timer_state(Timer1))
  42. //                {
  43. //                        //执行的代码
  44. //                        P01 = ~P01;
  45. //                }
  46.                 if(get_timer_state(Timer2))
  47.                 {
  48.                         //执行的代码
  49.                         P02 = ~P02;
  50.                 }
  51.                 if(get_timer_state(Timer3))
  52.                 {
  53.                         //执行的代码
  54.                         P03 = ~P03;
  55.                 }
  56.                 if(get_timer_state(Timer4))
  57.                 {
  58.                         //执行的代码
  59.                         P04 = ~P04;
  60.                         set_timer_mode(Timer4,Dis_Int,Timer_End);
  61.                         //实现定时器4定时2s中断,产生中断后对P04取反,然后关闭定时器4中断
  62.                 }
  63.                 if(get_timer_state(Timer11))
  64.                 {
  65.                         //执行的代码
  66.                         P05 = ~P05;
  67.                 }
  68.         }
  69. }
复制代码

timer.zip

3.39 MB, 下载次数: 10

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

349

积分

版主

积分
349
发表于 2025-2-20 11:44:51 | 显示全部楼层
第4集 串口部分库函数
截图202502201142578015.jpg

截图202502201143091718.jpg
  1. #include <AI8051U.H>
  2. #include "io_int.h"
  3. #include "set_io.h"
  4. #include "set_uart.h"
  5. #include "stdio.h"
  6. int num = 0;
  7. char str[5] = {'a','b','c','d','e'};
  8. void main(void)
  9. {
  10.     EAXFR = 1; //拓展寄存器访问使能
  11.         CKCON = 0; //设置访问片内扩展的xdata部分速度为最快
  12.         WTST = 0; //设置取程序代码不等待,以最快速度运行
  13.         //需要初始化部分的程序
  14.         //设置P36、P37端口为准双向口,推荐:TXD(推挽输出)、RXD(高阻输入+4K内部电阻上拉)
  15.         set_io_mode(pu_mode,Pin36,Pin37,Pin42,Pin43,Pin_End);
  16.         //不同波特率的串口使用,以及printf函数的使用
  17.          set_uart_mode(Uart1, "115200bps", Uart1_P36_7, Use_Timerx, Uart_End);
  18.         //set_uart_mode(Uart1, Uart1_P36_7, "115200bps",Uart_End);
  19.         set_uart_mode(Uart2, Uart2_P42_3, "9600bps", Use_Timerx, Uart_End);
  20.         //设置I/O中断,P34按键,按下时发送一个字符串
  21.          set_io_mode(hz_mode, Pin34, Pin_End);
  22.      set_io_mode(en_pur, Pin34, Pin_End);
  23.      set_ioint_mode(falling_edge_mode, Pin34, Pin_End);
  24.      set_ioint_mode(en_int, Pin34, Pin_End);
  25.      EA = 1; //打开总中断
  26.         while(1)
  27.         {
  28.                 if(get_ioint_state(Pin34))
  29.                 {
  30.                          uart_printf(Uart1, "uart1,hello!\r\n");
  31.                          uart_printf(Uart2, "uart2,hello!\r\n");
  32.                 }
  33.                
  34.                 if(get_uart_state(Uart1))
  35.                 {
  36.                         sscanf(_uart1_rx_buff, "num:%d", &num);
  37.                         uart_printf(Uart1, "this_num:%d\r\n",num);
  38.                         uart_printf(Uart2, Buff_Mode, str, 5);      
  39.                 }            
  40.         }  
  41. }
复制代码



uart.zip

136.33 KB, 下载次数: 10

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-06-16 17:25:27
已绑定手机

9

主题

37

回帖

349

积分

版主

积分
349
发表于 2025-2-21 10:57:54 | 显示全部楼层
第5集 ADC部分库函数

截图202502211056415484.jpg
  1. #include <AI8051U.H>
  2. #include "set_adc.h"
  3. #include "set_uart.h"
  4. #include "set_timer.h"
  5. #include "set_io.h"
  6. void main(void)
  7. {
  8.         EAXFR = 1; //拓展寄存器访问使能
  9.         CKCON = 0;//设置访问片内扩展的xdata部分速度为最快
  10.         WTST = 0;//设置取程序代码不等待,以最快速度运行
  11.         //初始化部分代码
  12.         //初始化P36 P37为准双向IO口
  13.         set_io_mode(pu_mode,Pin36,Pin37,Pin_End);
  14.         //设置0.5s定时时间,使用Timer0
  15.         set_timer_mode(Timer0, "0.5s", Dis_OutClk, En_Int, Timer_End);
  16.         //设置串口1为P36 P37
  17.         set_uart_mode(Uart1, "115200bps", Uart1_P36_7, Uart_End);
  18.         //设置ADC采样ADC0
  19.         set_adc_mode(cycl_mode,Adc0_P10,Adc_End);
  20.         EA = 1;
  21.         while(1)
  22.         {
  23.                 //检测到定时器产生中断,使用串口打印ADC的值
  24.                 if(get_timer_state(Timer0))//0.5s执行一次
  25.                 {
  26.                         if(get_adc_state(Adc0_P10))
  27.                         {
  28.                                 uart_printf(Uart1, "adc_dat:%d\r\n",adc_value[Adc0_P10]);
  29.                         }
  30.                 }
  31.                 //循环执行部分代码
  32.         }
  33. }
复制代码


adc.zip

170.01 KB, 下载次数: 9

回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-6-17 16:37 , Processed in 1.486550 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表