|
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #include"eeprom52.h" //調(diào)用STC89C52單片機(jī)的EEPROM控制程序
- #include "math.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- #define LCD1602_dat P0 //LCD1602的數(shù)據(jù)傳輸IO口
- sbit LCD1602_rs=P3^5;//LCD1602命令數(shù)據(jù)控制IO
- sbit LCD1602_rw=P3^6; //LCD1602讀寫(xiě)IO控制
- sbit LCD1602_e=P3^4; //數(shù)據(jù)脈沖輸入
- sbit DIN = P2^0; //串行數(shù)據(jù)輸入端
- sbit DCLK = P2^1; //I/O時(shí)鐘輸入
- sbit DOUT = P2^5; //串行數(shù)據(jù)輸出端
- sbit CS = P3^7; //片選腳IO
- #define AD_CH3 0xe4
- float zhi; //暫存讀取的輸入變量
- int temp; //讀取熱敏溫度計(jì)的溫度數(shù)據(jù)
- void delay(uint T) //系統(tǒng)延時(shí)程序
- {
- while(T--);
- }
- /*=========================================
- 函數(shù) :SPI_Write(uchar DAT)
- 參數(shù) :DAT需要發(fā)送的數(shù)據(jù)
- 返回值 :無(wú)
- 描述 :發(fā)送一個(gè)字節(jié)數(shù)據(jù)
- ==========================================*/
- void SPI_Write(uchar DAT)
- {
- uchar i;
- for(i=0;i<8;i++) //分別寫(xiě)8次,每次寫(xiě)一位
- {
- DCLK = 0; //拉低時(shí)鐘總,允許DIN變化
- if(DAT & 0x80) //先寫(xiě)數(shù)據(jù)最高位
- DIN = 1; //寫(xiě)1
- else
- DIN = 0; //寫(xiě)0
- DCLK = 1; //拉高時(shí)鐘,讓從位機(jī)讀取DIN
- DAT <<=1;
- }
- }
- /*========================================
- 函數(shù) :ReadByte()
- 參數(shù) :無(wú)
- 返回值 :返回讀出的數(shù)據(jù)
- =========================================*/
- uint SPI_Read()
- {
- uchar i;
- uint DAT;
- for(i=0;i<12;i++) //分別讀12次,每次讀一位
- {
- DAT <<=1; //數(shù)據(jù)左移一位,準(zhǔn)備接收一位
- DCLK = 1; //拉高時(shí)鐘總線,讀取SDA上的數(shù)據(jù)
- DCLK = 0; //拉低時(shí)鐘總線,允許從機(jī)控制SDA變化
- if(DOUT)
- DAT |= 0x01; //為1則寫(xiě)1,否則不執(zhí)行寫(xiě)1,通過(guò)左移補(bǔ)零
- }
- return(DAT); //返回讀出的數(shù)據(jù)
- }
- /*=======================================
- 函數(shù) :PCF8591Read(uchar cmd)
- 參數(shù) :cmd XPT2046控制字節(jié)
- 返回值 :AD轉(zhuǎn)出的數(shù)字量
- 描述 :讀指定通道的輸入的模擬量轉(zhuǎn)為數(shù)字量
- ========================================*/
- uint ReadAD(uchar cmd)
- {
- uint DAT;
- CS = 0;
- SPI_Write(cmd);
- DCLK = 0; //拉低時(shí)鐘總線
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- DAT = SPI_Read();
- CS = 1;
- return(DAT); //返回讀出數(shù)據(jù)
- }
- /********************************************************************
- * 名稱 : LCD1602_write(uchar order,dat)
- * 功能 : 1602寫(xiě)如數(shù)據(jù)函數(shù)
- * 輸入 : 輸入的命令值
- * 輸出 : 無(wú)
- ***********************************************************************/
- void LCD1602_write(uchar order,dat) //1602 一個(gè)字節(jié) 處理
- {
- LCD1602_e=0;
- LCD1602_rs=order;
- LCD1602_dat=dat;
- LCD1602_rw=0;
- LCD1602_e=1;
- delay(1);
- LCD1602_e=0;
- }
- /********************************************************************
- * 名稱 : LCD1602_writebye(uchar *prointer)
- * 功能 : 1602寫(xiě)入數(shù)據(jù)函數(shù) 指針式
- * 輸入 : 輸入的命令值
- * 輸出 : 無(wú)
- ***********************************************************************/
- void LCD1602_writebyte(uchar *prointer) //1602 字符串 處理
- {
- while(*prointer!='\0')
- {
- LCD1602_write(1,*prointer);
- prointer++;
- }
- }
- /********************************************************************
- * 名稱 : LCD1602_cls()
- * 功能 : 初始化1602液晶
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void LCD1602_cls() //1602 初始化
- {
- LCD1602_write(0,0x01); //1602 清屏 指令
- delay(1500);
- LCD1602_write(0,0x38); // 功能設(shè)置 8位、5*7點(diǎn)陣
- delay(1500);
- LCD1602_write(0,0x0c); //設(shè)置 光標(biāo) 不顯示開(kāi)關(guān)、不顯示光標(biāo)、字符不閃爍
- LCD1602_write(0,0x06);
- LCD1602_write(0,0xd0);
- delay(1500);
- }
- /********************************************************************
- * 名稱 : show()
- * 功能 : LCD1602液晶顯示程序
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void show() //顯示數(shù)據(jù)
- {
- LCD1602_write(0,0x80); //顯示位置設(shè)定
- LCD1602_writebyte("Temp:"); //顯示當(dāng)前溫度值
- if(temp>=0) //顯示溫度整數(shù)部分
- {
- if(temp>999)LCD1602_write(1,0x30+temp/1000%10);
- else LCD1602_writebyte(" ");
- if(temp>99)LCD1602_write(1,0x30+temp/100%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+temp/10%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }else
- {
- LCD1602_writebyte("-"); //顯示溫度負(fù)數(shù)部分
- if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+(temp*-1)%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C ");
- }
- /********************************************************************
- * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- * 功能 : 根據(jù)當(dāng)前熱敏電阻的阻值、以及參數(shù)、通過(guò)Sin曲線求出當(dāng)前系統(tǒng)的溫度值 并返回浮點(diǎn)型的溫度值
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- {
- /*
- Rx: 熱敏電阻當(dāng)前阻值
- B: 熱敏電阻參數(shù)B值
- Revise: 校正溫度
- BasicRx: 熱敏電阻25度時(shí)電阻(標(biāo)稱電阻數(shù)值)
- 返回: 攝氏度
- */
- Rx = Rx / BasicRx;
- Rx = log(Rx);
- Rx = (Rx) / B;
- Rx = Rx + 0.003356;
- Rx = 1 / Rx;
- Rx = Rx - 273.13;
- Rx = Rx + Revise;
- return Rx;
- }
- /********************************************************************
- * 名稱 : void main()
- * 功能 : 系統(tǒng)主程序
- * 輸入 : 無(wú)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void main()
- {
- float Rad; //生成運(yùn)算暫存變量
- LCD1602_cls(); //LCD1602初始化程序調(diào)用
- while(1)
- {
- zhi=(float)ReadAD(AD_CH3)/819.0; //計(jì)算電壓值
- Rad=zhi/((5.0-zhi)/10000.0); //計(jì)算熱敏電阻當(dāng)前阻值
- temp=(int)((temp * 0.5) + (TempCalculate(Rad,4200.0,0,10000.0) * 0.5)*10);//求出當(dāng)前系統(tǒng)的當(dāng)前溫度
- show(); //顯示函數(shù)
- }
- }
復(fù)制代碼 |
|