經過兩天熬夜的艱苦奮戰,在原程序基礎上進行升級,添加按鍵多功能操作
新增功能:1. K1模式轉換,可自由切換:主界面顯示,時間調整,鬧鐘設置,溫度上下限設定等; 2. K2選定需要調整的位數。
切換至時間調整時,通過K3-"加",K4-"減"按鍵調整數值。
切換至鬧鐘設置時,通過K3-"加",K4-"減"按鍵調整數值。
切換至溫度上下限設定時,通過K3-"加",K4-"減"按鍵調整數值。
準備擴展的新功能:鬧鐘音樂,喇叭開啟和關閉,。
操作說明:
開機進入主界面,顯示時鐘和溫度。按下K1時,進入模式選擇,(有時間調整,鬧鐘設置,溫度上下限設定等),當K1按下四次后,長響一聲,回到主界面。
當K1(模式選擇鍵)按下第一次,選擇在時間調整時,按下K2,選定需要調整的位數,選定的位數會一秒鐘不停的閃爍。然后按下K3 “加”或者K4 “減”按鍵,進行數值的加減,當K2按到五次時,返回時間調整界面。
再按下K1(模式選擇鍵)按下第二次,進入到下一個模式,鬧鐘設置。按下K2,選定需要調整的位數,選定的位數會一秒鐘不停的閃爍。然后按下K3 “加”或者K4 “減”按鍵,進行數值的加減,當K2按到五次時,返回鬧鐘設置界面。
再按下K1(模式選擇鍵)按下第三次,進入到下一個模式,溫度上下限設定。按下K2,選定需要調整的位數,選定的位數會一秒鐘不停的閃爍。然后按下K3 “加”或者K4 “減”按鍵,進行數值的加減,當K2按到五次時,返回溫度上下限設定界面。
當K1(模式選擇鍵)按下第四次,返回到時鐘和溫度主界面顯示。
采用的是stc89c51單片機,代碼:
#include"reg51.h" #define uchar unsigned char #define uint unsigned int /****溫度 端口定義******/ sbit wx5=P2^4; sbit wx6=P2^5; sbit wx7=P2^6; sbit wx8=P2^7; sbit DQ=P3^6; uint temp, temp1,temp2, xs,H1,H2,L1,L2; uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0X9c,0xc6,0x91,0xfc,0XE3}; /******延時程序*******/ void delay1(uint m) { uint i,j; for(i=m;i>0;i--) for(j=110;j>0;j--); } void delay(unsigned int m) { while(m--); } void Init_DS18B20() { unsigned char x=0; DQ = 1; //DQ復位 ds18b20通信端口 delay(8); //稍做延時 DQ = 0; //單片機將DQ拉低 delay(80); //精確延時 大于 480us DQ = 1; //拉高總線 delay(4); x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗 delay(20); } /***********ds18b20讀一個字節**************/ uchar ReadOneChar() { unsigned char i=0; unsigned char dat = 0; for (i=8;i>0;i--) { DQ = 0; // 高電平拉成低電平時讀周期開始 dat>>=1; DQ = 1; // 給脈沖信號 if(DQ) dat|=0x80; // delay(4); } return(dat); } /*************ds18b20寫一個字節****************/ void WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; //從高電平拉至低電平時,寫周期的開始 DQ = dat&0x01; //數據的最低位先寫入 delay(5); //60us到120us延時 DQ = 1; dat>>=1; //從最低位到最高位傳入 } } /**************讀取ds18b20當前溫度************/ void ReadTemperature() { unsigned char a=0; unsigned b=0; unsigned t=0; Init_DS18B20(); WriteOneChar(0xCC); // 跳過讀序號列號的操作 WriteOneChar(0x44); // 啟動溫度轉換 delay(1); // this message is wery important Init_DS18B20(); WriteOneChar(0xCC); //跳過讀序號列號的操作 WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個寄存器) 前兩個就是溫度 delay(1); a=ReadOneChar(); //讀取溫度值低位 b=ReadOneChar(); //讀取溫度值高位 temp1=b<<4; ? ? ? ? ? //高8位中后三位數的值 ? ?temp1+=(a&0xf0)>>4; //低8位中的高4位值加上高8位中后三位數的值 temp1室溫整數值 temp2=a&0x0f; //小數的值 temp=((b*256+a)>>4); //當前采集溫度值除16得 實際溫度值 zhenshu xs=temp2*0.0625*10; //小數位,若為0.5則算為5來顯示 xs小數 xiaoshu } /////////////////////////////////////////////////////////////////////// /****時鐘 端口定義******/ sbit wx1=P2^0; sbit wx2=P2^1; sbit wx3=P2^2; sbit wx4=P2^3; uchar qian,bai,shi,ge,miao1,miao2,count1,count2; uchar n1,n2,z1,z2;//設置鬧鐘變量 uchar code table1[]={0xc0,0xcf,0xa4,0x86,0x8b, 0x92,0x90,0xc7,0x80,0x82}; //////////////////////////////////////////// /***************按鍵調時程序***************/ sbit K1=P3^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; sbit BEEP=P3^7; //// 定義蜂鳴器口 uchar K1num,K2num,K3num,K4num,K5num,K6num,K7num; ////////////////////////////////////////// /**********報警聲音**************/ bi(uint t) { int c,n; for(c=0;c
-
電路圖
+關注
關注
10356文章
10725瀏覽量
532887 -
51單片機
+關注
關注
274文章
5705瀏覽量
124303 -
電子鐘
+關注
關注
7文章
189瀏覽量
37026
原文標題:51單片機電子鐘制作
文章出處:【微信號:changxuemcu,微信公眾號:暢學單片機】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論