捕獲.PNG (57.79 KB, 下載次數: 54)
下載附件
2019-6-17 14:27 上傳
可以實現閃爍、輪流點亮和逐個點亮,但暫停不行(實物不能暫停,仿真可以),求大佬改一下。
- #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;);
- }
復制代碼
附上完整代碼
|