【第七集】定时中断
以问答的形式引出定时器中断
重点:学会利用ISP软件生成定时函数
定时器需要配置的地方
计算公式
函数的定义声明和调用
这集的内容还是很重要的,慢慢开始变得有点难了,不仅配置的东西越来越多,还要计算。
代码内含《电子功德箱》
- #include "ai8051u.h"
- #include "stc32_stc8_usb.h"
- #include "math.h"
- #include "stdio.h"
-
-
-
- #define u8 unsigned char
- #define u16 unsigned int
-
- u8 state = 0;
- u16 flag = 0;
- u16 count =0;
- u8 bontten_State=0;
-
- /*void Timer0_Init(void) //3秒@24.000MHz
- {
- TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x3F; //设置定时初始值
- TH0 = 0x01; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器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_1sInit(void) //1秒@24.000MHz
- {
- TM0PS = 0x1E; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xFC; //设置定时初始值
- TH0 = 0x03; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
-
- void Timer1_2sInit(void) //2秒@24.000MHz
- {
- TM0PS = 0x3D; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0xFC; //设置定时初始值
- TH0 = 0x03; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
-
-
-
-
- void Delay20ms(void) //@24.000MHz
- {
- unsigned long edata i;
-
- _nop_();
- _nop_();
- i = 119998UL;
- while (i) i--;
- }
-
-
-
- void main()
- {
- WTST = 0;
- EAXFR = 1;
- CKCON = 0;
-
-
- 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;
-
- P40=0;
-
- usb_init(); //USB CDC 接口配置
- //Timer0_Init();
-
- EA = 1;
-
- while (1)
- {
- if (bUsbOutReady)
- {
- // USB_SendData(UsbOutBuffer,OutNumber); //发送数据缓冲区,长度(接收数据原样返回, 用于测试)
- printf_usb("1. Read Num:%d\n", OutNumber);
- printf_usb("2. Read Num:%d\n", OutNumber);
- printf_usb("3. Read Num:%d\n", OutNumber);
- printf_usb("4. Read Num:%d\n", OutNumber);
-
- usb_OUT_done();
- }
- /*任务1:
- if(P32 == 0)
- {
- Delay20ms();
- if(P32 == 0)
- {
- while(P32 == 0);
- printf("按键按下次数\XFD:%d次\r\n",count++);
-
-
- }
- }
- //任务2:灯按一下点亮三秒后熄灭。
- if(P32 == 0)
- {
- Delay20ms();
- if(P32 == 0)
- {
- P00 = 0;
- Timer0_Init();
- while(P32 == 0);
- }
-
- }
- //任务3:救护车灯控制器;按下报警按钮红蓝交替闪烁(LED0和LED1表示红灯和蓝灯),再按一下报警按钮,红蓝灯停止。
- if (P32 == 0)
- {
- Delay20ms();
- if (P32 == 0)
- {
- Run_State = !Run_State;
- if (Run_State == 1 )
- {
- Timer0_Init();
-
- }
- else
- {
- TR0 = 0;
- P00 = 1;
- P01 = 1;
- }
- while (P32 == 0);
- }*/
- /*电子功德箱:
- 1.按下按钮1,串口显示“双倍功德时间”,再次按下显示“单倍功德时间”;
- 2.按下按钮2,双倍功德时间显示“功德+2 当前功德XXX”;
- 3.按下按钮3,单倍功德时间显示“功德+1 当前功德XXX”;
- 4.功德+1时,LED点亮1秒后熄灭表示功德成功点亮;
- 5.功德+2时,LED点亮2秒后熄灭表示功德成功点亮;
- */
- if (P32 == 0)
- {
- Delay20ms();
- if (P32 == 0)
- {
- bontten_State = !bontten_State;
- if( bontten_State == 1)
- {
- printf("双倍功德时间");
- }
- else
- {
- printf("单倍功德时间");
- }
- while(P32 == 0);
-
- }
- }
- if (P33 == 0)
- {
- Delay20ms();
- if (P33 == 0)
- {
- if(bontten_State ==1)
- {
- flag= flag+2;
- P00 = 0;
- Timer1_2sInit();
- printf("功德+2 当前功德%d",flag);
- }
- else
- {
- flag= flag+1;
- P00 = 0;
- Timer0_1sInit();
- printf("功德+1 当前功德%d",flag);
- }
- while(P33 == 0);
- }
- }
-
-
- }
- }
-
-
-
-
- void Timer0_1sIsr(void) interrupt 1
- {
- P00 = 1;
- TR0 = 0;
- }
-
- void Timer1_2sIsr(void) interrupt 3
- {
- P00 = 1;
- TR0 = 0;
- }
-
-
-
复制代码
|