- #include
-
- sbit button1 = P1^1; // 间隔2秒的按钮
- sbit button2 = P1^5; // 间隔0.6秒的按钮
-
- sbit led = P1^3;
-
- unsigned int cnt1 = 0; // 设置LED1灯的定时器溢出次数
- unsigned int cnt2 = 0; // 设置LED2灯的定时器溢出次数
- unsigned int flg1 = 0; // 模式1的标识值
- unsigned int flg2 = 0; // 模式2的标识值
- unsigned int flg = 0; // 选择模式方式 1或者2
-
- // 模式1灯的闪烁逻辑
- void enableled(){
- if(TF0) // 定时器T0溢出
- {
- TF0 = 0; // 清除溢出标志
- TH0 = 0xB8; // 设置重置值,定时1s
- TL0 = 0x00;
- cnt1++;
- // 间隔 0.02*100 = 2秒
- if(cnt1 > 100){
- cnt1 = 0;
- led = !led; // 翻转LED1状态
- }
- }
- }
- // 模式2灯的闪烁模式
- void enableled2(){
- if(TF1) // 定时器T1溢出
- {
- TF1 = 0; // 清除溢出标志
- TH1 = 0xB8; // 设置重置值;
- TL1 = 0x00;
- cnt2++;
- // 间隔 0.02*30 = 0.6秒
- if(cnt2 > 30){
- cnt2 = 0;
- led = !led; // 翻转LED1状态
- }
- }
- }
-
- // 定时器T0
- void Init_Timer0()
- {
- TMOD |= 0x01;; // 定时器T0工作在模式1
- TH0 = 0xB8; // 设置重置值,高位 定时0.02秒 a = 1/11.0592(时钟周期) b = 12* a (机器周期) (256*256 -1) - ( 0.02 / b )
- TL0 = 0x00; //设置重置值,低位
- TR0 = 1; // 启动T0
-
- }
-
- // 定时器T1
- void Init_Timer1()
- {
- TMOD |= 0x10;; // 定时器T1工作在模式1
- TH1 = 0xB8; // 设置重置值,高位 定时0.02秒 a = 1/11.0592(时钟周期) b = 12* a (机器周期) (256*256 -1) - ( 0.02 / b )
- TL1 = 0x00; //设置重置值,低位
- TR1 = 1; // 启动T0
-
- }
-
- void main(){
-
-
- while(1){
- // 当按钮1按下时, 使用的上拉电阻模式
- if(button1 == 0) {
- flg1 = 1; // 按钮1的flg初始值为1;
- flg2 = 3; // 按钮2的flg置为3;
- flg = 1; // 当前的运行模式是1;
- } else {
- flg1 = 2; // 如果按钮1没有按下,就设状态是2;
- }
- // flg1状态是1时,初始化T0;
- if(flg1 == 1){
- Init_Timer0();
- // flg1状态是2 时,并且没有启用按钮2;让灯按照模式1闪烁;
- } else if (flg1 == 2 && flg == 1) {
- enableled();
- // 其他状态不需要闪烁
- } else {
- ;
- }
- // 当按钮2按下时
- if(button2 == 0) {
- flg2 = 1; // 按钮2的flg初始值为1;
- flg1 = 3; // 按钮1的flg置为3;
- flg = 2; // 当前的运行模式是2;
- } else {
- flg2 = 2; // 如果按钮2没有按下,就设状态是2;
- }
- // flg2状态是1时,初始化T1;
- if(flg2 == 1){
- Init_Timer1();
- // flg2状态是2 时,并且没有启用按钮1;让灯按照模式2闪烁;
- } else if (flg2 == 2 && flg == 2){
- enableled2();
- // 其他状态不需要闪烁
- } else {
- ;
- }
-
- }
-
- }