設計一樓道觸摸延時開關控制器,其功能是當人用手觸摸開關時,照明燈點亮,并持續一段時間后自動熄滅。開關的延時時間可設置并有顯示。
觸摸即是按鍵開關,程序出現了錯誤,為什么一次加就是加50s.數字太大會亂。
51hei圖片20210618154332.jpg (270.59 KB, 下載次數: 25)
下載附件
2021-6-18 15:43 上傳
程序如下:
- #include <reg51.h>
- #define uchar unsigned char
- uchar ledtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
- uchar KEY,keyval,dat[2],sec,num,tick,time;
- sbit D1=P1^0;
- sbit D2=P1^1;
- void delay(uchar x)
- {
- uchar i,j;
- for(i=0;i<x;i++)
- for(j=0;j<125;j++);
- }
- void dischg()
- {
- dat[0]=time/10;
- dat[1]=time%10;
- }
- void getkey(void)
- {
- keyval=0xff;
- KEY=P3&0x0f;
- if(KEY!=0xf)
- {
- delay(10);
- KEY=P3&0x0f;
- if(KEY!=0x0f)
- {
- switch(KEY)
- {
- case 0x0e:
- while(P3&0x0f==0x0e);
- keyval=1;
- break;
- case 0x0d:
- while(P3&0x0f==0x0d);
- keyval=2;
- break;
- case 0x0b:
- while(P3&0x0f==0x0b);
- keyval=3;
- break;
- case 0x07:
- while(P3&0x0f==0x07);
- keyval=4;
- break;
- default:break;
- }
- }
- }
- }
- void t0_isr() interrupt 1
- {
- TR0=0;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TR0=1;
- tick++;
- if(tick>=20)
- {
- tick=0;
- if(time>0)time--;
- else
- {
- D1=0;
- D2=0;
- TR0=0;
- time=sec;
- }
- dischg();
- }
- }
- t1_isr() interrupt 3
- {
- TR1=0;
- TH1=(65536-5000)/256;
- TL1=(65536-5000)%256;
- TR1=1;
- if(num)P2=0x01;
- else P2=0x02;
- P0=~ledtab[dat[num]];
- num++;
- num&=0x01;
- }
- main()
- {
- TMOD=0x11;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- TH1=(65536-5000)/256;
- TL1=(65536-5000)%256;
- dat[0]=0x00;
- dat[1]=0x05;
- tick=0;
- sec=5;
- time=5;
- // dischg();
- TR0=0;
- ET0=1;
- TR1=1;
- ET1=1;
- D1=0;
- D2=0;
- EA=1;
- while(1)
- {
- getkey();
- switch(keyval)
- {
- case 1:
- TR0=0;
- sec++;
- time=sec;
- dischg();
- break;
- case 2:
- TR0=0;
- if(sec>1)sec--;
- time=sec;
- dischg();
- break;
- case 3:
- D1=1;
- D2=0;
- TR0=1;
- time=sec;
- dischg();
- break;
- case 4:
- D1=0;
- D2=1;
- TR0=1;
- time=sec;
- dischg();
- break;
- default:break;
- }
- }
- }
復制代碼
|