單片機課程設(shè)計_空調(diào)調(diào)溫_C語言_第1頁
單片機課程設(shè)計_空調(diào)調(diào)溫_C語言_第2頁
單片機課程設(shè)計_空調(diào)調(diào)溫_C語言_第3頁
單片機課程設(shè)計_空調(diào)調(diào)溫_C語言_第4頁
單片機課程設(shè)計_空調(diào)調(diào)溫_C語言_第5頁
已閱讀5頁,還剩11頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、精選文檔一硬件電路圖二實物圖三程序代碼(1).顯示部分LCD1602程序 a.頭文件#ifndef _LCD_H_#define _LCD_H_/*當使用的是4位數(shù)據(jù)傳輸?shù)臅r候定義*/#define LCD1602_4PINS/*包含頭文件*/#include<reg51.h>#define uint unsigned int #define uchar unsigned char/*PIN口定義*/#define LCD1602_DATAPINS P0sbit LCD1602_E=P27;sbit LCD1602_RW=P25;sbit LCD1602_RS=P26;/*函數(shù)聲明

2、*/*在51單片機12MHZ時鐘下的延時函數(shù)*/void Delay1us(uint a);/*LCD1602寫入8位命令子函數(shù)*/void LcdWriteCom(uchar com);/*LCD1602寫入8位數(shù)據(jù)子函數(shù)*/void LcdWriteData(uchar dat);/*LCD1602初始化子程序*/void LcdInit(); #endifb.c程序文件#include"lcd.h"/* 函數(shù)名 : Delay1us* 函數(shù)功能 : 延時函數(shù),延時1us* 輸入 : a* 輸出 : 無*/void Delay1us(uint a)uint b,c;fo

3、r(c=a;c>0;c-)for(b=110;b>0;b-);/* 函數(shù)名 : LcdWriteCom* 函數(shù)功能 : 向LCD寫入一個字節(jié)的命令* 輸入 : com* 輸出 : 無*/#ifndef LCD1602_4PINS /當沒有定義這個LCD1602_4PINS時void LcdWriteCom(uchar com) /寫入命令LCD1602_E=0;LCD1602_RS=0;LCD1602_RW=0;LCD1602_DATAPINS=com;Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;#else void LcdW

4、riteCom(uchar com) /寫入命令LCD1602_E=0;LCD1602_RS=0;LCD1602_RW=0;LCD1602_DATAPINS=com;/由于4位的接線是接到P0口的高四位,所以傳送高四位不用改Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;Delay1us(10);LCD1602_DATAPINS=com<<4;Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;#endif/* 函數(shù)名 : LcdWriteData* 函數(shù)功能 : 向LCD寫入一個字

5、節(jié)的數(shù)據(jù)* 輸入 : dat* 輸出 : 無*/ #ifndef LCD1602_4PINS void LcdWriteData(uchar dat)/寫入數(shù)據(jù)LCD1602_E=0;LCD1602_RS=1;LCD1602_RW=0;LCD1602_DATAPINS=dat;Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;#elsevoid LcdWriteData(uchar dat)/寫入數(shù)據(jù)LCD1602_E=0;LCD1602_RS=1;LCD1602_RW=0;LCD1602_DATAPINS=dat;/由于4位的接線是接到P0口

6、的高四位,所以傳送高四位不用改Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;LCD1602_DATAPINS=dat<<4;Delay1us(10);LCD1602_E=1;Delay1us(10);LCD1602_E=0;#endif/* 函數(shù)名 : LcdInit()* 函數(shù)功能 : 初始化LCD屏* 輸入 : 無* 輸出 : 無*/ #ifndefLCD1602_4PINSvoid LcdInit() /LCD初始化子程序 LcdWriteCom(0x38); /開顯示LcdWriteCom(0x0c); /開顯示不顯示光

7、標LcdWriteCom(0x06); /寫一個指針加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /設(shè)置數(shù)據(jù)指針起點#elsevoid LcdInit() /LCD初始化子程序LcdWriteCom(0x32); /將8位總線轉(zhuǎn)為4位總線LcdWriteCom(0x28); /在四位線下的初始化LcdWriteCom(0x0c); /開顯示不顯示光標LcdWriteCom(0x06); /寫一個指針加1LcdWriteCom(0x01); /清屏LcdWriteCom(0x80); /設(shè)置數(shù)據(jù)指針起點#endif(2).A/D轉(zhuǎn)換部分pcf8591 a8

8、591的頭文件#ifndef _I2C_H_#define _I2C_H_#include<reg51.h>sbit SCL=P21;sbit SDA=P20;void Delay10us(); /延時void I2cStart();void I2cStop();unsigned char I2cSendByte(unsigned char dat);unsigned char I2cReadByte();#endif b8591的c程序文件#include"i2c.h"/* 函數(shù)名 : Delay1us()* 函數(shù)功能 : 延時* 輸入 : 無* 輸出 : 無

9、*/void Delay10us()unsigned char a,b;for(b=1;b>0;b-)for(a=2;a>0;a-);/* 函數(shù)名 : I2cStart()* 函數(shù)功能 : 起始信號:在SCL時鐘信號在高電平期間SDA信號產(chǎn)生一個下降沿* 輸入 : 無* 輸出 : 無* 備注 : 起始之后SDA和SCL都為0*/void I2cStart()SDA=1;Delay10us();SCL=1;Delay10us();/建立時間是SDA保持時間>4.7usSDA=0;Delay10us();/保持時間是>4usSCL=0;Delay10us();/* 函數(shù)名

10、: I2cStop()* 函數(shù)功能 : 終止信號:在SCL時鐘信號高電平期間SDA信號產(chǎn)生一個上升沿* 輸入 : 無* 輸出 : 無* 備注 : 結(jié)束之后保持SDA和SCL都為1;表示總線空閑*/void I2cStop()SDA=0;Delay10us();SCL=1;Delay10us();/建立時間大于4.7usSDA=1;Delay10us();/* 函數(shù)名 : I2cSendByte(unsigned char num)* 函數(shù)功能 : 通過I2C發(fā)送一個字節(jié)。在SCL時鐘信號高電平期間,保持發(fā)送信號SDA保持穩(wěn)定* 輸入 : num* 輸出 : 0或1。發(fā)送成功返回1,發(fā)送失敗返回

11、0* 備注 : 發(fā)送完一個字節(jié)SCL=0*/unsigned char I2cSendByte(unsigned char dat)unsigned char a=0,b=0;/最大255,一個機器周期為1us,最大延時255us。for(a=0;a<8;a+)/要發(fā)送8位,從最高位開始SDA=dat>>7; /起始信號之后SCL=0,所以可以直接改變SDA信號dat=dat<<1;Delay10us();SCL=1;Delay10us();/建立時間>4.7usSCL=0;Delay10us();/時間大于4usSDA=1;Delay10us();SCL=

12、1;while(SDA)/等待應(yīng)答,也就是等待從設(shè)備把SDA拉低b+;if(b>200) /如果超過200us沒有應(yīng)答發(fā)送失敗,或者為非應(yīng)答,表示接收結(jié)束SCL=0;Delay10us();return 0;SCL=0;Delay10us(); return 1;/* 函數(shù)名 : I2cReadByte()* 函數(shù)功能 : 使用I2c讀取一個字節(jié)* 輸入 : 無* 輸出 : dat* 備注 : 接收完一個字節(jié)SCL=0*/unsigned char I2cReadByte()unsigned char a=0,dat=0;SDA=1;/起始和發(fā)送一個字節(jié)之后SCL都是0Delay10us

13、();for(a=0;a<8;a+)/接收8個字節(jié)SCL=1;Delay10us();dat<<=1;dat|=SDA;Delay10us();SCL=0;Delay10us();return dat;(3).main函數(shù)文件#include<reg51.h>#include<stdio.h>#include"i2c.h"#include"lcd.h"#define WRITEADDR 0x90 /I2c的讀地址#define READADDR 0x91 /I2C的寫地址#define uchar unsigne

14、d charsbit ok=P10; /OK按鍵sbit up=P11; /數(shù)字上調(diào)按鍵sbit down=P12;/數(shù)字下調(diào)按鍵sbit red=P36; /紅燈,表示加熱sbit green=P37;/綠燈,表示制冷sbit tiao=P13;/調(diào)溫按鍵char stemp;/存放設(shè)定的溫度值char temp;/存放當前的溫度值uchar temp0;/存放從AD轉(zhuǎn)換器獲得的8為無符號數(shù)void Pcf8591SendByte(unsigned char channel);unsigned char Pcf8591ReadByte();void Pcf8591DaConversion(u

15、nsigned char value); unsigned char gettemp();void displaywendu(char temp);void tiaowen() ;void main()uchar b="T is ",i,c="SettedT is "LcdInit();red=0;green=0;stemp=5;while(1)temp0=gettemp()/4;temp= (char)(temp0)-14;LcdWriteCom(0x80); /在1602上顯示當前溫度for(i=0;i<5;i+)LcdWriteData(bi

16、); displaywendu(temp);LcdWriteCom(0x80+0x0b);/清除1602上表示加熱和制冷的H和C標號,產(chǎn)生閃爍的效果LcdWriteData(' ');LcdWriteCom(0x80+0x40);/顯示設(shè)置的溫度for(i=0;i<11;i+)LcdWriteData(ci); displaywendu(stemp);red=0;green=0; /更具AD轉(zhuǎn)換的結(jié)果,控制紅燈綠燈的亮滅if(temp>=stemp) if(temp-stemp)>2) green=1; LcdWriteCom(0x80+0x0b);LcdWr

17、iteData('C'); if(temp<stemp) if(stemp-temp)>2) red=1; LcdWriteCom(0x80+0x0b);LcdWriteData('H'); if(tiao=0) /檢測調(diào)溫按鈕有沒有按下while(!tiao); tiaowen(); /* 函數(shù)名 : Pcf8591SendByte* 函數(shù)功能 : 寫入一個控制命令* 輸入 : channel(轉(zhuǎn)換通道)* 輸出 : 無*/void Pcf8591SendByte(unsigned char channel)I2cStart();I2cSendBy

18、te(WRITEADDR);/發(fā)送uchar寫器件地址I2cSendByte(0x40|channel);/發(fā)送控制寄存器I2cStop();/* 函數(shù)名 : Pcf8591ReadByte* 函數(shù)功能: 讀取一個轉(zhuǎn)換值* 輸入 : 無* 輸出 : dat*/unsigned char Pcf8591ReadByte()unsigned char dat;I2cStart();I2cSendByte(READADDR);/發(fā)送讀器件地址dat=I2cReadByte();/讀取數(shù)據(jù)I2cStop(); /結(jié)束總線 return dat; /* 函數(shù)名 : gettemp* 函數(shù)功能 :從pcf8591中讀取溫度* 輸入 : * 輸出 : uchar()*/ unsigned char gettemp() unsigned char temp;Pcf8591SendByte(0); /電位器/temp=Pcf8591ReadByte()*2;/將前一次轉(zhuǎn)換結(jié)果讀走Delay1us(0);/延時等待轉(zhuǎn)換完成temp=Pcf8591ReadByte();/讀取這一次轉(zhuǎn)換結(jié)果return temp; /* 函數(shù)名 : displaywendu* 函數(shù)功能 :顯示溫度* 輸入 : * 輸出 : */void displaywendu(char temp

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論