|
- /* 電子鐘加上溫度顯示,AT89C51+DS1302+DS18B20 六位數碼管顯示,四位用于時間顯示,兩位用于溫度顯示
- 陳永飛同志于2016-2-13寫,信箱:baiyoyni888@163.com QQ:495204743
- 地址:江蘇省儀征市 電話:13584816200
- 晶振用12MHz,數碼管用共陽的*/
- #include<reg52.h>
- #define uchar unsigned char
- #define uint unsigned int
- #include"DS1302.h"
- #include"DS18B20.h"
- #define sec 0x80
- #define min 0x82
- #define hou 0x84
- #define read 0x01
- unsigned char hour,minute,second,id=0,timecount,re_disp=0,p,n0,n1;
- bit flag;
- #define leddata P0 //定義數碼管的段選
- sbit ssw=P2^7; //小時十位
- sbit sw=P2^6; //小時個位
- sbit sfw=P2^5; //分十位
- sbit fw=P2^4; //分個位
- sbit wdsw=P2^3; //溫度十位
- sbit wdgw=P2^2; //溫度個位
- sbit DOWN=P2^1; //加按鍵
- sbit UP=P2^0; //減按鍵
- //sbit DQ=P3^0; //DS18B20信號端
- //sbit T_CLK=P3^1; //DS1302的時鐘端
- //sbit T_IO=P3^2; //DS1302的數據端
- //sbit T_RES=P3^3; //DS1302的復位端
- sbit SET=P3^4; //時間設定鍵
- unsigned int ok;
- unsigned char code tab[]={0x48,0xEE,0x54,0xC4,0xE2,0xC1,0x41,0xEC,0x40,0xC0,0x60};
- unsigned char inittime[7]={0x00,0x00,0x12,0x16,0x11,0x06,0x04};
- // 秒 分鐘 小時 日 月 年 星期
- void Set_id(unsigned char sel,unsigned char sel_1);
- void delays(unsigned char k)
- {
- unsigned char i,j;
- for(i=0;i<k;i++)
- for(j=0;j<50;j++);
- }
- void display(void)
- {
- if(flag&hour) //為真時是設定時間
- {
- ssw=0;leddata=0xff;delays(10);ssw=1;
- sw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sw=1;
- }
- else //為假時為正常走時
- {
- leddata=tab[Read1302(hou+1)/16];ssw=0;delays(10);ssw=1;
- leddata=tab[Read1302(hou+1)%16]&~((unsigned char)~flag<<6);sw=0;delays(10);sw=1;
- }
- if(flag&minute)
- {
- sfw=0;leddata=0xff&~((unsigned char)~flag<<6);delays(10);sfw=1;
- fw=0;leddata=0xff;delays(10);fw=1;
- }
- else
- {
- leddata=tab[Read1302(min+1)/16]&~((unsigned char)~flag<<6);sfw=0;delays(10);sfw=1;
- leddata=tab[Read1302(min+1)%16];fw=0;delays(10);fw=1;
- }
- TR0=0; //關定時器
- ok=Read_Temperature(); //調用讀溫度函數
- TR0=1; //開定時器
- p=(unsigned char)(ok>>4); //溫度數據轉換
- wdsw=0;leddata=tab[p%100/10];delays(10);wdsw=1; //溫度顯示十位
- wdgw=0;leddata=tab[p%10];delays(10);wdgw=1; //溫度顯示個位
- }
- void id_case1_key(void) //按鍵加減子程序
- {
- display();
- if (!DOWN) //減少
- {
- while(!DOWN)display();
- re_disp=0;
- Set_id(id,0);
- }
- if (!UP) //增加
- {
- while(!UP)display();
- re_disp=0;
- Set_id(id,1);
- }
- }
- void Scan_Key(void) //按鍵掃描程序
- {
- display();
- if(!SET)
- {
- while(!SET)display();
- re_disp=0;
- id++;if(id>2)id=0;
- }
- if(id==0){hour=0;minute=0;second=0;}
- if(id==1){hour=1;id_case1_key();}
- if(id==2){hour=0;minute=1;id_case1_key();}
- // if(id==3){minute=0;second=1;id_case1_key();}
- }
- //根據選擇調整相應項目并寫入DS1302
- void Set_id(unsigned char sel,unsigned char sel_1)
- {
- signed char max,mini,address,item;
- if(sel==1) {address=hou; max=23;mini=0;} //小時
- if(sel==2) {address=min; max=59;mini=0;} //分鐘
- // if(sel==3) {address=sec; max=0;mini=0;} //秒
- item=Read1302(address+1)/16*10+Read1302(address+1)%16;
- if (sel_1==0) item--; else item++;
- if(item>max) item=mini;
- if(item<mini) item=max;
- Write1302(0x8e,0x00);//允許寫操作
- Write1302(address,item/10*16+item%10);
- Write1302(0x8e,0x80);//寫保護,禁止寫操作
- }
- void main()
- { TMOD=0x01;
- TH0=(65535-50000)/256;
- TL0=(65535-50000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- Write1302(0x90,0xa5);//打開充電二級管 一個二級管串聯一個2K電阻
- Write1302(0x8e,0x80);//寫保護,禁止寫操作
- if(!UP&!DOWN)Set1302(inittime);
- adjust_res(0x7f); //調整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125; 0x7f:0.0625
- while(1)
- {
- Scan_Key(); //調用按鍵掃描程序
- display(); //調用數碼管顯示程序
-
- }
- }
- void t0(void) interrupt 1 using 0
- {
- TH0=(65535-50000)/256; //50ms定時
- TL0=(65535-50000)%256;
- timecount++;re_disp++;
- if(timecount>9)
- {
- timecount=0;
- flag=~flag;
- }
- if(re_disp>200){re_disp=0;if(id)id=0;}
- }
復制代碼
|
|