烟雾传感器的matlab程序,基于51单片机的烟雾传感器程序

#include

#include

#define uchar unsigned char                // 以后unsigned char就可以用uchar代替

#define uint  unsigned int                // 以后unsigned int 就可以用uint 代替

sfr ISP_DATA  = 0xe2;                        // 数据寄存器

sfr ISP_ADDRH = 0xe3;                        // 地址寄存器高八位

sfr ISP_ADDRL = 0xe4;                        // 地址寄存器低八位

sfr ISP_CMD   = 0xe5;                        // 命令寄存器

sfr ISP_TRIG  = 0xe6;                        // 命令触发寄存器

sfr ISP_CONTR = 0xe7;                        // 命令寄存器

sbit ADC_CS   = P1^0;                         // ADC0832的CS引脚

sbit ADC_CLK  = P1^1;                         // ADC0832的CLK引脚

sbit ADC_DAT  = P1^2;                 // ADC0832的DI/DO引脚

sbit LcdRs_P  = P2^7;                     // 1602液晶的RS管脚

sbit LcdRw_P  = P2^6;                     // 1602液晶的RW管脚

sbit LcdEn_P  = P2^5;                     // 1602液晶的EN管脚

sbit Key1_P   = P3^2;                        // 减按键

sbit Key2_P   = P3^3;                        // 加按键

sbit Buzzer_P = P2^0;                        // 蜂鸣器

sbit Led_P    = P2^1;                        // LED灯

uchar gAlarm;                                        // 报警值

/*********************************************************/

// 单片机内部EEPROM不使能

/*********************************************************/

void ISP_Disable()

{

ISP_CONTR = 0;

ISP_ADDRH = 0;

ISP_ADDRL = 0;

}

/*********************************************************/

// 从单片机内部EEPROM读一个字节,从0x2000地址开始

/*********************************************************/

unsigned char EEPROM_Read(unsigned int add)

{

ISP_DATA  = 0x00;

ISP_CONTR = 0x83;

ISP_CMD   = 0x01;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

// 对STC89C51系列来说,每次要写入0x46,再写入0xB9,ISP/IAP才会生效

ISP_TRIG  = 0x46;

ISP_TRIG  = 0xB9;

_nop_();

ISP_Disable();

return (ISP_DATA);

}

/*********************************************************/

// 往单片机内部EEPROM写一个字节,从0x2000地址开始

/*********************************************************/

void EEPROM_Write(unsigned int add,unsigned char ch)

{

ISP_CONTR = 0x83;

ISP_CMD   = 0x02;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

ISP_DATA  = ch;

ISP_TRIG  = 0x46;

ISP_TRIG  = 0xB9;

_nop_();

ISP_Disable();

}

/*********************************************************/

// 擦除单片机内部EEPROM的一个扇区

// 写8个扇区中随便一个的地址,便擦除该扇区,写入前要先擦除

/*********************************************************/

void Sector_Erase(unsigned int add)

{

ISP_CONTR = 0x83;

ISP_CMD   = 0x03;

ISP_ADDRH = (unsigned char)(add>>8);

ISP_ADDRL = (unsigned char)(add&0xff);

ISP_TRIG  = 0x46;

ISP_TRIG  = 0xB9;

_nop_();

ISP_Disable();

}

/*********************************************************/

// 毫秒级的延时函数,time是要延时的毫秒数

/*********************************************************/

void DelayMs(uint time)

