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

今天测试AI8051U,先点个灯打印编译时间试试(内含源码),欢迎指教

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-11-3 12:38:36 | 显示全部楼层 |阅读模式
本帖最后由 DebugLab 于 2024-11-3 15:24 编辑

首先得感谢AI公司!
用积分兑换的AI8051U早收到了。
今天才能开始测试。
任何一种芯片拿到手,最先测试的是点灯,AI8051U也不例外。

本次测试IRC频率选择44.2368MHz,串口波特率仍然是115200。
定时器设置因为ISP中没有44.2368MHz选项(建议AIapp-ISP后续版本予以增加),所以只能采用公式自适应计算初始值结果。
本次测试除了点灯外,还利用宏定义__DATE__获取编译日期并转化为数据型打印到串口。
代码如下,请大家多多指教,谢谢!
  1. /*
  2. 芯片:STC8051U-34K64
  3. IRC频率:44.2368MHz
  4. 波特率:115200
  5. 功能:打印程序编译日期(转化为数据型)
  6. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
  7. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
  8. 参考:AI8051U-DEMO-CODE-V1.2范例 中 的 10-串口1中断模式与电脑收发测试
  9. */
  10. #include "AI8051U.h"
  11. #include "stdio.h"
  12. #include "intrins.h"
  13. typedef   unsigned char uchar;
  14. typedef   unsigned int uint;
  15. typedef   unsigned long ulong;
  16. typedef         unsigned char        u8;
  17. typedef         unsigned int        u16;
  18. typedef         unsigned long        u32;
  19. #define LED P35
  20. //#define MAIN_Fosc        22118400L   //定义主时钟(精确计算115200波特率)
  21. //#define MAIN_Fosc        33177600L   //定义主时钟(精确计算115200波特率)
  22. #define MAIN_Fosc        44236800L   //定义主时钟(精确计算115200波特率)
  23. #define Baudrate1   (65536 - MAIN_Fosc / 115200 / 4)
  24. #define Timer_ms      10   //定时器定时时间
  25. #define Timer_val   (65536 - Timer_ms*MAIN_Fosc/12/1000 )
  26. bit fBusy=0;
  27. u32  fc;
  28. const u8 str_date[12] = __DATE__; //
  29. const u8 str_time[10] = __TIME__;
  30. void UART1_config(u8 brt);   // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
  31. void IO_Init();
  32. void Timer0_Init(void);                //10毫秒
  33. void SYS_Init();
  34. void get_date(u8 *date);
  35. void main(void)
  36. {
  37.         u8 date[3];
  38.         SYS_Init();
  39.         get_date(date);
  40.     while (1)
  41.     {
  42.                  if(fc>99)
  43.                 {
  44.                         LED=~LED;
  45.                         fc=0;
  46.                         printf("\n编译时间:20%d年%d月%d日",(u16)date[0],(u16)date[1],(u16)date[2]);               
  47.                 }
  48.     }
  49. }
  50. void get_date(u8 *date)//获取编译日期
  51. {
  52.     u8 i;
  53.         u8 *tex1="nbrrynlgptvc";
  54.         date[0] = (str_date[9] - '0')*10 +str_date[10] - '0';    //年份
  55.         for(i=0;i<12;i++)
  56.         {
  57.                 if(str_date[2]==tex1[i])
  58.                 {
  59.                         date[1]=i+1;//月份
  60.                         break;
  61.                 }
  62.         }
  63.         if(date[1]==1 && str_date[1]=='u')date[1]=6;//月份
  64.         if(date[1]==3 && str_date[1]=='p')date[1]=4;//月份
  65.         date[2] =( str_date[4] - '0') *10+(str_date[5] - '0'); //日期
  66. }
  67. void IO_Init() // 端口初始化
  68. {
  69.     P0M0 = 0x00;
  70.     P0M1 = 0x00;
  71.     P1M0 = 0x00;
  72.     P1M1 = 0x00;
  73.     P2M0 = 0x00;
  74.     P2M1 = 0x00;
  75.     P3M0 = 0x00;
  76.     P3M1 = 0x00;
  77.     P4M0 = 0x00;
  78.     P4M1 = 0x00;
  79.     P5M0 = 0x00;
  80.     P5M1 = 0x00;
  81. }
  82. void SYS_Init()//系统初始化
  83. {
  84.     IO_Init();//IO口设置
  85.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
  86.     EAXFR = 1; //扩展寄存器(XFR)访问使能
  87.     CKCON = 0; //提高访问XRAM速度  
  88.     Timer0_Init();                //10毫秒
  89.     UART1_config(2);    // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.        
  90.     EA=1;
  91.     LED=1;
  92. }
  93. char putchar(char dat)
  94. {
  95.     while (fBusy);
  96.     fBusy = 1;
  97.     SBUF = dat;
  98.     return dat;
  99. }
  100. void Timer0_Isr(void) interrupt 1
  101. {
  102.         fc++;
  103.         
  104. }
  105. void Timer0_Init(void)        
  106. {
  107.         AUXR &= 0x7F;                        //定时器时钟12T模式
  108.         TMOD &= 0xF0;                        //设置定时器模式
  109.         TL0 = (u8)Timer_val;        //设置定时初始值
  110.         TH0 = Timer_val>>8;                //设置定时初始值
  111.         TF0 = 0;                                //清除TF0标志
  112.         TR0 = 1;                                //定时器0开始计时
  113.         ET0 = 1;                                //使能定时器0中断
  114. }
  115. void UART1_config(u8 brt)  // UART1初始化函数。
  116. {
  117.     if(brt == 2)//波特率使用定时器2
  118.     {
  119.         S1BRT = 1;        //S1 BRT Use Timer2;
  120.          T2R = 0;                //Timer stop
  121.                 T2_CT = 0;        //Timer2 set As Timer
  122.                 T2x12 = 1;        //Timer2 set as 1T mode
  123.                 T2H = (u8)(Baudrate1 / 256);
  124.                 T2L = (u8)(Baudrate1 % 256);
  125.                 ET2 = 0;    //禁止中断
  126.                 T2R = 1;                //Timer run enable
  127.     }
  128.     else //波特率使用定时器1
  129.     {
  130.         TR1 = 0;
  131.         S1BRT = 0;                //S1 BRT Use Timer1;
  132.         T1_CT = 0;                //Timer1 set As Timer
  133.         T1x12 = 1;                //Timer1 set as 1T mode
  134.         TMOD &= ~0x30;//Timer1_16bitAutoReload;
  135.         TH1 = (u8)(Baudrate1 / 256);
  136.         TL1 = (u8)(Baudrate1 % 256);
  137.         ET1 = 0;    //禁止中断
  138.         TR1 = 1;
  139.     }
  140.     /*************************************************/
  141.     SCON = (SCON & 0x3f) | 0x40;    //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
  142. //  PS  = 1;    //高优先级中断
  143.     ES  = 1;    //允许中断
  144.     REN = 1;    //允许接收
  145.     P_SW1 &= 0x3f;
  146.     P_SW1 |= 0x00;      //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7, 0xC0: P4.3 P4.4  
  147. }
  148. void uart_isr() interrupt 4
  149. {
  150.         if(TI)
  151.     {
  152.         TI = 0;
  153.                 fBusy = 0;
  154.     }
  155.         
  156.     if(RI)
  157.     {
  158.         RI = 0;  
  159.     }
  160. }
