历史上的今天
今天是:2024年12月24日(星期二)
2020年12月24日 | 51单片机智能火灾报警系统
2020-12-24 来源:51hei

单片机源程序如下:
#include #define uchar unsigned char //无符号字符型 宏定义 变量范围0~255 #define uint unsigned int //无符号整型 宏定义 变量范围0~65535 #include //数码管段选定义 0 1 2 3 4 5 6 7 8 9 uchar code smg_du[]={0x05,0xdd,0x46,0x54,0x9c,0x34,0x24,0x5d,0x04,0x14, 0x0c,0xa4,0x27,0xc4,0x26,0x2e,0xff}; //断码 //数码管位选定义 uchar code smg_we[]={0x7f,0xbf,0xdf,0xef}; uchar dis_smg[8] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8}; sbit CS=P3^2; //CS定义为P1口的第4位脚,连接ADC0832CS脚 PCB sbit SCL=P3^3; //SCL定义为P1口的第3位脚,连接ADC0832SCL脚 sbit DO=P3^4; //DO定义为P1口的第4位脚,连接ADC0832DO脚 sbit dq = P3^5; //18b20 IO口的定义 sbit beep = P3^6; //蜂鸣器IO口定义 uint temperature,s_temp=35; //温度的变量 uchar dengji,s_dengji=5; //烟物等级 uchar shoudong; //手动报警键 uchar flag_huoyan; bit flag_300ms = 1; uchar key_can; //按键值的变量 uchar menu_1; //菜单设计的变量 /***********************1ms延时函数*****************************/ void delay_1ms(uint q) { uint i,j; for(i=0;i } /***********************小延时函数*****************************/ void delay_uint(uint q) { while(q--); } /***********************18b20初始化函数*****************************/ void init_18b20() { bit q; dq = 1; //把总线拿高 delay_uint(1); //15us dq = 0; //给复位脉冲 delay_uint(80); //750us dq = 1; //把总线拿高 等待 delay_uint(10); //110us q = dq; //读取18b20初始化信号 delay_uint(20); //200us dq = 1; //把总线拿高 释放总线 } /*************写18b20内的数据***************/ void write_18b20(uchar dat) { uchar i; for(i=0;i<8;i++) { //写数据是低位开始 dq = 0; //把总线拿低写时间隙开始 dq = dat & 0x01; //向18b20总线写数据了 delay_uint(5); // 60us dq = 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() { uint value; uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序 init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0x44); //启动一次温度转换命令 delay_uint(50); //500us init_18b20(); //初始化18b20 write_18b20(0xcc); //跳过64位ROM write_18b20(0xbe); //发出读取暂存器命令 EA = 0; low = read_18b20(); //读温度低字节 value = read_18b20(); //读温度高字节 EA = 1; value <<= 8; //把温度的高位左移8位 value |= low; //把读出的温度低位放到value的低八位中 value *= 0.0625; //转换到温度值 return value; //返回读出的温度 } /***********读数模转换数据********************************************************/ //请先了解ADC0832模数转换的串行协议,再来读本函数,主要是对应时序图来理解,本函数是模拟0832的串行协议进行的 unsigned char ad0832read(unsigned char channel) { uchar i=0; uchar j; uint dat=0; uchar ndat=0; uchar Vot=0; if(channel==0)channel=2; if(channel==1)channel=3; DO=1; _nop_(); _nop_(); CS=0;//拉低CS端 _nop_(); _nop_(); SCL=1;//拉高CLK端 _nop_(); _nop_(); SCL=0;//拉低CLK端,形成下降沿1 _nop_(); _nop_(); SCL=1;//拉高CLK端 DO=channel&0x1; _nop_(); _nop_(); SCL=0;//拉低CLK端,形成下降沿2 _nop_(); _nop_(); SCL=1;//拉高CLK端 DO=(channel>>1)&0x1; _nop_(); _nop_(); SCL=0;//拉低CLK端,形成下降沿3 DO=1;//控制命令结束 _nop_(); _nop_(); dat=0; for(i=0;i<8;i++) { dat|=DO;//收数据 SCL=1; _nop_(); _nop_(); SCL=0;//形成一次时钟脉冲 _nop_(); _nop_(); dat<<=1; if(i==7)dat|=DO; } for(i=0;i<8;i++) { j=0; j=j|DO;//收数据 SCL=1; for(j=0;j<120;j++);
史海拾趣
|
如果同时掌握了arm和cpld会不会有所帮助? 来自EEWORLD合作群:arm linux fpga 嵌入0(49900581)群主:wangkj… 查看全部问答> |
|
我的是一个协议层驱动,有个疑问就是 A.使用CreateService,OpenService,QueryServiceStatus及StartService等一系列API安装起来的驱动 B.使用Inf文件及INetCfg的COM接口安装的驱动 问题是 1.这两种方式有什么不同? 2.为什么A安装后\"本地连接\" ...… 查看全部问答> |
|
我现在做图片解码显示,用的是ze的片子,我开辟了的一个大的数组在sram里,请放心这个数组确实在外部,我去过地址查看,0x6800xxx位置,现在的问题是,我如果把这个数组开辟的小一点,比如几百字节,lcd显示正常,开辟大来人比如几百k &n ...… 查看全部问答> |
|
请各位大侠帮忙看一下如下三条语句,已知(80H)=20H,(81H)=30H, LD #0,DP LD 80H,16,B ADD 81H,B 运行后B等于多少?这到底是属于绝对地址寻址还是直接寻址啊?谢谢!… 查看全部问答> |




