第七节课定时器中断
- void Timer0_Init(void) //3秒@24.000MHz
- {
- TM0PS = 0x5B; //设置定时器时钟预分频 ( 注意:并非所有系列都有此寄存器,详情请查看数据手册 )
- AUXR &= 0x7F; //定时器时钟12T模式
- TMOD &= 0xF0; //设置定时器模式
- TL0 = 0x3F; //设置定时初始值
- TH0 = 0x01; //设置定时初始值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
-
- // TM0PS = 0x5B; 91
- // 12T /12
- // TH0 - TL0 = 319
- }
-
- void Timer0_Isr(void) interrupt 1 //3秒执行一次
- {
- state = !state;
- P00 = state;
-
- }
复制代码
- int count; //按键计数变量
-
- if ( P32 == 0 )
- {
- Delay20ms(); //延时20ms消抖
- if (P32 == 0)
- {
- printf("按键按下次数\xfd: %d\r\n", (int)count);
- count++;
-
- while(P32 == 0); //等待P32松开
- }
- }
-
- 定时频率(HZ) = Sysclk(hz)/((TM0PS + 1)*(65536-[TH0,TL0])*T)
- 定时时间(s) = ((TM0PS + 1)(65536-[TH0,TL0])*T)/Sysclk(hz)
- [TH0,TL0] = 65536-(Sysclk(hz) * 定时时间(s))/(T*(TM0PS + 1))
- T = 1或者12.
- 16位自动重载定时器的本质就是从设定值数到65536(溢出)之后置位一次标志位,如果使能ET0就可以进入中断!
复制代码
返回值类型 函数名(入口参数)
{
//函数体
//函数执行的代码
return 返回值;
}
函数的定义、声明、调用
定义:包含返回值,函数名和入口参数,并定义了函数 具体功能
函数的名称应当能够描述函数的功能,便于代码的阅读和理解.
函数名称应当使用有意义的英文单词或者组合的英文单词,避免使用特殊字符或数字。
函数名称不能与C语言的关键字同名。例如if等
返回值类型 函数名(入口参数);
声明: 在头文件或者被调用之前使用,注意末尾要加分号
函数名(入口参数);
调用:在需要调用的地方直接使用函数名,加上括号和分号。
如果有入口参数的,需要在括号的多个参数之间加逗号隔开。
- int count; //按键计数变量
- //任务2:灯按一下点亮三秒后熄灭
- if ( P32 == 0 )
- {
- Delay20ms(); //延时20ms消抖
- if (P32 == 0)
- {
- // printf("按键按下次数\xfd: %d\r\n", (int)count);
- // count++;
- P00 = 0;
- Timer0_Init();
-
-
- while(P32 == 0); //等待P32松开
- }
- }
-
-
- void Timer0_Isr(void) interrupt 1 //3秒执行一次
- {
- // state = !state;
- P00 = 1;
- TR0 = 0; //定时器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开始计时
- }
-
- int count; //按键计数变量
- u8 state = 0; //初始状态
- u8 Run_State = 0; //运行状态
- //任务3:救护车灯控制器,按下报警按钮,红蓝灯交替闪烁(LED1和LED2 表示红和蓝灯),再按一下报警按钮,红蓝灯停止。
- if ( P32 == 0 )
- {
- Delay20ms(); //延时20ms消抖
- if (P32 == 0)
- {
- Run_State = !Run_State; //运行状态取反
-
- if ( Run_State == 1)
- {
- Timer0_Init();
- }
- else
- {
- TR0 = 0; //关闭定时器
- P00 = 1;
- P01 = 1;
- }
- // P00 = 0;
- // Timer0_Init();
- while(P32 == 0); //等待P32松开
- }
- }
-
-
- void Timer0_Isr(void) interrupt 1 //500ms执行一次
- {
- state = !state;
-
- P00 = state;
- P01 = !state
- }
复制代码
定时器一次只能定时一次,如果我有很多个定时任务怎么办?
前后台的方法,用定时器做心跳2.5ms, 在中断中把HeartBeat = 1,,while(1) { if (HeartBeat) { HeartBeat = 0;}}根据定时任务的定时时间来执行,也就是说如果a任务是1s执行一次,if (count1S++>= 400)执行一次a任务count1S = 0;任务b是10s执行一次,if( count10S++ >= 4000) 执行一次任务b |