资讯详情

2020-01-21

原创 基于红外通信的温度监测模拟 整理所用知识 一、总线 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–); }

/************ Init_DS18B20(void) { bit flag; DQ=1; //DQ复位 DQ–数字信号输入输出端 nop();nop();nop();nop();nop();nop(); DQ=0; //单片机将DQ拉低 delay_18B20(80); //精确延时 大于 480us DQ=1; //拉高总线 delay_18B20(2); if(DQ==1) flag=1 ; else flag=0; delay_18B20(20); } /**/ unsigned char ReadOneChar(void) { uchar i=0; uchar dat = 0; for (i=8;i>0;i–) { nop(); DQ=0; // 给脉冲信号 DQ=1; dat>>=1; //右移一位,空位补0 delay_18B20(2); if(DQ) dat|=0x80; //1000 0000 按位或 1|0=1 1|1=1 0|0=0 delay_18B20(4); } return(dat); } /**/ WriteOneChar(unsigned char dat) { unsigned char i=0; for (i=8; i>0; i–) { DQ=0; delay_18B20(1); DQ = dat&0x01; 按位或与 0 & 0=0 0 & 1= 0 1 & 0= 0 1 & 1= 1。 delay_18B20(5); DQ=1; dat>>=1; } delay_18B20(4); }

/**/ uchar ds18b2o_s(void) { uchar temp; while(Init_DS18B20()==1) ; WriteOneChar(0xCC); // 跳过读序号列号的操作 读写指令,可由上文ROM、RAM指令集查找 WriteOneChar(0x44); // 启动温度转换 delay_18B20(1500); // this message is wery important while(Init_DS18B20()==1) ; WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 delay_18B20(1500); DPL=ReadOneChar(); //读取温度值低位 DPH=ReadOneChar(); //读取温度值高位 temp=(((DPH)*256+DPL)>>4); //当前采集温度值除16得实际温度值 0.0625约为1/16’c return(temp); } 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 2、红外发射程序

hongwaifashe.h

#ifndef #define #define uchar unsigned char #define uint unsigned int extern uchar setdata[2]; void ZZ(uchar x); void Z0(uchar temp); void TT0(bit BT,uint x); #define SBM 0x80 //识别码 #define m9 (65536-9000) //约9mS #define m4_5 (65536-4500) //约4.5mS #define m1_68 (65536-1680) //约1.68mS //#define m_65 (65536-580) //约0.65mS #define m_56 (65536-560) //约0.56mS #define m40 (65536-40000) //约40mS //#define m56 (65536-56000) //56mS //#define m2_25 (65536-2250) //约2.25mS

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

(二)接收端程序

LCD.h

   #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

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台