{

uint i,j;

for(i=0;i

for(j=0;j<112;j++);

}

/*********************************************************/

// 1602液晶写命令函数,cmd就是要写入的命令

/*********************************************************/

void LcdWriteCmd(uchar cmd)

{

LcdRs_P = 0;

LcdRw_P = 0;

LcdEn_P = 0;

P0=cmd;

DelayMs(2);

LcdEn_P = 1;

DelayMs(2);

LcdEn_P = 0;

}

/*********************************************************/

// 1602液晶写数据函数,dat就是要写入的数据

/*********************************************************/

void LcdWriteData(uchar dat)

{

LcdRs_P = 1;

LcdRw_P = 0;

LcdEn_P = 0;

P0=dat;

DelayMs(2);

LcdEn_P = 1;

DelayMs(2);

LcdEn_P = 0;

}

/*********************************************************/

// 1602液晶初始化函数

/*********************************************************/

void LcdInit()

{

LcdWriteCmd(0x38);        // 16*2显示,5*7点阵,8位数据口

LcdWriteCmd(0x0C);        // 开显示,不显示光标

LcdWriteCmd(0x06);        // 地址加1,当写入数据后光标右移

LcdWriteCmd(0x01);        // 清屏

}

/*********************************************************/

// 液晶光标定位函数

/*********************************************************/

void LcdGotoXY(uchar line,uchar column)

{

// 第一行

if(line==0)

LcdWriteCmd(0x80+column);

// 第二行

if(line==1)

LcdWriteCmd(0x80+0x40+column);

}

/*********************************************************/

// 液晶输出字符串函数

/*********************************************************/

void LcdPrintStr(uchar *str)

{

while(*str!='\0')

LcdWriteData(*str++);

}

/*********************************************************/

// 液晶输出数字

/*********************************************************/

void LcdPrintNum(uchar num)

{

LcdWriteData(num/100+48);                        // 百位

LcdWriteData(num%100/10+48);                // 十位

LcdWriteData(num%10+48);                         // 个位

}

/*********************************************************/

// 液晶显示初始化

/*********************************************************/

void LcdShowInit()

{

LcdGotoXY(0,0);                                                // 液晶光标定位到第0行

LcdPrintStr("  MQ-2 System   ");                // 液晶第0行显示"  MQ-2 System   "

LcdGotoXY(1,0);                                                // 液晶光标定位到第1行

LcdPrintStr("Gas:    Warn:   ");                        // 液晶第1行显示"Gas:    Warn:   "

}

/*********************************************************/

// ADC0832的时钟脉冲

/*********************************************************/

void WavePlus()

{

_nop_();

ADC_CLK = 1;

_nop_();

ADC_CLK = 0;

}

/*********************************************************/

// 获取指定通道的A/D转换结果

/*********************************************************/

uchar Get_ADC0832()

{

uchar i;

uchar dat1=0;

uchar dat2=0;

ADC_CLK = 0;                                // 电平初始化

ADC_DAT = 1;

_nop_();

ADC_CS = 0;

WavePlus();                                // 起始信号

ADC_DAT = 1;

WavePlus();                                // 通道选择的第一位

ADC_DAT = 0;

WavePlus();                                // 通道选择的第二位

ADC_DAT = 1;

for(i=0;i<8;i++)                        // 第一次读取

{

dat1<<=1;

WavePlus();

if(ADC_DAT)

dat1=dat1|0x01;

else

dat1=dat1|0x00;

}

for(i=0;i<8;i++)                        // 第二次读取

{

dat2>>= 1;

if(ADC_DAT)

dat2=dat2|0x80;

else

dat2=dat2|0x00;

WavePlus();

}

_nop_();                                        // 结束此次传输

ADC_DAT = 1;

ADC_CLK = 1;

ADC_CS  = 1;

if(dat1==dat2)                                // 返回采集结果

return dat1;

else

return 0;

}

/*********************************************************/

// 按键扫描

/*********************************************************/

void KeyScanf()

{

if(Key1_P==0)                                                        // 如果减按键被按下

{

if(gAlarm>1)                                                // 只有gAlarm大于1才能减1

gAlarm--;

LcdGotoXY(1,13);                                        // 液晶光标定位到第1行第13列

LcdPrintNum(gAlarm);                                // 刷新改变后的报警值

DelayMs(250);                                                // 延时一下

Sector_Erase(0x2000);                                // 存入EEPROM前先擦除

EEPROM_Write(0x2000,gAlarm);                // 报警值存入EEPROM的0x2000这个地址

}

if(Key2_P==0)                                                        // 如果加按键被按下

{

if(gAlarm<100)                                        // 只有gAlarm小于100才能加1

gAlarm++;

LcdGotoXY(1,13);                                        // 液晶光标定位到第1行第13列

LcdPrintNum(gAlarm);                                // 刷新改变后的报警值

DelayMs(250);                                                // 延时一下

Sector_Erase(0x2000);                                // 存入EEPROM前先擦除

EEPROM_Write(0x2000,gAlarm);                // 报警值存入EEPROM的0x2000这个地址

}

}

/*********************************************************/

// 报警判断

/*********************************************************/

void AlarmJudge(uchar dat)

{

if(dat>gAlarm)

{

Buzzer_P=0;                // 蜂鸣器报警

Led_P=0;                        // LED灯亮

}

else

{

Buzzer_P=1;                // 蜂鸣器停止报警

……………………

…………限于本文篇幅 余下代码请从51黑下载附件…………

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值