/*---------------------------------------------------- 名称:用定时器控制led亮灭 单片机:stc12c2052 晶振:12M 说明:四个led,一个亮一秒,跑马灯。 ------------------------------------------------------*/ #include<reg52.h> //头文件 sbit LED1=P1^0; sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; #define LED1_ON {LED1 = 0;} #define LED2_ON {LED2 = 0;} #define LED3_ON {LED3 = 0;} #define LED4_ON {LED4 = 0;} #define ALL_OFF {LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;} void Init_Timer0(void) //初始化定时器0 { TMOD=0x01; //定时器0,使用模式1,16位定时器 TH0=(65536-1000)/256; //给定初值 TL0=(65536-1000)%256; EA=1; //打开总中断 ET0=1; //打开定时器中断 TR0=1; //开定时器 } void main() //主函数 { Init_Timer0(); LED1 = 0; while(1) { } } void Timer0_isr(void) interrupt 1 { static unsigned short int count = 0; static char index = 0; TH0=(65536-1000)/256;//重新赋值 1ms TL0=(65536-1000)%256; EA = 0; ++count; if(count == 1000) { ++index; index &= 0x03; ALL_OFF; switch(index){ case 0: LED1_ON; break; case 1: LED2_ON; break; case 2: LED3_ON; break; case 3: LED4_ON; break; default: break; } count = 0; } EA = 1; } stc_01_1.c 觉得switch语句太丑了,想改成根据序号,点亮不同的灯,但点灯的变量是sbit ,C51不支持sbit数组。 想了想,把点灯动作写成函数,四个灯四个函数,函数指针数组,这个支持。 /*---------------------------------------------------- 名称:用定时器控制led亮灭 单片机:stc12c2052 晶振:12M 说明:四个led,一个亮一秒,跑马灯。 ------------------------------------------------------*/ #include<reg52.h> //头文件 typedef void (*pFun)(void); sbit LED1=P1^0; sbit LED2=P1^1; sbit LED3=P1^2; sbit LED4=P1^3; #define LED1_ON {LED1 = 0;} #define LED2_ON {LED2 = 0;} #define LED3_ON {LED3 = 0;} #define LED4_ON {LED4 = 0;} #define ALL_OFF {LED1 = 1;LED2 = 1;LED3 = 1;LED4 = 1;} void set_led1_on(void) { LED1_ON; } void set_led2_on(void) { LED2_ON; } void set_led3_on(void) { LED3_ON; } void set_led4_on(void) { LED4_ON; } const pFun led_on[4] = {set_led1_on,set_led2_on,set_led3_on,set_led4_on}; //const void (*led_on[4])(void) = {set_led1_on,set_led2_on,set_led3_on,set_led4_on}; void Init_Timer0(void) //初始化定时器0 { TMOD=0x01; //定时器0,使用模式1,16位定时器 TH0=(65536-1000)/256; //给定初值 TL0=(65536-1000)%256; EA=1; //打开总中断 ET0=1; //打开定时器中断 TR0=1; //开定时器 } void main() //主函数 { Init_Timer0();//初始化定时器0 LED1 = 0; //开第一个灯 while(1) { } } //定时器中断函数,1ms 定时。 void Timer0_isr(void) interrupt 1 { static unsigned short int count = 0; static char index = 0; TH0=(65536-1000)/256;//重新赋值 1ms TL0=(65536-1000)%256; EA = 0; ++count; if(count == 1000) //到 1 秒了 { ++index; //点灯序号 index &= 0x03; //四个灯,序号0~3 ALL_OFF; //全关灯 (*led_on[index])(); //打开序号对应灯 count = 0; // 1秒计数开始。1s = 1000ms。 } EA = 1; } stc_01_2.c 后来想到虽然sbit数组不支持,但是我可以不单个控制灯,而是四个灯一起控制,P1口可以用char赋值,char数组是支持的,改成下面这样: /*---------------------------------------------------- 名称:用定时器控制led亮灭 单片机:stc12c2052 晶振:12M 说明:四个led,一个亮一秒,跑马灯。 ------------------------------------------------------*/ #include<reg52.h> //头文件 typedef void (*pFun)(void); const unsigned char led_port[4] = {0xFE,0xFD,0xFB,0xF7}; void Init_Timer0(void) //初始化定时器0 { TMOD=0x01; //定时器0,使用模式1,16位定时器 TH0=(65536-1000)/256; //给定初值 TL0=(65536-1000)%256; EA=1; //打开总中断 ET0=1; //打开定时器中断 TR0=1; //开定时器 } void main() //主函数 { Init_Timer0();//初始化定时器0 P1 = 0xFE; //开第一个灯 while(1) { } } //定时器中断函数,1ms 定时。 void Timer0_isr(void) interrupt 1 { static unsigned short int count = 0; static char index = 0; TH0=(65536-1000)/256;//重新赋值 1ms TL0=(65536-1000)%256; EA = 0; ++count; if(count == 1000) //到 1 秒了 { ++index; //点灯序号 index &= 0x03; //四个灯,序号0~3 P1 = led_port[index]; count = 0; // 1秒计数开始。1s = 1000ms。 } EA = 1; }
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
22
136
1
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号