#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黑下载附件…………

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

  1. 51单片机频率计c语言程序,基于51单片机的频率计程序

    这个是电路原理图 *********************************************** **************入门级频率计设计****************** ** ...

  2. 共阳极数码时钟c语言程序,基于51单片机C语言数字钟程序.doc

    基于51单片机C语言数字钟程序 基于51单片机C语言数字钟程序 数字电子钟的设计 一. 绪论 (一)引言 20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地 ...

  3. 74hc164驱动数码管c语言程序,基于51单片机的74HC164驱动数码管显示程序与仿真

    基于51单片机的74HC164驱动数码管显示程序与仿真 基于51单片机的74HC164驱动一位数码管显示程序与仿真 #include #include #define uchar unsigned c ...

  4. 湿度控制c语言程序,基于51单片机的湿度控制系统设计.doc

    基于51单片机的湿度控制系统设计 基于51单片机的湿度控制系统设计 摘要 关键词:单片机:湿度传感器:ADC0832数模转换 目 录 序 言1 第一章 系统的整体设计方案2 1.1设计内容2 1.2系 ...

  5. 水塔水位测量c语言程序,基于51单片机水塔水箱水位检测系统控制器设计(附程序代码)...

    基于51单片机水塔水箱水位检测系统控制器设计(附程序代码)(任务书,开题报告,外文翻译,论文18000字) 摘  要 为了能实现水位监测与控制,以STC89C52作为核心控制芯片,进行了水位检测系统控 ...

  6. 51单片机的电子钟c语言程序,基于51单片机的电子钟C语言程序

    基于单片机C语言的电子钟程序代码与仿真 基于51单片机的电子钟C语言程序: 程序代码 #include #include #define uchar unsigned char #define uin ...

  7. 51lcd显示光传感器c语言程序,基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例...

    基于51单片机1602液晶显示GY-30数字光照传感器BH1750FVI程序实例,系统由GY-30数字光照传感器.51单片机最小系统.1602液晶显示屏组成,电路简单,附件中的程序是实物验证过了的.1 ...

  8. 单片机遥控车c语言程序,基于51单片机的无线遥控小车设计[附发射接收程序]

    /***************************************************************/ /*[基于51单片机的无线遥控小车设计] 作者王*茹 */ /*** ...

  9. 基于51单片机的光照强度检测c语言程序,基于51单片机光照强度检测报告.doc

    基于51单片机光照强度检测报告 课程设计报告 课程名称: 智能仪器课程设计 题 目: 基于51单片机的光照强度 摘要 光敏电阻测光强度系统,该系统可以自动检测光照强度的强弱并显示让人们知道此时光照强度 ...

最新文章

  1. 第三代测序为什么这么贵?
  2. 查看 Android SDK Build-tools 版本号
  3. 内核启动流程分析(三)makefile
  4. buu Cipher
  5. User Mode Driver Management 介绍(二)
  6. Bigtable的些许重点
  7. 微信公众号开发 ssl connect error
  8. 父页面监听iframe路由变化_前端路由原理
  9. 新的实现上下文对话的方法
  10. Calendar与Date用法示例
  11. The 46th ICPC Asia Jinan Regional Contest,2021,46届济南站热身赛
  12. 深度学习11-tf.data详解以及猫狗图片分类实战
  13. timimg学习数据删了_如何评价Timing这个督促人学习的软件?
  14. uva1583-digit generator
  15. f分布表完整图a=0.01_QC七大手法(工具)完整版介绍
  16. 简单用电脑摄像头实现人脸识别
  17. UPnP 端口映射服务威胁分析
  18. 【无标题】解决谷歌浏览器最新chrome94版本CORS跨域问题
  19. 【javafx】如何java查询12306火车票剩余数量
  20. 视频直播微信小程序开发方案

热门文章

  1. 用定时器实现一个闹钟
  2. 设计模式之略见一斑(Template Method模板方法模式)
  3. 计算机等级一级考试excel多少分,计算机等级一级考试Excel技巧
  4. 分析师需要掌握的35个商业模型(一)
  5. Cannot find module 'semver' 错误
  6. 我想过39岁找工作会辛苦,没想到会这么残酷
  7. 法规标准-GB/T 20608标准解读(2006版)
  8. Zookeeper单例搭建与伪集群搭建
  9. arcgis pro 关于地震数据的可视化
  10. 系统测试集成测试单元测试_最终发布的集成测试