| 
				打卡等级:偶尔看看I打卡总天数:18最近打卡:2025-08-29 08:38:20  已绑定手机高级会员 
 
 
	积分640 
 | 
 
 发表于 2025-1-16 10:24:33
|
显示全部楼层 
| 第7集 擎天柱定时器中断,测试通过: 1,编译图片:
   2,学习图片:
 3,源代码:
 
 #include "AI8051U.h"
 #include "AI_usb.h"
 #include "intrins.h"
 
 #define u8  unsigned char
 #define u16 unsigned int
 
 u8 state=0;
 u8 Run_State=0;       //运行状态
 
 char *USER_DEVICEDESC = NULL;
 char *USER_PRODUCTDESC = NULL;
 char *USER_STCISPCMD = "@STCISP#";
 
 void Delay20ms(void)        //@24.000MHz  Delay20ms();
 {
 unsigned long edata i;
 
 _nop_();
 _nop_();
 i = 119998UL;
 while (i) i--;
 }
 void Timer0_Init(void);                //3秒@24.000MHz                //函数声明
 
 void main(void)
 {
 int count=1;                                                                        //按键计数变量
 
 WTST = 0;                                                                                  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
 EAXFR = 1;                                                                                 //扩展寄存器(XFR)访问使能
 CKCON = 0;                                                                                 //提高访问XRAM速度
 
 P0M1 = 0x00;   P0M0 = 0x00;
 P1M1 = 0x00;   P1M0 = 0x00;
 P2M1 = 0x00;   P2M0 = 0x00;
 P3M1 = 0x00;   P3M0 = 0x00;
 P4M1 = 0x00;   P4M0 = 0x00;
 P5M1 = 0x00;   P5M0 = 0x00;
 P6M1 = 0x00;   P6M0 = 0x00;
 P7M1 = 0x00;   P7M0 = 0x00;
 
 usb_init();
 
 IE2 |= 0x80;
 
 EA = 1;
 
 P40 = 0;
 
 while (DeviceState != DEVSTATE_CONFIGURED);
 
 while(1)
 {
 
 if (bUsbOutReady)
 {
 //USB_SendData(UsbOutBuffer,OutNumber);   //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
 
 usb_OUT_done();                                                        //
 }
 
 
 if( P32 == 0 )
 {
 Delay20ms();                                                        //延时20ms消抖
 if( P32 == 0 )
 {
 
 P20 = 0;
 Timer0_Init();
 while( P32 == 0 );
 
 }
 }
 
 //
 //任务:救护车灯控制器
 if( P32 == 0 )
 {
 Delay20ms();                                                        //延时20ms消抖
 if( P32 == 0 )
 {
 Run_State = !Run_State;                                //运行状态取反
 
 if( Run_State==1 )
 {
 Timer0_Init();
 }
 else
 {
 TR0 = 0;
 P20 = 1;
 P21 = 1;
 }
 while( P32 == 0 );
 
 }
 }
 
 }
 }
 
 
 
 void Timer0_Init(void)                //500毫秒@24.000MHz
 {
 TM0PS = 0x0F;                        //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
 AUXR &= 0x7F;                        //定时器时钟12T模式
 TMOD &= 0xF0;                        //设置定时器模式
 TL0 = 0xDC;                                //设置定时初始值
 TH0 = 0x0B;                                //设置定时初始值
 TF0 = 0;                                //清除TF0标志
 TR0 = 1;                                //定时器0开始计时
 ET0 = 1;                                //使能定时器0中断
 }
 
 void Timer0_Isr(void) interrupt 1                //3秒执行一次
 {
 state = !state;
 
 P20 = state;
 P21 = !state;
 }
 
 
 | 
 |