可以实现闪烁、轮流点亮和逐个点亮,但暂停不行(实物不能暂停,仿真可以),求大佬改一下。
- #include<reg52.h>
- #define uchar unsigned char
- #define unit unsigned int
- void delay_ms(unsigned int);
- sbit LED1=P0^0;
- sbit LED2=P0^1;
- sbit LED3=P0^2;
- sbit LED4=P0^3;
- sbit LED5=P0^4;
- sbit LED6=P0^5;
- sbit LED7=P0^6;
- sbit LED8=P0^7;
- sbit LED9=P2^0;
- sbit LED10=P2^1;
- sbit LED11=P2^2;
- sbit LED12=P2^3;
- sbit LED13=P2^4;
- sbit LED14=P2^5;
- sbit LED15=P2^6;
- sbit LED16=P2^7;
- sbit K=P3^4;
- sbit T=P1^0;
- sbit K1=P3^5;
- uchar num,num1;
- uchar loopled=0xfe;
- uchar flag=0;
- uchar code table0[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
- void init (){
- TMOD = 0x00; //定时器T0工作方式1
- TH0=(65536-50000)/256; //TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //TL0=(65536-50000)%256;
- EA=1;
- ET0=1;
- // TR0=1;
- }
- void init1(){
- TMOD = 0x10; //定时器T0工作方式1
- TH0=(65536-50000)/256; //TH0=(65536-50000)/256;
- TL0=(65536-50000)%256; //TL0=(65536-50000)%256;
- EA=1;
- ET1=1;
- //TR1=1;
- }
- void main(void){
- int i;
- IT0 = 1; //设外部中断0为边缘触发
- EX0 = 1; //开外部中断0
- EA = 1; //开总中断
- IT1=1; //开外部中断INT1
- EX1=1; //开外部中断
- init1();
- init();
- while(1){
- if(K==0){//控制轮流点亮的开启
- TR0=1;
- }
- if(K1==0){//控制闪烁的开启
- TR1=1;
- }
-
-
- if(num==20){//轮流点亮程序
- num=0; //num清零
- for(i=0;i<8;i++){
- P0=table0[i]; //
- delay_ms(100);
- P0=0XFF; //关闭最后一盏灯
- }
- for(i=0;i<8;i++){
- P2=table0[i];
- delay_ms(100);
- P2=0XFF; //关闭最后一盏灯
- }
- }
- if(num1==20){//闪烁程序
- num1=0; //num1清零
-
- LED1=~LED1; //将全部端口取反,实现闪烁功能
- LED2=~LED2;
- LED3=~LED3;
- LED4=~LED4;
- LED5=~LED5;
- LED6=~LED6;
- LED7=~LED7;
- LED8=~LED8;
- LED9=~LED9;
- LED10=~LED10;
- LED11=~LED11;
- LED12=~LED12;
- LED13=~LED13;
- LED14=~LED14;
- LED15=~LED15;
- LED16=~LED16;
-
- }
- }
- while(1);
- }
- int0() interrupt 0 { //暂停
- delay_ms(200);
- ET0=~ET0; //将开启中断的端口取反
- ET1=~ET1;
- EX1=~EX1;
- }
-
- int1() interrupt 2 //逐个点亮
- {
- P0=loopled;//点亮P0组第一个灯
- P2=0xFF; //关闭P2组
- loopled=loopled<<1; //循环左移
- loopled=loopled|1; // 最右补1,防止点亮最后一个LED
- if (loopled==0xff) {
- flag++;// 一路循环完成场合,指向下一组
- loopled=0xFE; // 下一组最后一个LED点亮
- if (flag==2) { // 两组组循环完成了,重新指向第一组
- flag=0;
- }
- }
- switch(flag) { // 根据FLAG的情况开启/关闭P0/P2组
- case 0:// P0组
- P2=0xFF; // 关闭P2组
- P0=loopled;
- break;
- case 1:// P2组
- P0=0xFF; // 关闭P0组
- P2=loopled;
- break;
- }
- }
-
- time0() interrupt 3{//设定初值
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- num1++;
-
-
- }
- time1() interrupt 1{
- TH0=(65536-50000)/256; //设定初值
- TL0=(65536-50000)%256;
- num++;
-
-
- }
- void delay_ms(unsigned int dt)//延时函数
- {
- register unsigned char bt,ct;
- for (;dt;dt--)
- for (ct=2;ct;ct--)
- for (bt=250;--bt;);
- }
复制代码
附上完整代码
|