这是我去年单片机设计的温度报警器,proteus仿真过,完美成功请看介绍
1、初始化时序图 图3 初始化时序图 (1)首先将数据线置高电平1。 (2)然后进行延时(尽可能短,没有严格要求)。 (3)然后把数据线拉倒低电平0。 (4)再延时750μs (时间可以在480μs -960μs中选) (5)再将数据线拉高到电平1。 (6)延时等待。如果初始化成功则在15-60μs内产生一个由DS18B20返回的低电平0。这个可以确定它的存在。 (7)假设是单片机的CPU读到数据线上的低电平后,还要进行延时,那么时间从发出高电平算起不能少于480μs。 (8)最后将数据线再次拉到低电平后结束。 2、DS18B20写数据 (1)首先将数据线先置低电平0。 (2)然后延时确定的时间为15μs。 (3)再按从低位到高位的顺序来发送数据。 (4)其中延时时间为45μs。 (5)再把数据线拉倒高电平1。 (6)然后再重复前面五步,直到发送完整一个字节。 (7)最后将数据线拉高到1。 3、DS18B20读数据 (1) 首先将数据线拉高到1。 (2) 然后延时2μs。 (3) 再将数据线拉低到0。 (4) 然后延时5μs。(时间大于1μs) (5) 再将数据线拉高到1。 (6) 延时4μs。 (7) 读数据线状态得到一个状态位,并进行数据处理。 (8) 延时30μs。 (9) 重复以上所有步骤,直到读取完一个字节。 3.3 LCD1602液晶显示器3.3.1功能 1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线15脚的VCC和16脚的GND,本次研究采用16引脚的LCD。专门用来显示字母、数字、符号等的点阵型液晶模块,通过驱动模块与显示器的有效连接,能直观的显示出程序中要求的内容。 3.3.2特点 显示质量高:由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。因此,液晶显示器画质高且不会闪烁。 数字式接口:液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。 体积小、重量轻:液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。 功耗低:相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。 3.3.3引脚 本次实验采用16引脚LCD1602液晶显示器 引脚功能: 第1脚:VSS为地电源。 第2脚:VDD接5V正电源。 第3脚:VL为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。即电平=0为输入指令;电平=1为输入数据。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。 第6脚:E端为使能端,1时读取信息,当E端由高电平跳变成低电平时,即当1→0(下降沿)液晶模块执行命令。 7~14脚:D0~D7为8位双向数据线。7号引脚为最低位,14号引脚为最高位。 第15脚:背光源正极。 第16脚:背光源负极。
在课题设计的温度控制系统设计中,控制核心是STC89C52单片机,该单片 机为51系列增强型8位单片机,它有32个I/O口,片内含4K FLASH工艺的序存储器,便于用电的方式瞬间擦除和改写,而且价格便宜,其外部晶振为12M一个指令周期为1μs。使用该单片机完全可以完成设计任务,其最小系统主要包括:复位电路、震荡电路以及存储器选择模式,报警时界面如图16所示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include <REGX51.H>
- #include <intrins.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- sbit beep=P1^5;
- sbit Led1=P2^2; //高温闪烁
- sbit Led2=P2^3; //低温闪烁
- u8 code t0[]="Temperature is:";
- void TempDisplayTest(void);
- void delay500us(void);
- void BuzzerOnOff(void);
- void Lcd1602Init(void);
- void Lcd1602SetCursor(u8 x,u8 y);
- void Lcd1602ShowStr(u8 x, u8 y, u8 *pStr);
- void Lcd1602ShowTempU16(u8 x, u8 y, u16 temp);
- void Ds18b20TempConvertCmd(void);
- void Ds18b20TempReadCmd(void);
- u8 Ds18b20ReadByte(void);
- void main(void)
- {
- Lcd1602Init();
- while (1)
- {
- TempDisplayTest();
- }
- }
- void TempDisplayTest(void)
- {
- u16 tt, i; // 控制蜂鸣器报警
- u16 temp = 0; // 用来暂存12位的AD值
- u8 tmh = 0, tml = 0; // 用来暂存2个8位的AD值
- u16 tDisp = 0; // 用来存储乘以100倍后的温度值
- double t = 0; // 用来存储转换后以摄氏度为单位的温度值
- Ds18b20TempConvertCmd(); // 先写入转换命令
- Ds18b20TempReadCmd(); // 然后等待转换完后发送读取温度命令
- tml = Ds18b20ReadByte(); // 读取温度值共16位,先读低字节
- tmh = Ds18b20ReadByte(); // 再读高字节
- temp = tml | (tmh << 8); // 默认是12位分辨率,前面4个S位是符号位
-
- t = temp * 0.0625;
- tDisp = (u16)(t * 100); // 为方便显示将温度值乘以100后强转为u16
- tt=tDisp/100;
-
- Lcd1602ShowStr(0, 0, t0);
- Lcd1602ShowTempU16(0, 1, tDisp); // 调用LCD1602的显示函数来显示乘以100倍后的温度值
- if(tt>22)
- { for(i=500;i>0;i--)
- {
- BuzzerOnOff();
- Led1=0;Led2=1;
- delay500us();
- Led1=1;Led2=1;
- }
- }
- else if(tt<18)
- { for(i=500;i>0;i--)
- {
- BuzzerOnOff();
- Led1=1;Led2=0;
- delay500us();
- Led1=1;Led2=1;
- }
- }
- else {Led1=1;Led2=1;beep=1;}
- }
- void BuzzerOnOff(void)
- {
- beep = 1;
- delay500us();
- beep = 0;
- delay500us();
- }
- void delay500us(void) //误差 0us
- {
- unsigned char a,b;
- for(b=71;b>0;b--)
- for(a=2;a>0;a--);
- }
复制代码
Proteus7.5版本的仿真图下载:
温度测量.zip
(109.04 KB, 下载次数: 152)
|