本帖最后由 DebugLab 于 2024-11-3 15:24 编辑
首先得感谢AI公司!
用积分兑换的AI8051U早收到了。
今天才能开始测试。
任何一种芯片拿到手,最先测试的是点灯,AI8051U也不例外。
本次测试IRC频率选择44.2368MHz,串口波特率仍然是115200。
定时器设置因为ISP中没有44.2368MHz选项(建议AIapp-ISP后续版本予以增加),所以只能采用公式自适应计算初始值结果。
本次测试除了点灯外,还利用宏定义__DATE__获取编译日期并转化为数据型打印到串口。
代码如下,请大家多多指教,谢谢!
- /*
- 芯片:STC8051U-34K64
- IRC频率:44.2368MHz
- 波特率:115200
- 功能:打印程序编译日期(转化为数据型)
-
- 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
- edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
- 参考:AI8051U-DEMO-CODE-V1.2范例 中 的 10-串口1中断模式与电脑收发测试
- */
-
- #include "AI8051U.h"
- #include "stdio.h"
- #include "intrins.h"
-
- typedef unsigned char uchar;
- typedef unsigned int uint;
- typedef unsigned long ulong;
- typedef unsigned char u8;
- typedef unsigned int u16;
- typedef unsigned long u32;
-
- #define LED P35
-
- //#define MAIN_Fosc 22118400L //定义主时钟(精确计算115200波特率)
- //#define MAIN_Fosc 33177600L //定义主时钟(精确计算115200波特率)
- #define MAIN_Fosc 44236800L //定义主时钟(精确计算115200波特率)
- #define Baudrate1 (65536 - MAIN_Fosc / 115200 / 4)
- #define Timer_ms 10 //定时器定时时间
- #define Timer_val (65536 - Timer_ms*MAIN_Fosc/12/1000 )
- bit fBusy=0;
- u32 fc;
-
- const u8 str_date[12] = __DATE__; //
- const u8 str_time[10] = __TIME__;
-
- void UART1_config(u8 brt); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- void IO_Init();
- void Timer0_Init(void); //10毫秒
- void SYS_Init();
- void get_date(u8 *date);
-
- void main(void)
- {
- u8 date[3];
- SYS_Init();
- get_date(date);
- while (1)
- {
- if(fc>99)
- {
- LED=~LED;
- fc=0;
- printf("\n编译时间:20%d年%d月%d日",(u16)date[0],(u16)date[1],(u16)date[2]);
-
- }
-
- }
- }
-
- void get_date(u8 *date)//获取编译日期
- {
- u8 i;
- u8 *tex1="nbrrynlgptvc";
- date[0] = (str_date[9] - '0')*10 +str_date[10] - '0'; //年份
- for(i=0;i<12;i++)
- {
- if(str_date[2]==tex1[i])
- {
- date[1]=i+1;//月份
- break;
- }
- }
- if(date[1]==1 && str_date[1]=='u')date[1]=6;//月份
- if(date[1]==3 && str_date[1]=='p')date[1]=4;//月份
- date[2] =( str_date[4] - '0') *10+(str_date[5] - '0'); //日期
- }
-
-
-
- void IO_Init() // 端口初始化
- {
- P0M0 = 0x00;
- P0M1 = 0x00;
- P1M0 = 0x00;
- P1M1 = 0x00;
- P2M0 = 0x00;
- P2M1 = 0x00;
- P3M0 = 0x00;
- P3M1 = 0x00;
- P4M0 = 0x00;
- P4M1 = 0x00;
- P5M0 = 0x00;
- P5M1 = 0x00;
- }
-
- void SYS_Init()//系统初始化
- {
- IO_Init();//IO口设置
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
- Timer0_Init(); //10毫秒
- UART1_config(2); // 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
- EA=1;
- LED=1;
- }
-
- char putchar(char dat)
- {
- while (fBusy);
- fBusy = 1;
- SBUF = dat;
- return dat;
- }
-
- void Timer0_Isr(void) interrupt 1
- {
- fc++;
-
- }
-
- void Timer0_Init(void)
- {
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = (u8)Timer_val; //设置定时初始值
- TH0 = Timer_val>>8; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
-
-
- void UART1_config(u8 brt) // UART1初始化函数。
- {
- if(brt == 2)//波特率使用定时器2
- {
- S1BRT = 1; //S1 BRT Use Timer2;
- T2R = 0; //Timer stop
- T2_CT = 0; //Timer2 set As Timer
- T2x12 = 1; //Timer2 set as 1T mode
- T2H = (u8)(Baudrate1 / 256);
- T2L = (u8)(Baudrate1 % 256);
- ET2 = 0; //禁止中断
- T2R = 1; //Timer run enable
- }
- else //波特率使用定时器1
- {
- TR1 = 0;
- S1BRT = 0; //S1 BRT Use Timer1;
- T1_CT = 0; //Timer1 set As Timer
- T1x12 = 1; //Timer1 set as 1T mode
- TMOD &= ~0x30;//Timer1_16bitAutoReload;
- TH1 = (u8)(Baudrate1 / 256);
- TL1 = (u8)(Baudrate1 % 256);
- ET1 = 0; //禁止中断
- TR1 = 1;
- }
- /*************************************************/
-
- SCON = (SCON & 0x3f) | 0x40; //UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
- // PS = 1; //高优先级中断
- ES = 1; //允许中断
- REN = 1; //允许接收
- P_SW1 &= 0x3f;
- 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
-
- }
-
- void uart_isr() interrupt 4
- {
- if(TI)
- {
- TI = 0;
- fBusy = 0;
- }
-
- if(RI)
- {
- RI = 0;
- }
- }
-
-
复制代码
测试串口打印结果:
|