基于单片机火灾报警器程序文件.docx

上传人:b****1 文档编号:14518495 上传时间:2023-06-24 格式:DOCX 页数:26 大小:18.48KB
下载 相关 举报
基于单片机火灾报警器程序文件.docx_第1页
第1页 / 共26页
基于单片机火灾报警器程序文件.docx_第2页
第2页 / 共26页
基于单片机火灾报警器程序文件.docx_第3页
第3页 / 共26页
基于单片机火灾报警器程序文件.docx_第4页
第4页 / 共26页
基于单片机火灾报警器程序文件.docx_第5页
第5页 / 共26页
基于单片机火灾报警器程序文件.docx_第6页
第6页 / 共26页
基于单片机火灾报警器程序文件.docx_第7页
第7页 / 共26页
基于单片机火灾报警器程序文件.docx_第8页
第8页 / 共26页
基于单片机火灾报警器程序文件.docx_第9页
第9页 / 共26页
基于单片机火灾报警器程序文件.docx_第10页
第10页 / 共26页
基于单片机火灾报警器程序文件.docx_第11页
第11页 / 共26页
基于单片机火灾报警器程序文件.docx_第12页
第12页 / 共26页
基于单片机火灾报警器程序文件.docx_第13页
第13页 / 共26页
基于单片机火灾报警器程序文件.docx_第14页
第14页 / 共26页
基于单片机火灾报警器程序文件.docx_第15页
第15页 / 共26页
基于单片机火灾报警器程序文件.docx_第16页
第16页 / 共26页
基于单片机火灾报警器程序文件.docx_第17页
第17页 / 共26页
基于单片机火灾报警器程序文件.docx_第18页
第18页 / 共26页
基于单片机火灾报警器程序文件.docx_第19页
第19页 / 共26页
基于单片机火灾报警器程序文件.docx_第20页
第20页 / 共26页
亲,该文档总共26页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

基于单片机火灾报警器程序文件.docx

《基于单片机火灾报警器程序文件.docx》由会员分享,可在线阅读,更多相关《基于单片机火灾报警器程序文件.docx(26页珍藏版)》请在冰点文库上搜索。

基于单片机火灾报警器程序文件.docx

基于单片机火灾报警器程序文件

基于单片机火灾报警器程序

 

#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;

}

void

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2