仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
1612663066(1).png (96.41 KB, 下載次數(shù): 54)
下載附件
2021-2-7 10:00 上傳
單片機源程序如下:
- /*溫度控制儀主要材料變壓器(220V-5V) 繼電器、 STC89C52 、74LS145P 、74HC164、兩個三位八段數(shù)碼管。*/
- /*定時開關(guān),可以設(shè)定什么時間啟動,通電保持時間。該程序數(shù)碼管第一位代表小時1-19。10以后的數(shù)字用小數(shù)點代表10。后兩位是分鐘。*/
- /*程序缺點:按鍵按下,數(shù)碼管閃爍。暫未找到解決辦法。另外想讓設(shè)置鍵長按進入設(shè)置,小白一枚不會做,有高手希望指點一番。*/
- #include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
- #define uint unsigned int //
- #define uchar unsigned char //
-
- int xmin=0,xhour=1,smin=10,shour=0;
- int count,sec,min,hour;
- int key_press=1;
- sbit DAT=P3^0;//顯示段(數(shù)字)
- sbit CLK=P3^1;//鎖存
- sbit JDQ=P3^5; //信號輸出-控制繼電器
- sbit KEY=P3^2; //按鍵
- //指示燈
- sbit L1=P0^0; // 設(shè)置 秒閃
- sbit L2=P0^1; // 增加
- sbit L3=P0^2; // 減少
- sbit A=P1^1;
- sbit E=P1^2;
- sbit C=P1^3;
- sbit D=P1^4;
- uchar sm_d[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
- 0xbf,0x96,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,
- 0x77,0x7c,0x39,0x5e,0x79,0x71};
- uint xs[4]; //保持分鐘,保持小時,剩余啟動分鐘/已啟動分鐘、剩余啟動小時/已啟動小時
- //延時函數(shù)
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- //發(fā)送數(shù)據(jù)函數(shù)
- void sendbyte(uchar byte)
- {
- uchar num,c;
- num=sm_d[byte];
- for(c=0;c<8;c++)
- {
- CLK=0;
- DAT=num&0x01;
- CLK=1;
- num>>=1;
- }
- }
- void js()
- {
- int a,b,c;
- a=sec+min*60+hour*60*60; //實時
- b=smin*60+shour*60*60; //變動時間
- c=xmin*60+xhour*60*60; //保持時間
-
-
- if(a<b) //啟動倒計時
- {
- xs[0]=xmin; //下分鐘
- xs[1]=xhour; //下小時
- xs[2]=((b-a)%3600)/60; //上分鐘
- xs[3]=(b-a)/3600; //上小時
- JDQ=1;
- if(key_press==1)
- L2=0;
- else
- L2=1;
- }
- else if((b<a)&&(a<b+c)) //啟動中
- {
- xs[0]=xmin;
- xs[1]=xhour;
- xs[2]=(a-b)%3600/60;
- xs[3]=(a-b)/3600;
- JDQ=0;
- if(key_press==1)
- L3=0;
- else
- L3=1;
- }
- else if(a>b+c)
- {
- xs[0]=0;
- xs[1]=0;
- xs[2]=(a-b-c)%3600/60;
- xs[3]=(a-b-c)/3600;
- JDQ=1;
- L2=1;
- L3=1;
- }
- }
- //正常顯示函數(shù)
- void zcxs(uint wei)
- {
- uint i,j;
- uint zcsmg_num[6];
- js();
-
- zcsmg_num[0]= xs[0]%10;
- zcsmg_num[1]= xs[0]/10;
- zcsmg_num[2]= xs[1];
- zcsmg_num[3]= xs[2]%10;
- zcsmg_num[4]= xs[2]/10;
- zcsmg_num[5]= xs[3];
-
- for(i=0;i<6;i++)
- {
- switch(wei)
- {
- case 2:if((i==0)||(i==1)){j++;if(j<30)continue;else if(j>60)j=0;};break;
- case 3:if(i==2){j++;if(j<30)continue;else if(j>60)j=0;};break;
- case 4:if((i==3)||(i==4)){j++;if(j<30)continue;else if(j>60)j=0;};break;
- case 5:if(i==5){j++;if(j<30)continue;else if(j>60)j=0;};break;
- }
-
- switch(i)
- {
- case 0: A=0;E=0;C=0;D=0;sendbyte(zcsmg_num[0]);delay(2);break; //下右
- case 1: A=1;E=0;C=0;D=0;sendbyte(zcsmg_num[1]);delay(2);break;
- case 2: A=0;E=1;C=0;D=0;sendbyte(zcsmg_num[2]);delay(2);break;
- case 3: A=0;E=0;C=1;D=0;sendbyte(zcsmg_num[3]);delay(2);break; //上右
- case 4: A=1;E=0;C=1;D=0;sendbyte(zcsmg_num[4]);delay(2);break;
- case 5: A=0;E=1;C=1;D=0;sendbyte(zcsmg_num[5]);delay(2);break;
- }
- }
- }
- void Time0 (void) interrupt 1 using 1 //定時0中斷函數(shù)
- {
- TH0=(65536-20000)/256; //0XEC
- TL0=(65536-20000)%256; //0X78
- count++;
- if(count<25)
- L1=0; //設(shè)置燈秒閃
- else
- L1=1;
- if(count==50)
- {
- sec++;
- count=0;
- if(sec==60)
- {
- min++;
- sec=0;
- if(min==60)
- {
- hour++;
- min=0;
- if(hour==39) //
- {
- hour=0;
- min=0;
- sec=0;
- }
- }
- }
- }
- }
- void init()
- {
- JDQ=1; //繼電器高電平;
- L1=1;
- L2=1;
- L3=1;
- KEY=1;
-
- TMOD=0x01; //定時器T0工作于方式1,采用12M晶振,定時20ms
- TH0=(65536-20000)/256; //0XEC
- TL0=(65536-20000)%256; //0X78
-
- TR0 = 1; //定時器0開始計時
- ET0=1; //開定時器0中斷
-
- EA=1; //開總中斷
-
- }
- void key_scan()
- {
- uint i;
- for(i=6;i<9;i++)
- {
- switch(i)
- {
- case 6: A=1;E=1;C=1;D=0;delay(5);break; //按鍵
- case 7: A=0;E=0;C=0;D=1;delay(5);break;
- case 8: A=1;E=0;C=0;D=1;delay(5);break;
- }
-
- if(KEY==0)
- {
- delay(150);
- if((KEY==0)&&(i==6))
- {
- key_press++;
- if(key_press>5)
- key_press=1;
- }
- if(key_press!=1)
- {
- TR0=0;
- sec=0;
- min=0;
- hour=0;
- L1=0;
- }
- else
- {
- TR0=1;
- }
- if((KEY==0)&&(i==7)&&(key_press!=1))
- {
- L2=0;
- delay(100);
- switch(key_press%6)
- {
- case 2:xmin++;if(xmin>59)xmin=0;break;
- case 3:xhour++;if((xhour>19)&&(xmin==0)){xhour=0;xmin=5;}else if(xhour>19)xhour=0;break;
- case 4:smin++;if(smin>59)smin=0;break;
- case 5:shour++;if((shour>19)&&(smin==0)){shour=0;smin=5;}else if(shour>19)shour=0;break;
-
- }
- L2=1;
- }
- else if((KEY==0)&&(i==8)&&(key_press!=1))
- {
- L3=0;
- delay(100);
- switch(key_press%6)
- {
- case 2:xmin--;if(xmin<0)xmin=59;break;
- case 3:xhour--;if((xhour==0)&&(xmin==0)){xhour=0;xmin=10;}else if(xhour<0)xhour=19;break;
- case 4:smin--;if(smin<0)smin=59;break;
- case 5:shour--;if((shour==0)&&(smin==0)){shour=0;smin=5;}else if(shour<0)shour=19;break;
- }
- L3=1;
- }
- }
- else
- {
- zcxs(key_press);
- }
- }
- }
- void main()
- {
- init();
- while(1)
- {
- key_scan();
- }
- }
復(fù)制代碼
51hei.png (4.91 KB, 下載次數(shù): 65)
下載附件
2021-2-7 15:32 上傳
Proteus仿真文件下載:
定時開關(guān)仿真.rar
(88.64 KB, 下載次數(shù): 15)
2021-2-7 10:13 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|