//程序头函数
#include <reg52.h>
#include <intrins.h> //包含头文件
//显示函数
#include <display.h>
#include "eeprom52.h"
//宏定义
#define uint unsigned int
#define uchar unsigned char
//管脚声明
sbit LED_R= P2^2; //红色指示灯
sbit LED_G= P2^0; //绿色指示灯
sbit FENG = P2^5; //蜂鸣器
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^3; //ADC0832引脚
//按键
sbit Key1=P2^6;
sbit Key2=P2^7;
sbit Key3=P3^7;
/*******************************定义全局变量********************************/
unsigned char dat = 0; //AD值
unsigned char CH=0; //通道变量
unsigned int sum=0; //平均值计算时的总数
unsigned char m=0;
bit bdata flag; //定义位变量
uchar set; //设置变量
//函数声明
extern void Key();
//酒精含量变量
uchar temp=0;
//指示灯变量
uchar WARNING=25; //报警值变量
/******************把数据保存到单片机内部eeprom中******************/
void write_eeprom()
{
SectorErase(0x2000);
byte_write(0x2000, WARNING);
byte_write(0x2060, a_a);
}
/******************把数据从单片机内部eeprom中读出来*****************/
void read_eeprom()
{
WARNING = byte_read(0x2000);
a_a = byte_read(0x2060);
}
/**************开机自检eeprom初始化*****************/
void init_eeprom()
{
read_eeprom(); //先读
if(a_a != 1) //新的单片机初始单片机内问eeprom
{
WARNING = 25;
a_a = 1;
write_eeprom(); //保存数据
}
}
/****************************************************************************
函数功能:AD转换子程序
入口参数:CH
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char CH)
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
Clk = 0;
DATI = 1; //通道0的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0; //通道0的第二位
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1; //通道1的第一位
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1; //通道1的第二位
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
Clk = 1;
return dat;
}
void init() //定时器初始化函数
{
TMOD=0x01; //定时器工作方式
TL0=0xb0;
TH0=0x3c; //赋初值50ms
EA=1; //打开中断总开关
ET0=1; //打开定时器0中断允许开关
TR0=1; //打开定时器0定时开关
}
void main() //主函数
{
Init1602(); //初始化液晶函数
init(); //初始化定时器
init_eeprom(); //开始初始化保存的数据
while(1) //进入循环
{
for(m=0;m<50;m++) //读50次AD值
sum = adc0832(0)+sum; //读到的AD值,将读到的数据累加到sum
temp=sum/50; //跳出上面的for循环后,将累加的总数除以50得到平均值temp
sum=0; //平均值计算完成后,将总数清零
if(set==0) //set为0,说明现在不是设置状态
Display_1602(temp,WARNING); //显示AD数值和报警值
if(temp<WARNING&&set==0) //AD数值小于报警值
{
flag=0; //关闭报警
}
else if(temp>WARNING&&set==0)//AD值大于报警值
{
flag=1; //打开报警
}
Key(); //调用按键函数
}
}
void Key() //按键函数
{
if(Key1==0) //设置键按下
{
while(Key1==0); //按键松开
FENG=0; //蜂鸣器响
set++; //设置变量加
flag=0; //关闭报警
TR0=0; //关闭定时器
}
if(set==1) //设置报警值时
{
write_com(0x38);//屏幕初始化
write_com(0x80+0x40+7);//位置
write_com(0x0f);//打开显示 无光标 光标闪烁
write_com(0x06);//当读或写一个字符是指针后一一位
FENG=1; //关闭蜂鸣器
}
else if(set>=2) //设置完成时
{
set=0; //变量清零
write_com(0x38);//屏幕初始化
write_com(0x0c);//打开显示 无光标 无光标闪烁
FENG=1; //关闭蜂鸣器
flag=1; //打开报警
TR0=1; //打开定时器
}
if(Key2==0&&set!=0) //设置报警值时加键按下
{
while(Key2==0); //按键松开
FENG=0; //打开蜂鸣器
WARNING++; //报警值加
if(WARNING>=255) //最大加到255
WARNING=0; //清零
write_com(0x80+0x40+5); //选中液晶屏上的第二行第十一列
write_data('0'+WARNING/100); //开始显示报警值。例如报警值是123,123除以100的商是1,加上‘0’是为了得到液晶中对应1的显示码
write_data('0'+WARNING%100/10);//123除以100的余数是23,23再除以10得到的商是2
write_data('0'+WARNING%100%10);//23除以10的余数是3
write_com(0x80+0x40+7);//位置
FENG=1; //关闭蜂鸣器
write_eeprom(); //保存数据
}
if(Key3==0&&set!=0) //注释同加按键
{
while(Key3==0);
FENG=0;
WARNING--;
if(WARNING<=0)
WARNING=255;
write_com(0x80+0x40+5);
write_data('0'+WARNING/100);
write_data('0'+WARNING/10%10);
write_data('0'+WARNING%10);
write_com(0x80+0x40+7);//位置
FENG=1;
write_eeprom(); //保存数据
}
}
void time1_int(void) interrupt 1 //定时器工作函数
{
uchar count; //定义计时变量
TL0=0xb0;
TH0=0x3c; //重新赋初值50ms
count++; //变量加一次就是50ms
if(count==10) //加到10次就是500ms
{
if(flag==0) //flag=0时,也就是不开启报警
{
LED_G=0; //绿灯点亮
LED_R=1; //红灯熄灭
FENG=1; //关闭蜂鸣器
}
if(flag==1) //flag为1时,也就是打开报警
{
LED_G=1; //绿灯熄灭
LED_R=0; //红灯点亮
FENG=0; //打开蜂鸣器
}
}
if(count==20) //计数20次,就是1s
{ //在1s时,红绿灯都是熄灭状态,蜂鸣器也是关闭状态,装可以达到闪烁的目的
count=0; //变量清零
if(flag==0) //不是报警状态时
{
LED_G=1;
LED_R=1;
FENG=1;
}
if(flag==1) //报警状态时
{
LED_G=1;
LED_R=1;
FENG=1;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统
共20个文件
bak:3个
dbk:2个
h:2个
1星 需积分: 0 29 下载量 83 浏览量
2022-12-10
22:16:49
上传
评论 4
收藏 119KB RAR 举报
温馨提示
基于51单片机 + MQ-3酒精传感器 + ADC0832模数转换器 + LCD1602液晶显示器的酒精检测系统
资源推荐
资源详情
资源评论
收起资源包目录
酒精测量代码仿真.rar (20个子文件)
酒精测量代码仿真
代码仿真
仿真
LCDShow.PWI 1KB
ISIS.dmp 42KB
LCDShow.DSN 160KB
Backup Of LCDShow.DBK 147KB
Last Loaded LCDShow.DBK 165KB
CODE
alcoholDetection.lnp 49B
AlcoholDetection.uvopt 54KB
AlcoholDetection.uvproj 13KB
yanwu.plg 2KB
display.h 1KB
display.bak 1KB
alcoholDetection.hex 3KB
AlcoholDetection.c 6KB
alcoholDetection.M51 24KB
AlcoholDetection_uvopt.bak 54KB
AlcoholDetection_uvproj.bak 13KB
AlcoholDetection.OBJ 8KB
eeprom52.h 3KB
alcoholDetection 5KB
AlcoholDetection.LST 15KB
共 20 条
- 1
资源评论
- tyj182575773762023-04-29#运行出错,proteus8.10仿真直接出错
诸葛榆木
- 粉丝: 4089
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功