版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、智能火灾报警系统仿真源程序#include <reg52.h>#include "eepom52.h"#define uchar unsigned char #define uint unsigned int#include <intrins.h>/数码管段选定义 0 1 2 3 4 5 6 7 8 9uchar code smg_du=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff; /断码/数码管位选定义uchar code
2、 smg_we=0x7f,0xbf,0xdf,0xef;/uchar code smg_we=0xfe,0xfd,0xfb,0xf7;uchar dis_smg8 = 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;uchar smg_i = 3; /显示数码管的个位数sbit SCL=P34;/SCL定义为P1口的第3位脚,连接ADC0832SCL脚sbit DO=P33;/DO定义为P1口的第4位脚,连接ADC0832DO脚sbit CS=P32;/CS定义为P1口的第4位脚,连接ADC0832CS脚sbit dq = P35;/18b20 IO口的定义sb
3、it beep = P36; /蜂鸣器IO口定义uint temperature,s_temp ; /温度的变量uchar dengji,s_dengji; /烟物等级uchar shoudong; /手动报警键uint huoyan;bit flag_300ms ;uchar key_can; /按键值的变量uchar menu_1; /菜单设计的变量bit flag_lj_en; /按键连加使能bit flag_lj_3_en; /按键连3次连加后使能 加的数就越大了 uchar key_time,flag_value; /用做连加的中间变量bit key_500ms ;uchar fla
4、g_clock;uchar zd_break_en,zd_break_value; /自动退出设置界面uchar a_a;/*1ms延时函数*/void delay_1ms(uint q)uint i,j;for(i=0;i<q;i+)for(j=0;j<120;j+);/*小延时函数*/void delay_uint(uint q)while(q.);/*把数据保存到单片机内部eepom中*/void write_eepom()SectorErase(0x2000);byte_write(0x2000, s_temp);byte_write(0x2001, s_dengji);b
5、yte_write(0x2060, a_a);/*把数据从单片机内部eepom中读出来*/void read_eepom()s_temp = byte_read(0x2000);s_dengji = byte_read(0x2001);a_a = byte_read(0x2060);/*开机自检eepom初始化*/void init_eepom()read_eepom();/先读if(a_a != 1)/新的单片机初始单片机内问EEPOMs_temp = 50;s_dengji = 5;a_a = 1;write_eepom();/*18b20初始化函数*/void init_18b20()b
6、it q;dq = 1;/把总线拿高delay_uint(1); /15usdq = 0;/给复位脉冲delay_uint(80);/750usdq = 1;/把总线拿高 等待delay_uint(10);/110usq = dq;/读取18b20初始化信号delay_uint(20);/200usdq = 1;/把总线拿高 释放总线/*写18b20内的数据*/void write_18b20(uchar dat)uchar i;for(i=0;i<8;i+) /写数据是低位开始dq = 0; /把总线拿低写时间隙开始 dq = dat & 0x01; /向18b20总线写数据了
7、delay_uint(5); / 60usdq = 1; /释放总线dat >>= 1;/*读取18b20内的数据*/uchar read_18b20()uchar i,value;for(i=0;i<8;i+)dq = 0; /把总线拿低读时间隙开始 value >>= 1; /读数据是低位开始dq = 1; /释放总线if(dq = 1) /开始读写数据 value |= 0x80;delay_uint(5); /60us读一个时间隙最少要保持60us的时间return value; /返回数据/*读取温度的值 读出来的是小数*/uint read_temp(
8、)uint value;uchar low; /在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); /初始化18b20write_18b20(0xcc); /跳过64位ROMwrite_18b20(0x44); /启动一次温度转换命令delay_uint(50); /500usinit_18b20(); /初始化18b20write_18b20(0xcc); /跳过64位ROMwrite_18b20(0xbe); /发出读取暂存器命令EA = 0;low = read_18b20(); /读温度低字节value = read_18b2
9、0(); /读温度高字节EA = 1;value <<= 8; /把温度的高位左移8位value |= low; /把读出的温度低位放到value的低八位中value *= 0.0625; /转换到温度值 return value; /返回读出的温度 /*读数模转换数据*/请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的/ 1 0 0 通道/ 1 1 1 通道 unsigned char ad0832read(bit SGL,bit ODD)unsigned char i=0,value=0,value1=0;SC
10、L=0;DO=1;CS=0;/开始SCL=1;/第一个上升沿SCL=0;DO=SGL;SCL=1; /第二个上升沿SCL=0;DO=ODD;SCL=1; /第三个上升沿SCL=0; /第三个下降沿DO=1;for(i=0;i<8;i+)SCL=1;SCL=0; /开始从第四个下降沿接收数据value<<=1;if(DO)value+;for(i=0;i<8;i+)/接收校验数据value1>>=1;if(DO)value1+=0x80;SCL=1;SCL=0;CS=1;SCL=1;if(value=value1)/与校验数据比较,正确就返回数据,否则返回0r
11、eturn value;return 0;/*数码显示函数*/void display()uchar i;for(i=0;i<smg_i;i+) P2 = smg_wei; /位选P1 = dis_smgi; /段选 delay_1ms(1);P1 = 0xff; /消隐 P2 = 0xff; /位选 /*定时器0初始化程序*/void time_init() EA = 1; /开总中断TMOD = 0X01; /定时器0、定时器1工作方式1ET0 = 1; /开定时器0中断 TR0 = 1; /允许定时器0定时/*按键处理数码管显示函数*/void key_with()if(key_c
12、an = 4) /紧急报警键 手动报警if(menu_1 = 0)shoudong = 1;if(key_can = 1) /设置键menu_1 +;if(menu_1 >= 3)menu_1 = 0;if(menu_1 = 0)dis_smg0 = smg_dutemperature % 10; /取温度的个位数显示dis_smg1 = smg_dutemperature / 10 % 10; /取温度的十位显示smg_i = 3;if(menu_1 = 1)dis_smg0 = smg_dus_temp % 10; /取个位显示dis_smg1 = smg_dus_temp / 10
13、 % 10 ; /取十位显示dis_smg2 = 0xbf ;dis_smg3 = smg_du10;/显示Asmg_i = 4;if(menu_1 = 2)dis_smg0 = smg_dus_dengji % 10; /取个位显示dis_smg1 = 0xbf ; dis_smg2 = 0xbf ;dis_smg3 = smg_du11;/显示Bsmg_i = 4;if(menu_1 = 0)if(key_can = 2) | (key_can = 3)shoudong = 0; /取消手动报警if(menu_1 = 1)/设置高温报警if(key_can = 2)if(flag_lj_3
14、_en = 0)s_temp + ;/按键按下未松开自动加三次else s_temp += 10;/按键按下未松开自动加三次之后每次自动加10if(s_temp > 99)s_temp = 99;dis_smg0 = smg_dus_temp % 10; /取个位显示dis_smg1 = smg_dus_temp / 10 % 10; /取十位显示dis_smg2 = 0xbf ;dis_smg3 = smg_du10;/显示Aif(key_can = 3)if(flag_lj_3_en = 0)s_temp . ;/按键按下未松开自动加三次else s_temp .= 10;/按键按下
15、未松开自动减三次之后每次自动减10if(s_temp <= 10)s_temp = 10 ;dis_smg0 = smg_dus_temp % 10; /取个位显示dis_smg1 = smg_dus_temp / 10 % 10; /取十位显示dis_smg2 = 0xbf;dis_smg3 = smg_du10;/显示Aif(menu_1 = 2)/设置低温报警if(key_can = 2)if(flag_lj_3_en = 0)s_dengji + ;else s_dengji + ;if(s_dengji >= 9)s_dengji = 9;dis_smg0 = smg_d
16、us_dengji % 10; /取个位显示dis_smg1 = 0xbf ; dis_smg2 = 0xbf ;dis_smg3 = smg_du11;/显示Bif(key_can = 3)if(flag_lj_3_en = 0)s_dengji . ;else s_dengji .;if(s_dengji <= 1)s_dengji = 1;dis_smg0 = smg_dus_dengji % 10; /取个位显示dis_smg1 = 0xbf ; dis_smg2 = 0xbf;dis_smg3 = smg_du11;/显示B /*独立按键处理函数*/void key()stat
17、ic uchar key_new = 0,key_old = 0,key_value = 0;if(key_new = 0) /按键松开的时候做松手检测if(P2 & 0x0f) = 0x0f)key_value +;else key_value = 0;if(key_value >= 5)write_eepom();key_value = 0;key_time = 0;key_new = 1;flag_lj_en = 0;/关闭连加使能flag_lj_3_en = 0;/关闭3秒后使能flag_value = 0;/清零else if(P2 & 0x0f) != 0x0
18、f)key_value +; /按键按下的时候else key_value = 0;if(key_value >= 5)key_value = 0;key_new = 0;flag_lj_en = 1; /连加使能zd_break_en = 1; /自动退出设置界使能zd_break_value = 0; /自动退出设置界变量清零key_can = 20;if(key_500ms = 1)key_500ms = 0;zd_break_en = 1; /自动退出设置界使能zd_break_value = 0; /自动退出设置界变量清零key_new = 0;key_old = 1;if(k
19、ey_new = 0) && (key_old = 1)switch(P2 & 0x0f)case 0x0e: key_can = 4; break; /得到k1键值case 0x0d: key_can = 3; break; /得到k2键值case 0x0b: key_can = 2; break; /得到k3键值case 0x07: key_can = 1; break; /得到k4键值 key_old = key_new; /*报警函数*/void clock_h_l()static uchar value;if(dengji >= s_dengji) |
20、(temperature >= s_temp) | (shoudong = 1)/报警value +;if(value >= 3)value = 10;beep = beep; /蜂鸣器报警else if(dengji < s_dengji) && (temperature < (s_temp . 1) && (shoudong = 0) /取消报警value = 0;beep = 1;void main()static uchar value;temperature = read_temp(); /读取温度值init_eepom();
21、/读eepom数据time_init();/初始化定时器 delay_1ms(650);while(1)key();/独立按键程序if(key_can < 10)key_with();/按键按下要执行的程序temperature = read_temp(); /读取温度值if(flag_300ms = 1)flag_300ms = 0;clock_h_l();dengji = ad0832read(1,0);dengji = dengji * 10 / 250;huoyan = ad0832read(1,1);huoyan = 10 . huoyan * 10 / 250; if(menu_1 = 0)if(temperature >= 99)temperature = 99;if(value > 20)value = 0;if(huoyan < 2)smg_i = 4;dis_smg3=smg_dudengji; /显示烟物报警等级dis_smg2= 0xbf; / .dis
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 拓扑材料缺陷调控与性能-洞察分析
- 原油储运安全探讨-洞察分析
- 新型地震监测技术-洞察分析
- 信立泰材料在电化学储能领域的研究进展-洞察分析
- 水产养殖循环经济研究-洞察分析
- 脱硫脱硝一体化技术-洞察分析
- 污染物输运模拟-洞察分析
- 油气资源绿色开发-洞察分析
- 勤俭节约活动感悟总结范文(10篇)
- 数字银行理财策略-洞察分析
- 排球试题题库
- CJJT148-2010 城镇燃气加臭技术规程
- 人教版八年级上册地理问答题提纲
- 试验检测方案
- 小学语文朗读指导案例
- 小提琴入门教学法智慧树知到期末考试答案章节答案2024年四川音乐学院
- 高尔斯华绥《品质》原文阅读-中学语文在线
- 西方文明史导论智慧树知到期末考试答案2024年
- IATF16949质量管理体系过程风险和机遇评估分析表
- 《小巴掌童话》试题及答案共6套
- 基础有机化学实验智慧树知到期末考试答案2024年
评论
0/150
提交评论