基于单片机的心型LED灯的设计与实现

  1 #include<reg51.h>
  2 #include<intrins.h>
  3 #define char unsigned char
  4 #define unit unsigned int
  5 sbit k1=P3^2;//定义开始键
  6 sbit k2=P3^3;//定义暂停键
  7 sbit k3=P3^4;//定义模式切换
  8 sbit k4=P3^5; //定义速度切换
  9 void disp1();
 10 void disp2();
 11 void disp3();
 12 void typeqiehuan();
 13 void speedqiehuan();
 14 unit speed=1000;unit type=0;unit time=0;unit count=0;
 15 int flag1=0;
 16 void delay(unit s)
 17 {
 18     unit x,y;
 19     for(x=s;x>0;x--)
 20     for(y=110;y>0;y--);
 21     while(flag1==1); //毫秒级
 22 }
 23 void disp1()
 24 {    
 25     unit i;
 26     P1=P0=0x00;
 27     delay(5000);
 28     /*P1=P0=0x00;
 29     delay(1000);
 30     P1=P0=0x00;
 31     delay(1000);
 32     P1=P0=0x00;
 33     delay(1000);
 34     P1=P0=0x00;
 35     delay(1000);
 36     P1=P0=0x00;
 37     delay(1000);*/
 38     P1=P0=0xff;
 39     for(i=0;i<5;i++)
 40     {
 41         P1=P0=0x00;
 42         delay(500);
 43         P1=P0=0xff;
 44         delay(500);
 45     }
 46 }
 47 
 48 void disp2()
 49 {
 50     P1=0xff;
 51     P0=0x00;
 52     delay(speed);
 53     /*if(k2==0)
 54         while(1)//如果检测K2按下,死循环
 55     ;      
 56     else */if(k2==1)
 57         goto l;
 58     l:P1=0x00;
 59     P0=0xff;
 60     delay(speed);
 61 }
 62 
 63 void disp3()
 64 {
 65     P1=0x33;
 66     P0=0xCC;
 67     delay(speed);
 68 /*    if(k2==0)
 69         while(1)
 70     ;
 71     else */if(k2==1)
 72         goto m;
 73     m:P1=0xCC;
 74     P0=0x33;
 75     delay(speed);
 76 }
 77 
 78 
 79 void typeqiehuan()
 80 {
 81     while(1)
 82     {
 83         while(k2==0);
 84         if(type%2==0)
 85             disp2();
 86         if(type%2==1)
 87             disp3();
 88     }
 89 }
 90 void speedqiehuan()
 91 {
 92     //while(1)
 93     //{
 94         //while(k4==0)
 95         if(time%4==0)
 96             speed=1000;
 97         else if(time%4==1) 
 98             speed=500;
 99         else if(time%4==2) 
100             speed=300;
101         else if(time%4==3) 
102             speed=100;
103     //}
104 }
105 
106 void T0_INT() interrupt 0 
107 {
108     typeqiehuan();
109 }
110 void T1_INT() interrupt 2
111 {
112     count++;    
113     if(count%2==1)
114         flag1=1;
115     else
116         flag1=0;
117 } 
118 void T0_TIME() interrupt 1
119 {
120    TH0=(65536-5000)/256;//取高八位,算初值
121    TL0=(65536-5000)%256;//取低八位,算初值
122      if(k3==0) 
123      {     
124          delay(10); //防抖
125               if(k3==0)
126         type++;
127      }
128      if(k4==0) 
129      {      
130          delay(10);
131              if(k4==0)
132         time++;
133      }
134      speedqiehuan();
135 }
136 void main()
137 {
138     disp1();
139     //P0=0xff;
140     //P1=0xff;
141     //delay(5000);
142     TMOD=0x01;//T0为工作方式一
143     IT0 = 1;//TCON中控制INT0触发方式位,INT0下降沿触发中断
144     IT1 = 1;  
145     EA = 1; //总中断允许控制位  
146     EX0 = 1; //允许外部中断INT0
147     EX1 = 1; //允许外部中断INT1
148     ET0=1;//允许计数器T0溢出中断
149     TH0=(65536-5000)/256;
150     TL0=(65536-5000)%256;
151     TR0=1;//立即开始计数
152     IP=0x06;//设置优先级
153     while(1) //等待人来操作,防止程序过快跑完
154     {
155         P1=P0=0x00;
156     }
157 }

仿真原理图如下:

猜你喜欢

转载自www.cnblogs.com/shuaipengpeng/p/12358628.html