本設計是由STC89C52單片機為控制核心,具有在線編程功能,低功耗;時鐘電路由DS1302提供,它是一種高性能、低功耗的時鐘電路,工作電壓為3V~5V;所以采用DS1302作為本設計的日歷芯片;顯示部份使用LCD1602B液晶模塊進行數字顯示,1602B液晶模塊可以顯示2行16個字符,有8位數據總線D0—D7,和RS、R/W、EN三個控制端口,工作電壓為5V,并且帶有字符對比度調節和背光。該模塊也可以只用D4-D7作為四位數據分兩次傳送,這樣就可以節省MCU的I/O口資源,系統主要由晶振電路、復位電路、時鐘電路部分、中央處理單元、晶顯示部分組成。
電路原理圖如下:
1576830270(1).jpg (30.04 KB, 下載次數: 54)
下載附件
2019-12-20 16:24 上傳
制作出來的實物圖如下:
IMG_20150308_231544.jpg (236.46 KB, 下載次數: 39)
下載附件
2019-12-22 23:09 上傳
IMG_20150308_231217.jpg (211.5 KB, 下載次數: 37)
下載附件
2019-12-22 23:09 上傳
Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)
51hei.png (28.52 KB, 下載次數: 51)
下載附件
2019-12-22 23:10 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define LCDIO P0
- sbit rs=P2^0;
- sbit rd=P2^1;
- sbit lcden=P2^2;
- sbit acc0=ACC^0; //移位時的第0位
- sbit acc7=ACC^7; //移位時用的第7位
- sbit ct=P2^3;
- sbit speaker=P3^5;
- sbit DQ=P2^5;//ds18b20與單片機連接口
- int djs11=0,js,dsmin=0,dshour=0;
- uchar second,minute,hour,day,month,year,week,count=0;
- uchar ReadValue,num,time;
- uint tvalue;//溫度值
- uchar tflag;
- uchar code table[]={" 2000-00-00 FRI"};
- uchar code table1[]={" 00:00:00 "};
- uchar code table2[]= "THUFRISATSUNMONTUEWES";
- char szdata[8];
- char szdata1[8];
- uchar data disdata[5];
- sbit DATA=P3^3; //時鐘數據接口
- sbit RST=P3^4;
- sbit SCLK=P3^2;
- sbit menu=P2^7; //菜單
- sbit add=P2^6; //加一
- sbit dec=P2^4;
- sbit set=P2^3 ; //減一
- sbit djs=P3^6;
- void miaobiao();
- void yx();
- void delayms(int x)
- {
- char i;
- while(x--)
- {
- for(i=150;i>0;i--);
- }
- }
- void delay(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void delay1(uint z)
- {
- for(;z>0;z--);
- }
- void write_com(uchar com)
- {
- rs=0;
- rd=0;
- lcden=0;
- LCDIO=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_date(uchar date)
- {
- rs=1;
- rd=0;
- lcden=0;
- LCDIO=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- uchar num;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80);
- delay(5);
- write_com(0x80);
- for(num=0;num<15;num++)
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40);
- for(num=0;num<15;num++)
- {
- write_date(table1[num]);
- delay(5);
- }
-
- }
- void Write1302(uchar dat)
- {
- uchar i;
- SCLK=0; //拉低SCLK,為脈沖上升沿寫入數據做好準備
- delay1(2); //稍微等待,使硬件做好準備
- for(i=0;i<8;i++) //連續寫8個二進制位數據
- {
- DATA=dat&0x01; //取出dat的第0位數據寫入1302
- delay(2); //稍微等待,使硬件做好準備
- SCLK=1; //上升沿寫入數據
- delay1(2); //稍微等待,使硬件做好準備
- SCLK=0; //重新拉低SCLK,形成脈沖
- dat>>=1; //將dat的各數據位右移1位,準備寫入下一個數據位
- }
- }
- void WriteSet1302(uchar Cmd,uchar dat)
- {
- RST=0; //禁止數據傳遞
- SCLK=0; //確保寫數居前SCLK被拉低
- RST=1; //啟動數據傳輸
- delay1(2); //稍微等待,使硬件做好準備
- Write1302(Cmd); //寫入命令字
- Write1302(dat); //寫數據
- SCLK=1; //將時鐘電平置于已知狀態
- RST=0; //禁止數據傳遞
- }
- uchar Read1302(void)
- {
- uchar i,dat;
- delay(2); //稍微等待,使硬件做好準備
- for(i=0;i<8;i++) //連續讀8個二進制位數據
- {
- dat>>=1; //將dat的各數據位右移1位,因為先讀出的是字節的最低位
- if(DATA==1) //如果讀出的數據是1
- dat|=0x80; //將1取出,寫在dat的最高位
- SCLK=1; //將SCLK置于高電平,為下降沿讀出
- delay1(2); //稍微等待
- SCLK=0; //拉低SCLK,形成脈沖下降沿
- delay1(2); //稍微等待
- }
- return dat; //將讀出的數據返回
- }
- uchar ReadSet1302(uchar Cmd)
- {
- uchar dat;
- RST=0; //拉低RST
- SCLK=0; //確保寫數居前SCLK被拉低
- RST=1; //啟動數據傳輸
- Write1302(Cmd); //寫入命令字
- dat=Read1302(); //讀出數據
- SCLK=1; //將時鐘電平置于已知狀態
- RST=0; //禁止數據傳遞
- return dat; //將讀出的數據返回
- }
- void Init_DS1302(void)
- {
- WriteSet1302(0x8E,0x00); //根據寫狀態寄存器命令字,寫入不保護指令
- WriteSet1302(0x80,((0/10)<<4|(0%10))); //根據寫秒寄存器命令字,寫入秒的初始值
- WriteSet1302(0x82,((12/10)<<4|(12%10))); //根據寫分寄存器命令字,寫入分的初始值
- WriteSet1302(0x84,((11/10)<<4|(11%10))); //根據寫小時寄存器命令字,寫入小時的初始值
- WriteSet1302(0x86,((25/10)<<4|(25%10))); //根據寫日寄存器命令字,寫入日的初始值
- WriteSet1302(0x88,((1/10)<<4|(1%10))); //根據寫月寄存器命令字,寫入月的初始值
- WriteSet1302(0x8c,((13/10)<<4|(13%10))); //nian
- WriteSet1302(0x8a,((1/10)<<4|(1%10)));
- }
- void DisplaySecond(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0xc7);
- write_date(0x30+i);
- write_date(0x30+j);
- }
- void DisplayMinute(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0xc4);
- write_date(0x30+i);
- write_date(0x30+j);
- }
- void DisplayHour(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0xc1);
- write_date(0x30+i);
- write_date(0x30+j);
- }
-
- void DisplayDay(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0x89);
- write_date(0x30+i);
- write_date(0x30+j);
- }
- void DisplayMonth(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0x86);
- write_date(0x30+i);
- write_date(0x30+j);
- }
- void DisplayYear(uchar x)
- {
- uchar i,j;
- i=x/10;
- j=x%10;
- write_com(0x83);
- write_date(0x30+i);
- write_date(0x30+j);
- }
- void DisplayWeek(uchar x)
- { uchar i;
- x=x*3;
- write_com(0x8c);
- for(i=0;i<3;i++)
- {
- write_date(table2[x]);
- x++;
- }
- }
- void read_date(void)
- {
- ReadValue = ReadSet1302(0x81);
- second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue = ReadSet1302(0x83);
- minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue = ReadSet1302(0x85);
- hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue = ReadSet1302(0x87);
- day=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue = ReadSet1302(0x89);
- month=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue = ReadSet1302(0x8d);
- year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
- ReadValue=ReadSet1302(0x8b); //讀星期
- week=ReadValue&0x07;
- if((year==szdata[1])&&(month==szdata[2])&&(day==szdata[3])&&(week==szdata[4])&&(hour==szdata[5])&&(minute==szdata[6])&&(second==szdata[7])) speaker=0;
- DisplaySecond(second);
- DisplayMinute(minute);
- DisplayHour(hour);
- DisplayDay(day);
- DisplayMonth(month);
- DisplayYear(year);
- DisplayWeek(week);
- }
- void turn_val(char newval,uchar flag,uchar newaddr,uchar s1num)
- {
- newval=ReadSet1302(newaddr); //讀取當前時間
- newval=((newval&0x70)>>4)*10+(newval&0x0f); //將bcd碼轉換成十進制
- if(flag) //判斷是加一還是減一
- {
- newval++;
- switch(s1num)
- { case 1: if(newval>99) newval=0;
- DisplayYear(newval);
- break;
- case 2: if(newval>12) newval=1;
- DisplayMonth(newval);
- break;
- case 3: if(newval>31) newval=1;
- DisplayDay(newval);
- break;
- case 4: if(newval>6) newval=0;
- DisplayWeek(newval);
- break;
- case 5: if(newval>23) newval=0;
- DisplayHour(newval);
- break;
- case 6: if(newval>59) newval=0;
- DisplayMinute(newval);
- break;
- case 7: if(newval>59) newval=0;
- DisplaySecond(newval);
- break;
- default:break;
- }
- }
- else
- {
- newval--;
- switch(s1num)
- { case 1: if(newval<0) newval=99;
- DisplayYear(newval);
- break;
- case 2: if(newval<0) newval=12;
- DisplayMonth(newval);
- break;
- case 3: if(newval<0) newval=31;
- DisplayDay(newval);
- break;
- case 4: if(newval<0) newval=6;
- DisplayWeek(newval);
- break;
- case 5: if(newval<0) newval=23;
- DisplayHour(newval);
- break;
- case 6: if(newval<0) newval=59;
- DisplayMinute(newval);
- break;
- case 7: if(newval<0) newval=59;
- DisplaySecond(newval);
- break;
- default:break;
- }
- }
- WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //將新數據寫入寄存器
-
- }
- void turn_val11(char newval,uchar flag,uchar newaddr,uchar s1num)
- {
- newval=szdata[s1num]; //讀取當前時間
- //newval=((newval&0x70)>>4)*10+(newval&0x0f); //將bcd碼轉換成十進制
- if(flag) //判斷是加一還是減一
- {
- newval++;
- switch(s1num)
- { case 1: if(newval>99) newval=0;
- DisplayYear(newval);
- break;
- case 2: if(newval>12) newval=1;
- DisplayMonth(newval);
- break;
- case 3: if(newval>31) newval=1;
- DisplayDay(newval);
- break;
- case 4: if(newval>6) newval=0;
- DisplayWeek(newval);
- break;
- case 5: if(newval>23) newval=0;
- DisplayHour(newval);
- break;
- case 6: if(newval>59) newval=0;
- DisplayMinute(newval);
- break;
- case 7: if(newval>59) newval=0;
- DisplaySecond(newval);
- break;
- default:break;
- }
- }
- else
- {
- newval--;
- switch(s1num)
- { case 1: if(newval<0) newval=99;
- DisplayYear(newval);
- break;
- case 2: if(newval<0) newval=12;
- DisplayMonth(newval);
- break;
- case 3: if(newval<0) newval=31;
- DisplayDay(newval);
- break;
- case 4: if(newval<0) newval=6;
- DisplayWeek(newval);
- break;
- case 5: if(newval<0) newval=23;
- DisplayHour(newval);
- break;
- case 6: if(newval<0) newval=59;
- DisplayMinute(newval);
- break;
- case 7: if(newval<0) newval=59;
- DisplaySecond(newval);
- break;
- default:break;
- }
- }
- szdata[s1num]= newval;
- szdata1[s1num]=newval;
- //WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10)); //將新數據寫入寄存器
-
- }
- //鍵盤掃描程序
- //*******************************************
- void key_scan(void)
- { uchar miao,s1num=0;
- if(menu==0)
- {
- delay(5);
- if(menu==0)
- {
- while(!menu);
- s1num++;
- write_com(0xc9);
- write_date(' ');//顯示符號位
- write_com(0xca);
- write_date(' ');//顯示百位
- write_com(0xcb);
- write_date('T');//顯示十位
- write_com(0xcc);
- write_date('-');//顯示個位
- write_com(0xcd);
- write_date('S');//顯示小數點
- write_com(0xce);
- write_date('E');//顯示小數位
- write_com(0xcf);
- write_date('T');
- while(1)
- {
- if(menu==0)
- {
- delay(5);
- if(menu==0)
- {
- while(!menu);
- s1num++;
- }
- }
- rd=0;
- miao=ReadSet1302(0x81);
- second=miao;
- WriteSet1302(0x80,miao|0x80);
- write_com(0x0f);//光標閃射
-
- if(s1num==1)
- { year=ReadSet1302(0x8d);
- write_com(0x80+4); //年光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val(year,1,0x8d,1);
-
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(year,0,0x8d,1);
- }
- }
- }
- if(s1num==2)
- {
- month=ReadSet1302(0x89);
- write_com(0x80+7); //月光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val(month,1,0x89,2);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(month,0,0x89,2);
- }
- }
- }
- if(s1num==3)
- { day=ReadSet1302(0x87);
- write_com(0x80+10);//日光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val(day,1,0x87,3);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(day,0,0x87,3); //寫入日寄存器
- }
- }
- }
- if(s1num==4)
- { week=ReadSet1302(0x8b);
- write_com(0x80+14); //星期光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val(week,1,0x8b,4);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(week,0,0x8b,4);
- }
- }
- }
- if(s1num==5)
- { hour=ReadSet1302(0x85);
- write_com(0x80+0x40+2); //時光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val(hour,1,0x85,5);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(hour,0,0x85,5);
- }
- }
- }
- if(s1num==6)//調時間分
- { minute=ReadSet1302(0x83);
- write_com(0x80+0x40+5);
- if(add==0)
- {
- delay(5);
- if(add==0)
- { while(!add);
- turn_val(minute,1,0x83,6); //寫入分寄存器
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(minute,0,0x83,6); //寫入分寄存器
- }
- }
- }
- if(s1num==7)//調時間秒
- { second=ReadSet1302(0x81);
- write_com(0x80+0x40+8);//秒光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- if(second==0x60)
- second=0x00;
- turn_val(second,1,0x81,7);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val(second,0,0x81,7);
- }
- }
- }
-
- if(s1num==8)
- { miao=ReadSet1302(0x81);
- second=miao;
- WriteSet1302(0x80,second&0x7f);
- s1num=0;//s1num清零//
- write_com(0x0c);//光標不閃爍//
- break;
- }
- }
- }
- }
- if(ct==0)
- {
- delay(5);
- if(ct==0)
- {
- while(!ct);
- s1num++;
- write_com(0xc9);
- write_date(' ');//顯示符號位
- write_com(0xca);
- write_date(' ');//顯示百位
- write_com(0xcb);
- write_date('C');//顯示十位
- write_com(0xcc);
- write_date('-');//顯示個位
- write_com(0xcd);
- write_date('S');//顯示小數點
- write_com(0xce);
- write_date('E');//顯示小數位
- write_com(0xcf);
- write_date('T');
- DisplaySecond(szdata1[7]);
- DisplayMinute(szdata1[6]);
- DisplayHour(szdata1[5]);
- DisplayDay(szdata1[3]);
- DisplayMonth(szdata1[2]);
- DisplayYear(szdata1[1]);
- DisplayWeek(szdata1[4]);
- while(1)
- {
- if(ct==0)
- {
- delay(5);
- if(ct==0)
- {
- while(!ct);
- s1num++;
- }
- }
- rd=0;
- miao=ReadSet1302(0x81);
- second=miao;
- WriteSet1302(0x80,miao|0x80);
- write_com(0x0f);//光標閃射
-
- if(s1num==1)
- { year=0x00;
- write_com(0x80+4); //年光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val11(year,1,0x8d,1);
-
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(year,0,0x8d,1);
- }
- }
- }
- if(s1num==2)
- {
- month=0x00;
- write_com(0x80+7); //月光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val11(month,1,0x89,2);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(month,0,0x89,2);
- }
- }
- }
- if(s1num==3)
- { day=0x00;
- write_com(0x80+10);//日光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val11(day,1,0x87,3);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(day,0,0x87,3); //寫入日寄存器
- }
- }
- }
- if(s1num==4)
- { week=0x00;
- write_com(0x80+14); //星期光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val11(week,1,0x8b,4);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(week,0,0x8b,4);
- }
- }
- }
- if(s1num==5)
- { hour=0x00;
- write_com(0x80+0x40+2); //時光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- turn_val11(hour,1,0x85,5);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(hour,0,0x85,5);
- }
- }
- }
- if(s1num==6)//調時間分
- { minute=0x00;
- write_com(0x80+0x40+5);
- if(add==0)
- {
- delay(5);
- if(add==0)
- { while(!add);
- turn_val11(minute,1,0x83,6); //寫入分寄存器
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(minute,0,0x83,6); //寫入分寄存器
- }
- }
- }
- if(s1num==7)//調時間秒
- { second=0x00;
- write_com(0x80+0x40+8);//秒光標
- if(add==0)
- {
- delay(3);
- if(add==0)
- { while(!add);
- if(second==0x60)
- second=0x00;
- turn_val11(second,1,0x81,7);
- }
- }
- if(dec==0)
- {
- delay(3);
- if(dec==0)
- { while(!dec);
- turn_val11(second,0,0x81,7);
- }
- }
- }
-
- if(s1num==8)
- { miao=ReadSet1302(0x81);
- second=miao;
- WriteSet1302(0x80,second&0x7f);
- s1num=0;//s1num清零//
- write_com(0x0c);//光標不閃爍//
- break;
- }
- }
- }
- }
- }
-
- void Timer0_init()
- {
- js=0;
- TMOD=0x01; //T0為定時器方式1
- TH0=0x4c;
- TL0=0x00;
- //IT1=1;
- ET0=1;//EX1=1;
- EA=1;
- }
- void timer0() interrupt 1 using 1
- {
- TF0=0;
- //TH0=0x4c;
- //TL0=0x00;
- TH0=0xb3;
- TL0=0x4c;
- js++;
- if(js==1)
- { js=0;
- djs11++;
- //led1=~led1;
- if(djs11>59)
- {
- djs11=0;
- dsmin=dsmin+1;
- if(dsmin>59)
- {
- dsmin=0;
- dshour=dshour+1;
- if(dshour>24) dshour=0;
- }
- }
- }
- }
- void miaobiao()
- { int i,j;
- write_com(0x80);write_date(' ');
- write_com(0x81);write_date(' ');
- write_com(0x82);write_date(' ');
- write_com(0x83);write_date(' ');
- write_com(0x84);write_date(' ');
- write_com(0x85);write_date(' ');
- write_com(0x86);write_date(' ');
- write_com(0x87);write_date(' ');
- write_com(0x88);write_date(' ');
- write_com(0x89);write_date(' ');
- write_com(0x8a);write_date(' ');
- write_com(0x8b);write_date(' ');
- write_com(0x8c);write_date(' ');
- write_com(0x8d);write_date(' ');
- write_com(0x8e);write_date(' ');
- write_com(0x8f);write_date(' ');
- write_com(0xc0);write_date(' ');
- write_com(0xc1);write_date(' ');
- write_com(0xc2);write_date(' ');
- write_com(0xc3);write_date(' ');
- write_com(0xc4);write_date(' ');
- write_com(0xc5);write_date(' ');
- write_com(0xc6);write_date(' ');
- write_com(0xc7);write_date(' ');
- write_com(0xc8);write_date(' ');
- write_com(0xc9);write_date(' ');
- write_com(0xca);write_date(' ');
- write_com(0xcb);write_date(' ');
- write_com(0xcc);write_date(' ');
- write_com(0xcd);write_date(' ');
- write_com(0xce);write_date(' ');
- write_com(0xcf);write_date(' ');
- while(1)
- { if(add==0)
- {
- delayms(30);
- if(add==0)
- {
- TR0=1;
- }
- }
- if(dec==0)
- {
- delayms(30);
- if(dec==0)
- {
- TR0=0;
- }
- }
- if(set==0)
- {
- delayms(30);
- if(set==0)
- {
- djs11=0;
- TR0=0;
- dsmin=0;
- dshour=0;
- }
- }
- if(djs==0)
- {
- delayms(30);
- if(djs==0)
- {
- yx();
- }
- }
- write_com(0xc4);
- i=dshour/10;
- j=dshour%10;
- write_date(0x30+i);
- write_date(0x30+j);
- write_date(':');
- i=dsmin/10;
- j=dsmin%10;
- write_date(0x30+i);
- write_date(0x30+j);
- write_date(':');
- i=djs11/10;
- j=djs11%10;
- write_date(0x30+i);
- write_date(0x30+j);
- }
- }
- void delay_18B20(unsigned int i)//延時1微秒
- {
- while(i--);
- }
- void ds1820rst()/*ds1820復位*/
- { unsigned char x=0;
- DQ = 1; //DQ復位
- delay_18B20(4); //延時
- DQ = 0; //DQ拉低
- delay_18B20(100); //精確延時大于480us
- DQ = 1; //拉高
- delay_18B20(40);
- }
-
- uchar ds1820rd()/*讀數據*/
- { 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_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*寫數據*/
- {unsigned char i=0;
- for (i=8; i>0; i--)
- { DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- read_temp()/*讀取溫度值并轉換*/
- {uchar a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- ds1820wr(0x44);//*啟動溫度轉換*/
- ds1820rst();
- ds1820wr(0xcc);//*跳過讀序列號*/
- ds1820wr(0xbe);//*讀取溫度*/
- a=ds1820rd();
- b=ds1820rd();
- tvalue=b;
- tvalue<<=8;
- tvalue=tvalue|a;
- if(tvalue<0x0fff)
- tflag=0;
- else
- {tvalue=~tvalue+1;
- tflag=1;
- }
- tvalue=tvalue*(0.625);//溫度值擴大10倍,精確到1位小數
- return(tvalue);
- }
- void ds1820disp()//溫度值顯示
- { uchar flagdat;
- disdata[0]=tvalue/1000+0x30;//百位數
- disdata[1]=tvalue%1000/100+0x30;//十位數
- disdata[2]=tvalue%100/10+0x30;//個位數
- disdata[3]=tvalue%10+0x30;//小數位
-
- if(tflag==0)
- flagdat=0x20;//正溫度不顯示符號
- else
- flagdat=0x2d;//負溫度顯示負號:-
- if(disdata[0]==0x30)
- {disdata[0]=0x20;//如果百位為0,不顯示
- if(disdata[1]==0x30)
- {disdata[1]=0x20;//如果百位為0,十位為0也不顯示
- }
- }
- write_com(0xc9);
- write_date(flagdat);//顯示符號位
- write_com(0xca);
- write_date(disdata[0]);//顯示百位
- write_com(0xcb);
- write_date(disdata[1]);//顯示十位
- write_com(0xcc);
- write_date(disdata[2]);//顯示個位
- write_com(0xcd);
- write_date(0x2e);//顯示小數點
- write_com(0xce);
- write_date(disdata[3]);//顯示小數位
- write_com(0xcf);
- write_date('C');
- }
- void yx()
- {
- init();
- while(1)
- {
- read_date();
- read_temp();//讀取溫度
- ds1820disp();//顯示
- key_scan();
- if(add==0)
- {
- delayms(30);
- if(add==0)
- {
- speaker=1;
- }
- }
- if(dec==0)
- {
- delayms(30);
- if(dec==0)
- {
- speaker=1;
- }
- }
- if(djs==0)
- {
- delay(5);
- if(djs==0)
- {
- miaobiao();
- }
- }
- }
- }
-
- void main()
- {
- init();
- Timer0_init();
- // Init_DS1302(); //將1302初始化
- speaker=1;
- szdata1[1]=0x00;
- szdata1[2]=0x00;
- szdata1[3]=0x00;
- szdata1[4]=0x00;
- szdata1[5]=0x00;
- szdata1[6]=0x00;
- szdata1[7]=0x00;
- yx();
- }
復制代碼
所有資料51hei提供下載:
基于51單片機的多功能時鐘溫度計.7z
(621.59 KB, 下載次數: 136)
2019-12-22 23:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|