- #include "reg52.h"
- unsigned int hour = 2, min = 2, sec = 3; //設置時間初值
- unsigned int ahour = 0, amin = 0, asec = 0; //設置鬧鐘初值
- sbit k1 = P3^1; //修改時間
- sbit k2 = P3^0; //設置鬧鐘
- sbit k3 = P3^2; //加1
- sbit k4 = P3^3; //減1
- sbit DSPORT=P3^7;
- sbit beep=P1^5;
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- unsigned int keyvalue = 0;
- unsigned int settype = 0; //0是初始狀態(tài)正常顯示,1是修改秒,2是修改分,3是修改時
- unsigned int alarmvalue = 0; //0是初始狀態(tài),1是修改秒,2是修改分,3是修改時
- unsigned char Show[8] = {0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};
- unsigned char code TableCC[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- int b = 0;
- float tp=0;
- int temp=0;
- int c1=0;c2=0;
- void delay(unsigned char i)
- {
- while(i--);
- }
- void delay_us(unsigned char t)
- {
- while(--t);
- }
- void delay_ms(unsigned int t) //t最大為255
- {
- while(t--)
- {
- delay_us(245);
- delay_us(245);
- }
- }
- unsigned char Ds18b20Init() //Ds18b20Init初始化
- {
- unsigned int i;
- DSPORT=0; //將總線拉低480us~960us
- i=70;
- while(i--);//延時642us
- DSPORT=1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i=0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- i++;
- if(i>5000)//等待>5MS
- return 0;//初始化失敗
- }
- return 1;//初始化成功
- }
- void Ds18b20WriteByte(unsigned char dat) //Ds18b20WriteByte 向18B20寫入一個字節(jié)
- {
- unsigned int i,j;
- for(j=0;j<8;j++)
- {
- DSPORT=0; //每寫入一位數(shù)據(jù)之前先把總線拉低1us
- i++;
- DSPORT=dat&0x01; //然后寫入一個數(shù)據(jù),從最低位開始
- i=6;
- while(i--); //延時68us,持續(xù)時間最少60us
- DSPORT=1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數(shù)值
- dat>>=1;
- }
- }
- unsigned char Ds18b20ReadByte() //向18B20讀取一個字節(jié)
- {
- unsigned char byte,bi;
- unsigned int i,j;
- for(j=8;j>0;j--)
- {
- DSPORT=0;//先將總線拉低1us
- i++;
- DSPORT=1;//然后釋放總線
- i++;
- i++;//延時6us等待數(shù)據(jù)穩(wěn)定
- bi=DSPORT; //讀取數(shù)據(jù),從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte=(byte>>1)|(bi<<7);
- i=4; //讀取完之后等待48us再接著讀取下一個數(shù)
- while(i--);
- }
- return byte;
- }
- void Ds18b20ChangTemp() //讓18B20轉(zhuǎn)換溫度
- {
- Ds18b20Init();
- delay_ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉(zhuǎn)換命令
- }
- void Ds18b20ReadTempCom() //讓18B20 讀取溫度
- {
- Ds18b20Init();
- delay_ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發(fā)送讀取溫度命令
- }
- int Ds18b20ReadTemp() //讀取溫度返回數(shù)值
- {
- int temp=0;
- unsigned char tmh,tml;
- Ds18b20ChangTemp(); //先寫入轉(zhuǎn)換命令
- Ds18b20ReadTempCom(); //然后等待轉(zhuǎn)換完后發(fā)送讀取溫度命令
- tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節(jié)
- tmh=Ds18b20ReadByte(); //再讀高字節(jié)
- temp=tmh;
- temp<<=8;
- temp|=tml;
- return temp;
- }
- void wendu_shuji()
- {
- temp=Ds18b20ReadTemp();
- tp=temp;//因為數(shù)據(jù)處理有小數(shù)點所以將溫度賦給一個浮點型變量
- temp=tp*0.0625*100+0.5;
- c1 = temp % 10000 / 1000;
- c2 = temp % 1000 / 100;
- Show[7]=TableCC[c1];
- Show[6]=TableCC[c2];
- }
- void Timer0_Init() //定時器初始化
- {
- TMOD |= 0x01; //選擇為定時器0模式,工作方式1,僅用TR0打開啟動。
- TH0 =(65536 - 50000)/256; //給定時器賦初值
- TL0 =(65536 - 50000)%256;
- TR0=1;//打開定時器
- ET0=1;//打開定時器0中斷允許
- EA=1;//打開總中斷
- }
- void TimeTim() //時鐘正常走
- {
- if(settype == 0 && alarmvalue == 0) //當不在鬧鐘狀態(tài)也不在修改時間狀態(tài)的時候時間正常走
- {
- if(b>=20)
- {
- b=0;
- sec++;
- if(sec == 60)
- {
- sec = 0;
- min++;
- if(min == 60)
- {
- min = 0;
- hour++;
- if(hour == 24)
- {
- hour = 0;
- }
- }
- }
- }
- }
- }
- void bsp_CheckAlarm(void) //檢查時間是否到了鬧鐘時間
- {
- unsigned char a=0;
- if((hour == ahour) && (min == amin) && (sec == asec))
- {
- while(1)
- {
- beep=~beep;
- delay_us(100);
- if(k1 == 0)//K1按鍵被按下
- {
- delay(1000);
- if(k1 == 0)
- {
- beep=0;
- a=1;
- }
- while(!k1);//等待按鍵釋放
- }
- if(a == 1)
- {
- break;
- }
- }
- }
- }
-
- void bsp_KeyScan(void) //掃描鍵盤那個鍵被按下
- {
- if(k1 == 0)//K1按鍵被按下
- {
- delay(1000);
- if(k1==0)
- {
- keyvalue = 1;
- }
- while(!k1);//等待按鍵釋放
- }
- if(k2 == 0)
- {
- delay(1000);
- if(k2==0)
- {
- keyvalue = 2;
- }
- while(!k2);
- }
- if(k3 == 0)
- {
- delay(1000);
- if(k3==0)
- {
- keyvalue = 3;
- }
- while(!k3);
- }
- if(k4 == 0)
- {
- delay(1000);
- if(k4==0)
- {
- keyvalue = 4;
- }
- while(!k4);
- }
- }
- void timeadd() //時間加1
- {
- if(settype == 1)
- {
- if(sec < 59)
- {
- sec++;
- }
- else
- {
- sec = 0;
- }
- }
- else if(settype == 2)
- {
- if(min < 59)
- {
- min++;
- }
- else
- {
- min = 0;
- }
- }
- else if(settype == 3)
- {
- if(hour < 23)
- {
- hour++;
- }
- else
- {
- hour = 0;
- }
- }
- if(alarmvalue == 1) //設置鬧鐘加1
- {
- if(asec < 59)
- {
- asec++;
- }
- else
- {
- asec = 0;
- }
- }
- else if(alarmvalue == 2)
- {
- if(amin < 59)
- {
- amin++;
- }
- else
- {
- amin = 0;
- }
- }
- else if(alarmvalue == 3)
- {
- if(ahour < 23)
- {
- ahour++;
- }
- else
- {
- ahour = 0;
- }
- }
- }
- void timedec() //時間減一
- {
- if(settype == 1)
- {
- if(sec > 0)
- {
- sec--;
- }
- else
- {
- sec = 59;
- }
- }
- else if(settype == 2)
- {
- if(min > 0)
- {
- min--;
- }
- else
- {
- min = 59;
- }
- }
- else if(settype == 3)
- {
- if(hour > 0)
- {
- hour--;
- }
- else
- {
- hour = 23;
- }
- }
- if(alarmvalue == 1) //設置鬧鐘減1
- {
- if(asec > 0)
- {
- asec--;
- }
- else
- {
- asec = 59;
- }
- }
- else if(alarmvalue == 2)
- {
- if(amin > 0)
- {
- amin--;
- }
- else
- {
- amin = 59;
- }
- }
- else if(alarmvalue == 3)
- {
- if(ahour > 0)
- {
- ahour--;
- }
- else
- {
- ahour = 23;
- }
- }
- }
- void bsp_KeyProc(unsigned char keyv)
- {
- if(keyv == 1)
- {
- settype++;
- if(settype == 4)
- {
- settype = 0;
- }
- keyvalue = 0; //鍵值要清0!!!
- }
- if(keyv == 2)
- {
- alarmvalue++;
- if(alarmvalue == 4)
- {
- alarmvalue = 0;
- }
- keyvalue = 0;
- }
- if(keyv == 3)
- {
- timeadd();
- keyvalue = 0;
- }
- if(keyv == 4)
- {
- timedec();
- keyvalue = 0;
- }
- }
- void SetValueShow(void)
- {
- if(alarmvalue == 0) //當不在鬧鐘狀態(tài)時數(shù)碼管顯示正常的時間
- {
- Show[5] = TableCC[hour/10];
- if(settype == 3)
- Show[4] = TableCC[hour%10] | 0x80;
- else
- Show[4] = TableCC[hour%10];
- Show[3] = TableCC[min/10];
- if(settype == 2)
- Show[2] = TableCC[min%10] | 0x80;
- else
- Show[2] = TableCC[min%10];
- Show[1] = TableCC[sec/10];
- if(settype == 1)
- Show[0] = TableCC[sec%10] | 0x80;
- else
- Show[0] = TableCC[sec%10];
- }
- //在鬧鐘狀態(tài)數(shù)碼管顯示鬧鐘設置的時間
- else
- {
- Show[5] = TableCC[ahour/10];
- if(alarmvalue == 3)
- Show[4] = TableCC[ahour%10] | 0x80;
- else
- Show[4] = TableCC[ahour%10];
- Show[3] = TableCC[amin/10];
- if(alarmvalue == 2)
- Show[2] = TableCC[amin%10] | 0x80;
- else
- Show[2] = TableCC[amin%10];
- Show[1] = TableCC[asec/10];
- if(alarmvalue == 1)
- Show[0] = TableCC[asec%10] | 0x80;
- else
- Show[0] = TableCC[asec%10];
- }
- }
- void DigDisplay()
- {
- int i;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位
-
- }
- P0=Show[i];//發(fā)送段碼
- delay(100); //間隔一段時間掃描
- P0=0x00;//消隱
- }
- }
- void main()
- {
- k1=1;
- k2=1;
- k3=1;
- k4=1;
- Timer0_Init(); //計時器的初始化
- while(1)
- {
- wendu_shuji(); //溫度
- TimeTim(); //正常時間在走
- bsp_KeyScan(); //鍵盤掃描看哪個功能鍵被按下
- bsp_KeyProc(keyvalue); //根據(jù)鍵值進行相應的功能處理
- SetValueShow(); //數(shù)碼管上顯示的值
- DigDisplay(); //顯示在數(shù)碼管上
- bsp_CheckAlarm(); //鬧鐘檢查
- }
- }
- void Timer0(void) interrupt 1 //定時器的中斷服務程序
- {
- TH0 = (65536 - 50000)/256;
- TL0 = (65536 - 50000)%256;
- b++;
- }
復制代碼
Keil代碼下載:
最終.rar
(26.26 KB, 下載次數(shù): 16)
2022-1-26 11:40 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|