复制代码
测试串口打印结果:
001.jpg



回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-03 07:38:35
已绑定手机
已实名认证

110

主题

2224

回帖

5470

积分

版主

积分
5470
发表于 2024-11-3 12:59:06 | 显示全部楼层
定时器配置工具的那个下拉框是可以自行输入频率数值的。
下拉选项只是给到了一些常用的值
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:522
  • 最近打卡:2025-05-03 13:32:44

109

主题

1900

回帖

5218

积分

论坛元老

积分
5218
发表于 2024-11-3 13:06:02 | 显示全部楼层
王*** 发表于 2024-11-3 12:59
定时器配置工具的那个下拉框是可以自行输入频率数值的。
下拉选项只是给到了一些常用的值 ...

这个从来都没有用过,所以不知道还可以直接输入数值的。软件延时计算工具也可以吗?

点评

事实上,从功能性来说,下拉框不能将全部状态都列出来的情况,应该是都支持直接输入的。 软件延时小工具也是可以输入自定义主频的  详情 回复 发表于 2024-11-3 13:19
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:460
  • 最近打卡:2025-05-03 07:38:35
已绑定手机
已实名认证

110

主题

2224

回帖

5470

积分

版主

积分
5470
发表于 2024-11-3 13:19:15 | 显示全部楼层
xxkj*** 发表于 2024-11-3 13:06
这个从来都没有用过,所以不知道还可以直接输入数值的。软件延时计算工具也可以吗? ...

事实上,从功能性来说,下拉框不能将全部状态都列出来的情况,应该是都支持直接输入的。
软件延时小工具也是可以输入自定义主频的
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:425
  • 最近打卡:2025-05-03 00:09:43
已绑定手机

77

主题

4850

回帖

8388

积分

超级版主

DebugLab

积分
8388
发表于 2024-11-3 15:26:58 | 显示全部楼层
手动输入,选择总是动态调节IRC频率,必须用串口下载,波特率精度要高,否则会影响频率精度
DebugLab
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-3 15:11 , Processed in 0.231923 second(s), 72 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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