附录1 程序代码
#include
#define uchar unsigned char #define uint unsigned int uint num;
static int num1=80; sbit cs=P3^5; sbit rd=P3^6; sbit wr=P3^7; sbit lcden=P1^2; sbit rw=P1^1; sbit lcdrs=P1^0; sbit K2=P3^1; sbit K3=P3^2; sbit K4=P3^3; sbit K5=P3^4;
sbit LED1=P1^4; //警情指示灯 sbit LED2=P1^3; //正常指示灯
sbit DQ=P1^5; //定义DS18B20总线I/O sbit fmq=P1^7;
uchar temp[]={0,0,0,0,0}; uchar temp1[]={0,0,0,0,0}; uchar temp2[5]; uchar temp3[4];
int shangxian=34; //上限报警温度,默认值为38 int xiaxian=6; //下限报警温度,默认值为5 uint a,b,c,d,e,f,g,h;
int ss,ss1,wendu,pinlv1=0;pinlv=0,baojing=0,shezhi=0,dianji=0,moshi=0;
/***************************************************** 函数功能:延时若干毫秒 入口参数:n
***************************************************/ void delayms(uint xms) {
uint a,b;
for(a=xms;a>0;a--) for(b=110;b>0;b--); }
void Delay(uint i) {
while( i-- ); }
28
/***************************************************** 液晶写命令函数
*****************************************************/ void write_com(uchar com) {
lcdrs=0; P0=com;
delayms(5); lcden=1; delayms(5); lcden=0; }
/***************************************************** 液晶写数据函数
*****************************************************/ void write_data(uchar date) {
lcdrs=1; P0=date; delayms(5); lcden=1; delayms(5); lcden=0; }
/***************************************************** 液晶初始化函数
*****************************************************/ void init() {
lcden=0;
write_com(0x38); //液晶初始化 write_com(0x0c); write_com(0x06); write_com(0x01); write_com(0x80); write_com(0x80); }
/***************************************************** 函数功能:按键控制子程序
******************************************************/ void key() { K2=1; if(K2==0)
29
{ }
delayms(5); if(K2==0) {moshi++;
if(moshi==2) moshi=0; dianji=0; while(!K2); }
K3=1;
if(K3==0) {
delayms(5); if(K3==0) { shezhi++;
if(shezhi==4) shezhi=0; while(!K3); } }
if(shezhi>0) {K4=1; if(K4==0) {
delayms(5); if(K4==0)
{ switch(shezhi)
{case 1: num1++; if(num1>=20000) num1=20000; break; case 2: shangxian++; if(shangxian>=100) shangxian=99; break; case 3: xiaxian++; if(shangxian<=xiaxian) xiaxian=shangxian-1; break; }
while(!K4); } } K5=1; if(K5==0) {
delayms(5); if(K5==0)
{switch(shezhi)
30
{case 1: num1--; if(num1<=0) num1=0; break;
case 2: shangxian--; if(shangxian<=xiaxian) shangxian=xiaxian+1; break;
case 3: xiaxian--; if(xiaxian<=0) xiaxian=0; break; } while(!K5); } } } }
/***************************************************** 函数功能:AD0804将模拟信号转换成数字信号
***************************************************/ void adstart() {
cs=0; _nop_(); wr=0; _nop_(); wr=1; _nop_(); cs=1; }
uchar A_D() {
uchar a; P2=0xff; cs=0; _nop_(); rd=0; _nop_(); a=P2; _nop_(); rd=1; _nop_(); cs=1; _nop_(); wr=0; return a; }
/*****初始化DS18B20*****/ void Init_DS18B20(void) {
31
unsigned char x=0; DQ=1;
Delay(8); //稍做延时
DQ=0; //单片机将DQ拉低 Delay(80); //精确延时,大于480us DQ=1; //拉高总线 Delay(14);
x=DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败 Delay(20); }
/*****读一个字节*****/
unsigned char ReadOneChar(void) {
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(4); }
return(dat); }
/*****写一个字节*****/
void WriteOneChar(unsigned char dat) {
unsigned char i=0; for (i=8; i>0; i--) {
DQ=0;
DQ=dat&0x01; Delay(5); DQ=1; dat>>=1; } }
void Tmpchange(void) //发送温度转换命令 {
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
32