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 }
仿真原理图如下: