基于单片机火灾报警器程序文件.docx
《基于单片机火灾报警器程序文件.docx》由会员分享,可在线阅读,更多相关《基于单片机火灾报警器程序文件.docx(22页珍藏版)》请在冰豆网上搜索。
基于单片机火灾报警器程序文件
基于单片机火灾报警器程序
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
#defineAddWr0x90//写数据地址
#defineAddRd0x91//读数据地址
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
sbitRS=P1^0;//定义端口
sbitRW=P1^1;
sbitEN=P2^5;
sbitDU=P2^6;
sbitWE=P2^7;
sbitDS=P2^2;
sbitFM=P2^3;
sbitRST=P2^4;//时钟加上后可以关掉DS1302芯片输出
sbitSda=P2^0;//定义总线连接端口
sbitScl=P2^1;
sbitLED1=P1^0;//定义指示灯端口
sbitLED2=P1^2;
sbitLED3=P1^4;
sbitLED4=P1^6;
//sbitLED5=P1^1;
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//键盘引脚定义
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
#defineKeyPortP3
bitADFlag;//定义AD采样标志位
uinttemp;
ucharADtemp;//定义中间变量
ucharw;
ucharw1=30;
uchary;
uchary1=80;
ucharnum;
voidDelayUs2x(unsignedchart)
{
while(--t);
}
/*------------------------------------------------
mS延时函数,含有输入参数unsignedchart,无返回值
unsignedchar是定义无符号字符变量,其值的围是
0~255这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*/
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
//按键扫描函数,返回扫描键值
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
unsignedcharKeyScan(void)
{
unsignedcharkeyvalue;
if(KeyPort!
=0xff)
{
DelayMs
(1);
if(KeyPort!
=0xff)
{
keyvalue=KeyPort;
while(KeyPort!
=0xff);
switch(keyvalue)
{
//case0xfe:
return1;break;
//case0xfd:
return2;break;
//case0xfb:
return3;break;
//case0xf7:
return4;break;
case0xef:
return5;break;
case0xdf:
return6;break;
case0xbf:
return7;break;
case0x7f:
return8;break;
default:
return0;break;
}
}
}
return0;
}
voidkeyvalue()//键盘功能程序
{
num=KeyScan();//循环调用按键扫描
switch(num)
{
case5:
w1++;break;
case6:
w1--;break;
case7:
y1++;break;
case8:
y1--;break;
default:
break;
}
}
/*烟雾采集程序*/
/*------------------------------------------------
初始化定时器1
------------------------------------------------*/
voidInit_Timer0(void)
{
TMOD=0x01;
TH0=0xff;/*Initvalue*/
TL0=0x00;
//PT1=1;/*优先级*/
EA=1;/*interuptenable*/
ET0=1;/*enabletimer1interrupt*/
TR0=1;
}
/*------------------------------------------------
启动IIC总线
------------------------------------------------*/
voidStart(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC总线
------------------------------------------------*/
voidStop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*------------------------------------------------
应答IIC总线
------------------------------------------------*/
voidAck(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------
非应答IIC总线
------------------------------------------------*/
voidNoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------
发送一个字节
------------------------------------------------*/
voidSend(unsignedcharData)
{
ucharBitCounter=8;
uchartemp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
读入一个字节并返回
------------------------------------------------*/
unsignedcharRead(void)
{
uchartemp=0;
uchartemp1=0;
ucharBitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------
写入DA数模转换值
------------------------------------------------*/
voidDAC(unsignedcharData)
{
Start();
Send(AddWr);//写入芯片地址
Ack();
Send(0x40);//写入控制位,使能DAC输出
Ack();
Send(Data);//写数据
Ack();
Stop();
}
/*------------------------------------------------
读取AD模数转换的值,有返回值
------------------------------------------------*/
unsignedcharReadADC(unsignedcharChl)
{
ucharData;
Start();//写入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
//Chl的值分别为0、1、2、3,分别代表1-4通道
Ack();
Start();
Send(AddRd);//读入地址
Ack();
Data=Read();//读数据
Scl=0;
NoAck();
Stop();
returnData;//返回值
}
voidyanwuget()//获得烟雾值
{
if(ADFlag)//定时采集输入模拟量
{
ADFlag=0;
}
ADtemp=ReadADC(3);
}
/*DS18B20数据采集*/
voiddelay(uintcount)//延时函数
{
uinti;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
voidInit_Com(void)//串口初始化,波特率9600,方式1
{
TMOD=0x20;
PCON=0x00;
SCON=0x50;
TH1=0xFd;
TL1=0xFd;
TR1=1;
PT1=1;
}
voiddsreset(void)//发送复位和初始化命令
{
uinti;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}
bittmpreadbit(void)//readabit
{
uinti;
bitdat;
DS=0;i++;//i++fordelay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)//readabytedate
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
voidtmpwritebyte(uchardat)//向DS18B20写一位
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;//写0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}
}
}
voidtmpchange(void)//DS18B20beginchange
{
dsreset();
delay
(1);
tmpwritebyte(0xcc);//addressalldriversonbus
tmpwritebyte(0x44);//initiatesasingletemperatureconversion
}
uinttmp()//getthetemperature
{
floattt;
uchara,b;
dsreset();
delay
(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8;//twobytecomposeaintvariable
temp=temp|a;
tt=temp*0.05;
temp=tt*10+0.5;
returntemp;
}
voidreadrom()//readtheserial
{
ucharsn1,sn2;
dsreset();
delay
(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}
/*LCD显示程序*/
voidcmg(void)//数码管锁存函数关时钟DS1302
{
DU=1;
P0=0x00;
DU=0;
WE=1;
P0=0x00;
WE=0;
RST=0;//关时钟DS1302
}
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
}
/*------------------------------------------------
写入命令函数
------------------------------------------------*/
voidLCD_Write_Com(unsignedchar)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_Write_Com(0x08);/*显示关闭*/
LCD_Write_Com(0x01);/*显示清屏*/
LCD_Write_Com(0x06);/*显示光标移动设置*/
DelayMs(5);
LCD_Write_Com(0x0C);/*显示开及光标设置*/
}
voidwendudisplay(uinttemp)//温度显示程序
{
uchara[20];
ucharA1,A2,A2t,A3,ser,A4,A5;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
A4=w1/10;
A5=w1%10;
A1=A1+'0';
A2=A2+'0';
A3=A3+'0';
A4=A4+'0';
A5=A5+'0';
a[0]=A1;
a[1]=A2;
a[2]=46;
a[3]=A3;
a[4]='';
a[5]=67;
a[6]='';
a[7]='';
a[8]=76;
a[9]=58;
a[10]=A4;
a[11]=A5;
a[12]='\0';
LCD_Write_String(2,0,a);
}
voidyanwudisplay(uinttemp)//浓度显示程序
{
ucharb[20];
ucharA1,A2,A2t,A3,A3t,A4,A5,A6,A6t,A7,A7t,A8;
A1=temp/1000;
A2t=temp%1000;
A2=A2t/100;
A3t=A2t%100;
A3=A3t/10;
A4=A3t%10;
A5=y1/1000;
A6t=y1%1000;
A6=A6t/100;
A7t=A6t%100;
A7=A7t/10;
A8=A7t%10;
A1=A1+'0';
A2=A2+'0';
A3=A3+'0';
A4=A4+'0';
A5=A5+'0';
A6=A6+'0';
A7=A7+'0';
A8=A8+'0';
b[0]=A1;
b[1]=A2;
b[2]=A3;
b[3]=A4;
b[4]='p';
b[5]='p';
b[6]='m';
b[7]='';
b[8]=76;
b[9]=58;
b[10]=A5;
b[11]=A6;
b[12]=A7;
b[13]=A8;
b[14]='\0';
LCD_Write_String(2,1,b);
}
voidbeep(void)//蜂鸣器函数
{
FM=0;
delay(100);
FM=1;
}
voidbaojing(void)//报警程序
{