原创 基于红外通信的温度监测模拟 整理所用知识 一、总线 1、总线概述 计算机系统以微处理器为核心,各设备应与微处理器连接,必须协调工作。因此,总线的概念被引入到微处理器中,每个设备共享总线,只有一个设备可以随时发送数据(多个设备可以同时接收数据) 。
计算机总线分为控制总线、地址总线和数据总线。数据总线用于传输数据,控制总线用于传输控制信号, 地址总线用于选择存储单元或外设。 2、51单片机的三总线结构
数据总线是P0口,共8位;地址总线高8位P2口,低8位是P0口,共16位。;数据总线有WR,RD等。
(1)数据总线
51 单片机的数据总线为P0 口,P0 口为双向数据通道,CPU 从P0 出口和读回数据。
(2)地址总线
51 16系列单片机地址总线 位。
为了节省芯片引脚,使用P0 除了作为数据总线,口复用模式也是如此ALE 在信号时序匹配下,通过外部数据锁存器从总线访问的前半段开始P0口发出低8位地址,下半年从P0 口送出8 位数据。
通过高8位地址P2 口送出。
(3)控制总线
51 系列单片机的控制总线包括读控信号P3.7 和写控制信号P3.6 等等,两者分别作为总线模式下数据读写的使能信号。
原文链接:https://blog.csdn.net/lijinshanba/article/details/80911816
二、DS18B20温度传感器 DS18B20性能 ①独特的单线接口方式,DS18B微处理器与微处理器连接时,只需一条口线即可实现DS18B双向通信20。
②测温范围-55℃~ 125℃,固有温度测量误差(注意,不是分辨率,以前是错误的)1℃。
③支持多点网络功能,多点网络功能DS18B20可以并联在唯一的三线上,最多只能并联8条,实现多点温度测量。如果数量过多,供电电压会过低,导致信号传输不稳定。
④工作电源:3.0~5.5V/DC(可以数据线寄生电源)
⑤使用中不需要任何外围元件
⑥测量结果以9~12位数字量串行传输
⑦不锈钢保护管的直径Φ6
⑧适用于DN1525,DN40DN各种介质工业管道和狭小空间设备的测温
⑨螺纹安装标准M10X1,M12X1.5,G1/2”任选
⑩PVC电缆直接或德国球形接线盒,便于与其他电气设备连接。 **
DS18B20引脚图及功能 DS18B20内部结构主要由四部分组成:64位光刻ROM、温度传感器、非挥发性温度报警触发器TH和TL、配置寄存器。
利用DS18B做个温控器(DS18B20引脚图_工作原理及应用电路) 插入图片描述 1、GND为电源地
2、DQ数字信号输入/输出端
3、VDD外部电源输入端(寄生电源接线时接地)。
DS18B20工作原理 DS18B读写时间和测温原理20DS1820是一样的,但温度值的位数因分辨率而异,温度转换时的延迟时间由2s减为750ms。 DS18B如图所示,20测温原理。 图中低温系数晶振振荡频率受温度影响较小,用于产生固定频率的脉冲信号发送给计数器1。 随着温度的变化,高温系数晶振的振荡率发生了显著的变化,产生的信号作为计数器2的脉冲输入。 计数器1和温度寄存器预置-55℃对应的基数值。计数器1减法计数低温系数晶振产生的脉冲信号, 当计数器1的预置值降至0时,温度寄存器的值将增加1,计数器1的预置将重新安装,计数器1将重新开始计数低温系数晶振产生的脉冲信号, 当温度寄存器中的值为测量温度时,停止温度寄存器值的累积,直到计数器2计数到0。 斜率累加器用于补偿和修正测温过程中的非线性,输出用于修正计数器1的预置值。 插入图片描述
DS18B20指令及寄存器 1、温度寄存器
2.精度寄存器 插入图片描述 3、ROM指令表 插入图片描述 4、RAM指令表 插入图片描述 参考链接:https://blog.csdn.net/zhangxuechao_/article/details/74991985
三、AMPIRE128X64型LCD屏 1、引脚作用 插入图片描述 CS1:左半屏选择引脚,低电平有效。当引脚有效时,左半屏操作有效。
CS2.右半屏选择引脚,低电平有效。当引脚有效时,右半屏操作有效。
GND:电源地
VCC:电源正
V0:LCD其实驱动电压可以用来调节LCD蓝皮肤的深浅。
RS:命令/数据控制引脚。脚是高电平的DB数据线上传输的是数据,该脚为低电平是DB命令在线传输数据。
R/W:读写控制引脚。这只脚通常是高电的LCD模块中毒数据,脚通常为低电写数据LCD模块中。
E:LCD读写能引脚(E表示模块使能引脚,但是注意这里表示的是读写能引脚,最好初始化的时候给个低电平,)
DB:数据总线。
RST:复位脚
-Vout:LCD驱动电源。
2.软件驱动程序 (1)选择需要显示的屏幕 通过CS1,CS2组合驱动的是左屏幕还是右屏幕,还是两边的屏幕一起驱动,还是两边的屏幕都不驱动显示。具体组合如下。 插入图片描述 并不是说CS1==0 CD2 == 1只显示左屏而不显示右屏。相反,下一个操作只与左屏和右屏无关。 操作屏幕显示时,必须首先指出要修改的屏幕内容。 我们只需要知道,如果我们想让屏幕显示,我们必须告诉他屏幕显示的左右两侧。 (2)设置显示线 从上到下,整个屏幕共有64行 但是 但是 但是 真正让我们选择的只有8行 只有8行 一行是一行164个像素点,也就是说所谓的设置显示线只选择显示在哪一页 搞清楚了设置显示的行(页)的问题,那么所谓的64行是什么玩意,那又是怎么回事呢。 事实上,还有一个指令是设置开始显示的第一行位置, 也就是说,你可以通过设置开始行来选择第一行的位置, 假如你设置第一行是0行, 所以第一页是0-7行, 第二页是8-15行, 假如你设置的开始行数是第一行, 第一页是1-8行, 第二页是9-16行…。 它可以表示设置的第一行为x(x<64)行, 所以第y页的起始行数是 (y8 x)d, 结束行数是(y*8 x 7)d; 从任从任何行显示。
(3)设置显示的开始列 全屏共有64128个像素点,即64行和128列 前面说过,该LCD分为左右两个屏幕,需要通过两个屏幕。CS1与CS2组合控制。这两个屏幕各占64列,也就是说一个屏幕的像素点是6464,所以我们在设置显示起始列时实际上只能选择0-63列。 起始列设置在哪一列开始显示,在那一列开始显示,每一列自动添加1。
(4)设置显示的数据(图像) 该LCD显示方式是一列一列开始显示,每列显示后,记录列数的地址自动添加1,即如果您发送的数据为0x88.然后将显示当前页面当前列的8个相熟点,从上到下到10001000,了解这一点对于取模至关重要。 常用的驱动指令 #define LCD_CLEAR 0X01 //lcd清屏 #define LCD_SHOW_MODE(x) (0x02 x) //选择显示模式 0允许输入IRAM地址 允许输入垂直卷动地址 #define LCD_SHOW_OFF 0X3E //lcd显示关 #define LCD_SHOW_ON 0X3F //lcd显示开 #define LCD_PAGE(x) (0xb8 x) //设置页数 #define LCD_HANG(x) (0xc0 x) //设置开始行 #define LCD_LEI(x) (0x40 x) //设置起始列
写一个数据到LCD中的流程 (1)查忙。
(2)RS = H/L(H:显示数据 L:操作指令)
(3)RW = L(写数据)
(4)E = H (使能读写数据)
(5)输入数据到DB口
(6)E = L (输入数据) 具体程序如下所示 void lcd12864_WriteCommed (unsigned char commed) //12864写命令 { lcd12864_Busy (); //12864查忙 lcdRsPin(PIN_LOW); lcdRwPin(PIN_LOW); lcdEnPin(PIN_HIGH); LCD_DATA = commed; lcd12864_delay (5); ///延迟函数 LCD_EN = 0; } void lcd12864_WriteData (unsigned char dat) //12864写数据 { lcd12864_Busy (); //12864查忙 lcdRsPin(PIN_HIGH); lcdRwPin(PIN_LOW); lcdEnPin(PIN_HIGH); LCD_DATA = dat; lcd12864_delay (5); ///延迟函数 lcdEnPin(PIN_LOW) ; } void lcd12864_Busy (voi) //12864查忙 {
LCD_DATA = 0XFF;
lcdRsPin(PIN_LOW);
lcdRwPin(PIN_HIGH);
lcdEnPin(PIN_HIGH);
while(LCD_DATA&0x80);
lcdEnPin(PIN_LOW) ;
1 2 3 4 5 6 } https://blog.csdn.net/qq_33784286/article/details/103067878
四、程序实例 (一)发射端程序 1、DS18B20 温度传感器驱动程序
DS18B20.h
#ifndef #define #define uchar unsigned char #define uint unsigned int sbit DQ=P1^0; void delay_18B20(unsigned int i); //DS18B20延时 Init_DS18B20(void); //DS18B20初始化函数 unsigned char ReadOneChar(void); //读取一个字节 WriteOneChar(unsigned char dat); //写入一个字节 unsigned char ds18b2o_s(void); #endif 、 、 、
DS18B20.c
#include<reg52.h> #include"18b20.h" #include<intrins.h>
/****/ void delay_18B20(uint i) { while(i–); }
/
/**
hongwaifashe.h
#ifndef
sbit IR = P3^0; //定义发射引脚(接PNP三极管基极,) 三极管起电流放大作用
extern void hongwaifashe(void); #endif / / / / hongwaifashe.c
#include <reg52.h> #include <intrins.h> #include “hongwaifashe.h”
void hongwaifashe(void) {
TMOD = 0x01; //T0 16位工作方式 IR=1; //发射端口常态为高电平
ZZ(setdata[0]); ZZ(setdata[1]); }
void ZZ(uchar x) { TT0(1,m9); //高电平9mS TT0(0,m4_5); //低电平4.5mS
/┈ 发送4帧数据 ┈/ Z0(SBM); Z0(~SBM); Z0(x); Z0(~x);
/┈┈ 结束码 ┈┈/ TT0(1,m_56); TT0(0,m40); }
/┈┈┈┈┈┈┈单帧发送程序┈┈┈┈┈┈┈┈/ void Z0(uchar temp) { uchar v; for (v=0;v<8;v++) //循环8次移位 { TT0(1,m_56); //高电平0.65mS if(temp&0x01) TT0(0,m1_68); //发送最低位 else TT0(0,m_56); temp >>= 1; //右移一位 } }
/┈┈┈┈┈┈┈38KHz脉冲发射 + 延时┈┈┈┈┈┈/ void TT0(bit BT,uint x) { TH0 = x>>8; //输入T0初始值 TL0 = x; TF0=0; //清0 TR0=1; //启动定时器0 if(BT == 0) while(!TF0); //BT=0时不发射38KHz脉冲只延时;BT=1发射38KHz脉冲且延时; else while(1) //38KHz脉冲,占空比1:5 { IR = 0; if(TF0)break; if(TF0)break; IR = 1; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; if(TF0)break; } TR0=0; //关闭定时器0 TF0=0; //标志位溢出则清0
IR =1; //脉冲停止后,发射端口常态为高电平 } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 3、主函数
main.c
#include<reg52.h> #include"18b20.h" #include"lamp.h" #include “hongwaifashe.h” #define uchar unsigned char #define uint unsigned int uchar setdata[2]; void main(void) { while(1) { setdata[0]=ds18b20_s(); setdata[1]=lamp(); hongwaifashe(); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
(二)接收端程序
#ifndef _12864_H_ #define _12864_H_ #define LCD P0 /*LCD端口*/ #define uint unsigned int #define uchar unsigned char /****汉字数组声明****/ extern uchar code WUYOU[2][32]; extern uchar code XIAN[32]; extern uchar code HUAN[32]; extern uchar code JING[32]; extern uchar code JIAN[32]; extern uchar code CE[32]; extern uchar code WEN[32]; extern uchar code DU[32]; extern uchar code MAOHAO[32]; extern uchar code LIANG[32]; extern uchar code DUHAO[32]; extern uchar code SHUZI[10][32]; /*控制信号宏定义*/ sbit CS1 = P2^1; sbit CS2 = P2^0; sbit E = P2^3; sbit RW = P2^4; sbit RS = P2^5; sbit busy_bit =P0^7; extern void lcd_mwc( uchar i); extern void lcd_mwd( uchar i ); extern void lcd_clear(void); extern void lcd_init(void); extern void dispm_zi_up( uchar code *zi); extern void dispm_zi_down( uchar code *zi); #endif 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 / / / LCD.c #include<reg52.h> #include"12864.h" #include<intrins.h> uchar code WUYOU[2][32]={ { 0x00,0x40,0x42,0x42,0x42,0x42,0xFE,0x42, 0xC2,0x42,0x43,0x42,0x60,0x40,0x00,0x00, 0x00,0x80,0x40,0x20,0x18,0x06,0x01,0x00, 0x3F,0x40,0x40,0x40,0x40,0x40,0x70,0x00}, { 0x04,0x04,0x04,0x84,0xE4,0x3C,0x27,0x24, 0x24,0x24,0x24,0xF4,0x24,0x06,0x04,0x00, 0x04,0x02,0x01,0x00,0xFF,0x09,0x09,0x09, 0x09,0x49,0x89,0x7F,0x00,0x00,0x00,0x00}}; uchar code XIAN[32]={ 0x00,0x20,0x30,0xAC,0x63,0x20,0x30,0x20, 0x20,0xFF,0x90,0x92,0x94,0xD0,0x80,0x00, 0x20,0x62,0x23,0x12,0x12,0x12,0x41,0x41, 0x21,0x17,0x18,0x24,0x42,0x80,0xE0,0x00}; uchar code HUAN[32]={ 0x42,0x42,0xFE,0x43,0x42,0x04,0x04,0x04, 0x84,0xE4,0x1C,0x84,0x04,0x06,0x04,0x00, 0x20,0x60,0x3F,0x10,0x10,0x04,0x02,0x01, 0x00,0xFF,0x00,0x00,0x01,0x03,0x06,0x00}; uchar code JING[32]={ 0x20,0x20,0xFF,0x20,0x20,0x24,0xA4,0xAC, 0xB5,0xA6,0xB4,0xAC,0xE6,0xB4,0x20,0x00, 0x10,0x30,0x1F,0x08,0x88,0x80,0x4F,0x3A, 0x0A,0x0A,0x7A,0x8A,0x8F,0x80,0xE0,0x00}; uchar code JIAN[32]={ 0x00,0x00,0xFC,0x00,0x00,0xFF,0x00,0x20, 0x10,0x0F,0x18,0x28,0x6C,0x08,0x00,0x00, 0x40,0x40,0x7E,0x42,0x42,0x7F,0x42,0x42, 0x42,0x7E,0x42,0x42,0x7F,0x42,0x40,0x00}; uchar code CE[32]={ 0x10,0x22,0x6C,0x00,0x80,0xFC,0x04,0xF4, 0x04,0xFE,0x04,0xF8,0x00,0xFE,0x00,0x00, 0x04,0x04,0xFE,0x01,0x40,0x27,0x10,0x0F, 0x10,0x67,0x00,0x47,0x80,0x7F,0x00,0x00}; uchar code WEN[32]={ 0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92, 0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00, 0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42, 0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00}; uchar code DU[32]={ 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5, 0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00, 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A, 0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00}; uchar code MAOHAO[32]={ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xC0, 0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x31, 0x31,0x30,0x00,0x00,0x00,0x00,0x00,0x00}; uchar code DUHAO[32]={ 0x00,0x06,0x09,0x09,0xE6,0xF0,0x18,0x08, 0x08,0x08,0x18,0x30,0x78,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x07,0x0F,0x18,0x30, 0x20,0x20,0x20,0x10,0x08,0x00,0x00,0x00}; uchar code LIANG[32]={ 0x00,0x02,0x02,0x7A,0x4A,0x4A,0x4A,0x4B, 0x4A,0x4A,0x4A,0x7E,0x0B,0x02,0x00,0x00, 0x04,0x83,0x81,0x41,0x3D,0x05,0x05,0x05, 0x05,0x05,0x7F,0x85,0x81,0x85,0xE3,0x00}; uchar code SHUZI[10][32]={ { 0x00,0x00,0xE0,0xF0,0xF0,0x18,0x08,0x08, 0x08,0x08,0x08,0x38,0xF0,0xE0,0xC0,0x00, 0x00,0x01,0x0F,0x1F,0x1F,0x30,0x20,0x20, 0x20,0x20,0x20,0x38,0x1F,0x0F,0x07,0x00}, { 0x00,0x00,0x00,0x00,0x10,0x10,0x10,0xF8, 0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x20, 标签:
三极管1550