?? 溫度main.c
字號:
/* 智能溫度監控系統 */
#include<reg51.h>
#include<intrins.h> //數學程序
#include <absacc.h> //包含允許直接訪問8051不同存儲區的宏定義
#define uchar unsigned char
#define uint unsigned int //定義一下方便于工作使用
#define BUSY 0x80 //lcd忙檢測標志
#define DATAPORT P0 //定義P0口為LCD通訊端口
#define PLAYE_ADDR XBYTE[0XBFFF] //語音報警地址
sbit RED_ALARM=P1^0; //紅色指示燈
sbit WRITE_ALARM=P1^1; //白色指示燈
sbit GREEN_ALARM=P1^2; //綠色指示燈
sbit BLUE_ALARM=P1^3; //藍色指示燈
sbit P1_4=P1^4; //時鐘調整
sbit P1_5=P1^5; //時鐘加
sbit P1_6=P1^6; //時鐘減
sbit DQ = P1^7; //定義ds18b20通信端口
sbit LCM_RS=P2^5; //數據/命令端
sbit LCM_RW=P2^6; //讀/寫選擇端
sbit LCM_EN=P2^7; //使能端
sbit sda=P2^4; //24C02數據端
sbit scl=P2^3; //24C02時鐘端
sbit ad_busy=P3^2; //adc中斷方式接口
sbit RECLED_EOC=P3^5; //ISD1420放音結束查詢標志
sbit OUT=P3^7; //控制輸出端
//變量的定義
uchar ad_data; //ad采樣值存儲
uchar seconde; //定義并初始化時鐘變量,秒
uchar minite; //分
uchar hour; //時
uchar mstcnt=0;
uchar temp1,temp2,temp; //溫度顯示變量
uchar t,set=0;
uchar K;
bit ON_OFF=0;
bit outflag;
bit write=0;
uchar code str0[]={"TI: : : "}; //液晶顯示第一行內容
uchar code str1[]={"SE: C TE: . C"}; //液晶顯示第二行內容
void delay_LCM(uint); //LCD延時子程序
void WriteCommandLCM(uchar WCLCM,uchar BusyC); //寫指令到ICM子函數
void initLCM( void); //LCD初始化子程序
void lcd_wait(void); //LCD檢測忙子程序
void WriteDataLCM(uchar WDLCM); //寫數據到LCM子函數
void DisplayOneChar(uchar X,uchar Y,uchar DData); //顯示指定坐標的一個字符子函數
void DisplayListChar(uchar X,uchar Y,uchar code *DData); //顯示指定坐標的一串字符子函數
void init_timer0(void); //定時器初始化
void displayfun1(void);
void displayfun2(void);
void displayfun3(void);
void displayfun4(void);
void keyscan(void ); //鍵盤掃描子程序
void set_adj(void);
void inc_key(void);
void dec_key(void);
void delay_18B20(unsigned int i);
void Init_DS18B20(void) ; //初始化18B20
uchar ReadOneChar(void);
void WriteOneChar(unsigned char dat);
void ReadTemperature(void);
void ad0809(void);
void playalarm(void);
/*********延時K*1ms,12.000mhz**********/
//LCD延時子程序
void delay_LCM(uint k)
{
uint i,j;
for(i=0;i<k;i++)
{
for(j=0;j<60;j++) {;}
}
}
/**********寫指令到LCM子函數************/
void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
if(BusyC) lcd_wait(); //Busy=1時檢測,若Busy=0則不檢測
DATAPORT=WCLCM;
LCM_RS=0; // 選中指令寄存器
LCM_RW=0; // 寫模式
LCM_EN=1;
_nop_();
_nop_(); //使用_nop_時前面需包括#include <intrins.h>
_nop_();
LCM_EN=0;
}
/**********寫數據到LCM子函數************/
void WriteDataLCM(uchar WDLCM)
{
lcd_wait( ); //檢測忙信號
DATAPORT=WDLCM;
LCM_RS=1; // 選中數據寄存器
LCM_RW=0; // 寫模式
LCM_EN=1; //得到高脈沖
_nop_();
_nop_();
_nop_(); //等數據寫入完成
LCM_EN=0; ////將使能端拉低
}
/***********lcm內部等待函數,檢測忙*************/
void lcd_wait(void)
{
DATAPORT=0xff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY) //在用Proteus仿真時,有時要屏蔽此語句,在調用GotoXY()時,會進入死循環,
//可能在寫該控制字時,該模塊沒有返回寫入完備命令,即DATABPORT&0x80==0x80
//實際硬件時打開此語句
{ LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0; //將使能端拉低
}
/**********LCM初始化子函數***********/
void initLCM( )
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
WriteCommandLCM(0x38,0);
delay_LCM(5);
//以后每次寫指令,讀/寫數據操作之前都要檢測忙信號
WriteCommandLCM(0x38,1); //8bit數據傳送,2行顯示,5*7字型,檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示,檢測忙信號
WriteCommandLCM(0x01,1); //清屏,檢測忙信號
WriteCommandLCM(0x06,1); //顯示光標右移設置,檢測忙信號
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
}
/****************顯示指定坐標的一個字符子函數*************/
void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y=Y&0x01; //Y&=1;
X=X&0x0f; //X&=15;
if(Y) { X|=0x40;} //若y為1(顯示第二行),地址碼+0X40
X|=0x80; //數據指針指令碼=地址碼+0X80
WriteCommandLCM(X,1); //X為要寫入的數據位置地址
WriteDataLCM(DData);
}
/***********顯示指定坐標的一串字符子函數***********/
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength=0;
Y=Y&0x01;
X=X&0x0f;
while(X<16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++; //數據位置地址加1
}
}
/***********ds18b20延遲子函數(晶振12MHz )*******/
void delay_18B20(unsigned int i)
{
while(i--);
}
/**********ds18b20初始化函數**********************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ復位
delay_18B20(8); //稍做延時
DQ = 0; //單片機將DQ拉低
delay_18B20(80); //精確延時 大于 480us
DQ = 1; //拉高總線
delay_18B20(14); //等待復位完成
x=DQ; //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
delay_18B20(20);
}
/***********ds18b20讀一個字節**************/
unsigned char ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 給脈沖信號
dat>>=1;
DQ = 1; // 給脈沖信號
if(DQ)
dat|=0x80;
delay_18B20(4); // wait for rest of timeslot
}
return(dat);
}
/*************ds18b20寫一個字節****************/
void WriteOneChar(uchar dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0; // pull DQ low to start timeslot
DQ = dat&0x01;
delay_18B20(5); // hold value for remainder of timeslot
DQ = 1;
dat>>=1;
}
}
/**************讀取ds18b20當前溫度************/
void ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned char t=0;
Init_DS18B20();
WriteOneChar(0xCC); // 由于只掛接一個18B20,跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
delay_18B20(100); // this message is very important!
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作,可理解為查找器件
WriteOneChar(0xBE); //讀取溫度寄存器等(共讀9個寄存器,包括CRC字節) 前兩個就是溫度
delay_18B20(100);
a=ReadOneChar(); //讀取溫度值低位
b=ReadOneChar(); //讀取溫度值高位
temp1=b<<4;
temp1+=(a&0xf0)>>4; //整數部分
temp2=a&0x0f; //小數部分
temp=((b*256+a)>>4); //當前采集溫度值除16得實際溫度值
}
/***************液晶顯示子函數1正常顯示*****************/
void displayfun1(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0x30); //液晶上顯示時,中間的0表示在第一行顯示
DisplayOneChar(4,0,hour%10+0x30); //數字與其ASCII碼相差0x30
DisplayOneChar(6,0,minite/10+0x30); //液晶上顯示分
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30); //液晶上顯示秒
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(3,1,K/10+0x30); //液晶上顯示設定的溫度,中間的1表示在第二行顯示
DisplayOneChar(4,1,K%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30); //液晶上顯示測得的溫度
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
if(ON_OFF==0) //若溫控標志為0
{
DisplayOneChar(12,0,0x4f); // 液晶上顯示不控溫的標志,"O"
DisplayOneChar(13,0,0x46); // "F"
DisplayOneChar(14,0,0x46); // "F"
}
else
{
DisplayOneChar(12,0,0x4f); // 液晶上顯示控溫的標志,"O"
DisplayOneChar(13,0,0x4e); // "N"
DisplayOneChar(14,0,0x20); // " "
if(outflag==1) //outflag為bit類型
DisplayOneChar(15,0,0x48); //"H" high表超溫
else
DisplayOneChar(15,0,0x4e); //"N" normal
}
}
/************液晶顯示子函數2***************/
void displayfun2(void)
{
WriteCommandLCM(0x0c,1); //顯示屏打開,光標不顯示,不閃爍,檢測忙信號
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(6,0,minite/10+0x30); //液晶上顯示分
DisplayOneChar(7,0,minite%10+0x30);
DisplayOneChar(9,0,seconde/10+0x30); //液晶上顯示秒
DisplayOneChar(10,0,seconde%10+0x30);
DisplayOneChar(3,1,K/10+0x30); //液晶上顯示設定的溫度
DisplayOneChar(4,1,K%10+0x30);
DisplayOneChar(11,1,temp1/10+0x30); //液晶上顯示測得的溫度
DisplayOneChar(12,1,temp1%10+0x30);
DisplayOneChar(14,1,temp2/10+0x30);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -