




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、#include<reg51.h>#include<intrins.h>sbit DATA=P11; /位定義1302芯片的接口,數(shù)據(jù)輸出端定義在P1.1引腳sbit RST=P12; /位定義1302芯片的接口,復(fù)位端口定義在P1.1引腳sbit SCLK=P10;sbit RS=P20;sbit RW=P21;sbit E=P22;/日期:15-12-11sbit C=P23;sbit DQ=P33;sbit SCL=P34;sbit SDA=P35;sbit K5=P14;sbit K6=P15;sbit P32=P32;sbit fmq=P36;sbit jdq
2、=P37;unsigned char digit11="0123456789"/時間:12:45:45unsigned char dat3;unsigned char word5;unsigned char a11=0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb;void delayms(unsigned int n) /溫度:28 /星期一unsigned int i,j;for(i=0;i<n;i+)for(j=0;j<110;j+);void delayus()_nop_();_nop_();_nop_(
3、);_nop_();_nop_();void ask()SDA=1;SCL=0;delayus();SDA=0;SCL=1;delayus();SDA=1;SCL=0;delayus();void fask()SDA=1;SCL=0;delayus();SCL=1;delayus();SCL=0;delayus();void star24c08()SDA=1;SCL=1;delayus();SDA=0;SCL=0;delayus();stop()SDA=0;SCL=1;delayus();SDA=1;delayus();void write24c08(unsigned char dat)uns
4、igned int i;SCL=0;for(i=0;i<8;i+)SCL=0;delayus();dat=dat<<1;SDA=CY;delayus();SCL=1;delayus();SCL=0;SDA=0;delayus();unsigned char read24c08()unsigned int i,x=0x00;SCL=0;for(i=0;i<8;i+)SCL=0;x<<=1;delayus();SCL=1;x=x|SDA;delayus();SCL=0;delayus();return x;void write_24c08(unsigned ch
5、ar dat,unsigned char add)star24c08();write24c08(0xa0);ask();write24c08(add);ask();write24c08(dat);ask();stop();delayms(3);unsigned char read_24c08(unsigned char add)unsigned char x;star24c08();write24c08(0xa0);ask();write24c08(add);ask();delayus();star24c08();write24c08(0xa1);ask();x=read24c08();fas
6、k();stop();return x;void write1302(unsigned char dat)unsigned char i;for(i=0;i<8;i+)SCLK=0;DATA=dat&0x01;delayus();SCLK=1;delayus();dat>>=1;unsigned char read1302()unsigned char i,dat=0x00;for(i=0;i<8;i+)SCLK=1;delayus();SCLK=0;dat>>=1;if(DATA=1)dat=dat|0x80;delayus();return da
7、t;void write_1302(unsigned char com,unsigned char dat)RST=0;SCLK=0;delayus();RST=1;write1302(com);write1302(dat);RST=0;SCLK=1;unsigned char read_1302(unsigned char com)unsigned char x;RST=0;SCLK=0;delayus();RST=1;write1302(com);x=read1302();RST=0;SCLK=1;return x;void busy12864()unsigned char temp;te
8、mp=0x00;RS=0;RW=1;E=0;delayus();doE=1;temp=P0;E=0;while(temp&0x80)=1);void writecom12864(unsigned char x)busy12864();RS=0;RW=0;E=0;P0=x;delayus();E=1;delayus();E=0;void writedata12864(unsigned char x)busy12864();RS=1;RW=0;E=0;P0=x;delayus();E=1;delayus();E=0;void star12864()C=1;writecom12864(0x0
9、6);writecom12864(0x0c);void sendchar(unsigned char *p)while(*p!='0')writedata12864(*p);p+;void deal(unsigned char x)unsigned char i,j;i=x/10;j=x%10;writedata12864(digiti);writedata12864(digitj);bit star18b20()unsigned int time; bit flag; /儲存DS18B20是否存在的標(biāo)志,flag=0,表示存在;flag=1,表示不存在 DQ = 1; /先將
10、數(shù)據(jù)線拉高 for(time=0;time<2;time+) /略微延時約6微秒 ; DQ = 0; /再將數(shù)據(jù)線從高拉低,要求保持480960us for(time=0;time<200;time+) /略微延時約600微秒 ; /以向DS18B20發(fā)出一持續(xù)480960us的低電平復(fù)位脈沖 DQ = 1; /釋放數(shù)據(jù)線(將數(shù)據(jù)線拉高) for(time=0;time<10;time+) ; /延時約30us(釋放總線后需等待1560us讓DS18B20輸出存在脈沖) flag=DQ; /讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在) for(time=0;time&l
11、t;200;time+) /延時足夠長時間,等待存在脈沖輸出完畢 ; return (flag); /返回檢測成功標(biāo)志unsigned char read18b20(void) unsigned int time;unsigned char i=0;unsigned char dat; /儲存讀出的一個字節(jié)數(shù)據(jù)for (i=0;i<8;i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ = 0; /單片機從DS18B20讀書據(jù)時,將數(shù)據(jù)線從高拉低即啟動讀時序dat>>=1; _nop_(); /等待一個機器周期 DQ = 1; /將數(shù)據(jù)線&q
12、uot;人為"拉高,為單片機檢測DS18B20的輸出電平作準(zhǔn)備 for(time=0;time<2;time+) ; /延時約6us,使主機在15us內(nèi)采樣 if(DQ=1) dat|=0x80; /如果讀到的數(shù)據(jù)是1,則將1存入datelse dat|=0x00;/如果讀到的數(shù)據(jù)是0,則將0存入dat /將單片機檢測到的電平信號DQ存入ri for(time=0;time<8;time+) ; /延時3us,兩個讀時序之間必須有大于1us的恢復(fù)期 return(dat); /返回讀出的十進(jìn)制數(shù)據(jù)void write18b20(unsigned char dat)unsi
13、gned char i=0;unsigned int time;for (i=0; i<8; i+) DQ =1; / 先將數(shù)據(jù)線拉高 _nop_(); /等待一個機器周期 DQ=0; /將數(shù)據(jù)線從高拉低時即啟動寫時序 DQ=dat&0x01; /利用與運算取出要寫的某位二進(jìn)制數(shù)據(jù), /并將其送到數(shù)據(jù)線上等待DS18B20采樣 for(time=0;time<10;time+) ;/延時約30us,DS18B20在拉低后的約1560us期間從數(shù)據(jù)線上采樣 DQ=1; /釋放數(shù)據(jù)線 for(time=0;time<1;time+) ;/延時3us,兩個寫時序間至少需要1
14、us的恢復(fù)期 dat>>=1; /將dat中的各二進(jìn)制位數(shù)據(jù)右移1位 for(time=0;time<4;time+) ; /稍作延時,給硬件一點反應(yīng)時間void displaycent(unsigned char x) unsigned char j,k,l; /j,k,l分別儲存溫度的百位、十位和個位j=x/100; /取百位k=(x%100)/10; /取十位l=x%10; /取個位 writedata12864(digitj); /將百位數(shù)字的字符常量寫入LCDwritedata12864(digitk); /將十位數(shù)字的字符常量寫入LCDwritedata12864
15、(digitl); /將個位數(shù)字的字符常量寫入LCDdelayms(1); /延時1ms給硬件一點反應(yīng)時間 void ready()unsigned int time; star18b20(); /將DS18B20初始化write18b20(0xCC); / 跳過讀序號列號的操作write18b20(0x44); / 啟動溫度轉(zhuǎn)換 for(time=0;time<100;time+) ; /溫度轉(zhuǎn)換需要一點時間star18b20(); /將DS18B20初始化write18b20(0xCC); /跳過讀序號列號的操作write18b20(0xBE); /讀取溫度寄存器,前兩個分別是溫度的
16、低位和高位void check()unsigned char temp1,temp2,temp3,i,j=0;while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;temp3=temp1|temp2;for(i=0;i<10;i+)if(temp3=ai)delayms(20);datj=i+48;writedata12864(datj);writedata12864(' ');j+;if(j=2)goto flag;while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;if(temp1|temp2)!=temp
17、3)delayms(20);break;break;flag:while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;if(temp1|temp2)!=temp3)delayms(20);break;void check2()unsigned char temp1,temp2,temp3,i,j=0;while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;temp3=temp1|temp2;for(i=0;i<10;i+)if(temp3=ai)delayms(20);wordj=i+48;writedata12864(wordj)
18、;writedata12864(' ');j+;if(j=4)goto flag2;while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;if(temp1|temp2)!=temp3)delayms(20);break;break;flag2:while(1)P1=0x0f;temp1=P1;P1=0xf0;temp2=P1;if(temp1|temp2)!=temp3)delayms(20);break;unsigned char rewrite()unsigned char x;x=(dat0-48)*10+(dat1-48);return x
19、;void ffmq()unsigned int i;for(i=0;i<500;i+)fmq=fmq;delayms(1);fmq=1;void password()unsigned char i,j,k,l;delayms(200);writecom12864(0x01);delayms(5);sendchar("請輸入密碼");writecom12864(0x90);sendchar("初始密碼為1234");delayms(200);writecom12864(0x88);check2();i=read_24c08(1);j=read_24
20、c08(2);k=read_24c08(3);l=read_24c08(4);while(word0-48)!=i|(word1-48)!=j|(word2-48)!=k|(word3-48)!=l)ffmq();writecom12864(0x01);delayms(5);sendchar("密碼錯誤");writecom12864(0x90);sendchar("請重新輸入");writecom12864(0x88);check2();void fjdq()jdq=0;delayms(200);jdq=1;void welcome()writecom
21、12864(0x01);delayms(5);writecom12864(0x92);sendchar("歡迎使用");writecom12864(0x8a);sendchar("本萬年歷");delayms(3000);writecom12864(0x01);delayms(5);star12864();void main()unsigned char temp1,temp2;unsigned char TL; /儲存暫存器的溫度低位 unsigned char TH; /儲存暫存器的溫度高位 unsigned char TN; /儲存溫度的整數(shù)部分u
22、nsigned char TD;EA=1;EX0=1;IT0=1;/P2=0x7f;SDA=1;SCL=1;/*write_24c08(1,1);write_24c08(2,2);write_24c08(3,3);write_24c08(4,4); */star12864();welcome();while(1)writecom12864(0x80);sendchar("日期");writedata12864(':');temp1=read_1302(0x8d);temp2=(temp1&0x70)>>4)*10 + (temp1&
23、;0x0F);deal(temp2);writedata12864('-');temp1=read_1302(0x89);temp2=(temp1&0x70)>>4)*10 + (temp1&0x0F);deal(temp2);writedata12864('-');temp1=read_1302(0x87);temp2=(temp1&0x70)>>4)*10 + (temp1&0x0F);deal(temp2);writecom12864(0x90);sendchar("時間");wr
24、itedata12864(':');temp1=read_1302(0x85);temp2=(temp1&0x70)>>4)*10 + (temp1&0x0F);deal(temp2);writedata12864(':');temp1=read_1302(0x83);temp2=(temp1&0x70)>>4)*10 + (temp1&0x0F);deal(temp2);writedata12864(':');temp1=read_1302(0x81);temp2=(temp1&0
25、x70)>>4)*10 + (temp1&0x0F);deal(temp2);temp1=read_1302(0x8b);temp2=(temp1&0x80)>>4)*10 + (temp1&0x0F);writecom12864(0x88);sendchar("星期");switch(temp2)case 1 :sendchar("一");break;case 2 :sendchar("二");break;case 3 :sendchar("三");break;ca
26、se 4 :sendchar("四");break;case 5 :sendchar("五");break;case 6 :sendchar("六");break;case 7 :sendchar("天");break;writecom12864(0x98);sendchar("溫度");writedata12864(':');ready();TL=read18b20(); /先讀的是溫度值低位TH=read18b20(); /接著讀的是溫度值高位TN=TH*16+TL/16;
27、/實際溫度值=(TH*256+TL)/16,即:TH*16+TL/16 /這樣得出的是溫度的整數(shù)部分,小數(shù)部分被丟棄了 TD=(TL%16)*10/16; /計算溫度的小數(shù)部分,將余數(shù)乘以10再除以16取整, /這樣得到的是溫度小數(shù)部分的第一位數(shù)字(保留1位小數(shù)) displaycent(TN);writedata12864('.'); /顯示溫度的整數(shù)部分 writedata12864(digitTD); /顯示溫度的小數(shù)部分sendchar(""); delayms(10); void interr1() interrupt 0unsigned char
28、 temp;while(P32=0);writecom12864(0x0f);writecom12864(0x06);writecom12864(0x01);delayms(5);sendchar("K5鍵修改時鐘");writecom12864(0x90);sendchar("K6鍵修改密碼");writecom12864(0x88);while(K5=1&K6=1);if(K5=0)while(K5=0);password();fjdq();write_1302(0x8E,0x00);writecom12864(0x01);delayms(5
29、);writecom12864(0x80);sendchar("請輸入年份(099)");writecom12864(0x90);check();temp=rewrite();write_1302(0x8c,(temp/10)<<4|(temp%10);/ writecom12864(0x01);delayms(5);sendchar("請輸入月份(112)");writecom12864(0x90);check();temp=rewrite();write_1302(0x88,(temp/10)<<4|(temp%10);/writecom12864(0x01);delayms(5);sendchar("請輸入日期(031)");writecom12864(0x90);check();temp=rewrite();write_1302(0x86,(temp/10)<<4|(temp%10);/writecom12864(0x01);delayms(5);sendchar("請輸入小時(023)");writecom12864(0x90);check();temp=rewrite();write_
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 基于AI技術(shù)的2025年在線教育平臺智能輔導(dǎo)與用戶滿意度研究
- 2025年銀行零售業(yè)務(wù)數(shù)字化營銷轉(zhuǎn)型中的營銷團隊溝通協(xié)作報告
- 推動消費提質(zhì)升級實施方案
- 農(nóng)村留守老人隔代監(jiān)護(hù)能力提升的小組工作介入研究
- 反激式光伏并網(wǎng)逆變器設(shè)計及非線性控制策略研究
- 鶴壁市農(nóng)旅產(chǎn)業(yè)融合發(fā)展策略研究
- 免疫檢查點抑制劑相關(guān)性心肌炎的臨床特征及免疫相關(guān)不良反應(yīng)的T細(xì)胞亞群比例分析
- 基于預(yù)訓(xùn)練語言模型和主題語義信息引導(dǎo)的文本摘要方法研究
- 基于阻尼轉(zhuǎn)矩法的雙饋風(fēng)電機組并網(wǎng)穩(wěn)定性及控制策略研究
- 基于群體智能算法求解柔性作業(yè)車間調(diào)度問題研究
- 互聯(lián)網(wǎng)導(dǎo)論智慧樹知到課后章節(jié)答案2023年下上海第二工業(yè)大學(xué)
- 乙醇酸安全技術(shù)說明書(msds)
- 《旅游學(xué)概論》第七章
- 工程物探-第五章電法勘探課件
- KSS編碼說明電廠KKS編號
- 臺區(qū)線損綜合分析臺區(qū)線損分類及計算方法
- 人民醫(yī)院普外科臨床技術(shù)操作規(guī)范2023版
- 【酒店管理系統(tǒng)的設(shè)計與開發(fā)(論文)】
- 舉一反三- 三年級奧數(shù) - 第37講 面積計算
- 2023年云南玉溪市直事業(yè)單位選調(diào)45人筆試備考試題及答案解析
- 醫(yī)院健康體檢表
評論
0/150
提交評論