LCD 1602
显示原理
LCD1602 显示器总共有16*2 个地址 往每个地址中写入对应的数据 就会在屏幕对应的地方显示出字符出来
🟢 写地址命令中 最高位D7 必须保持高电平 所以地址一般都是 ==0x80 + 对应位置的地址==
写时序分析
控制引脚 | 时序描述 |
RS | 写地址==0 写数据==1 |
R/W* | 写==0 |
E | 初始状态为0 延时25ns置1 然后延时150ns置零(下降沿执行命令) 然后再延时25ns结束 |
#include "reg52.h"
#include "intrins.h"
#include "delay.h"
#define databuffer P0 //定义D0-D7引脚
sbit EN = P2^7;
sbit RS = P2^6;
sbit RW = P2^5;
void Write_cmd_Func(char cmd) //写命令函数
{
check_busy(); //检测忙信号函数
RS = 0; //RS为低电平:写指令
RW = 0;
EN = 0;
_nop_(); //执行一个空函数,延时约1us
databuffer = cmd;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
}
void Write_data_Func(char datashow) //写命令函数
{
check_busy(); //检测忙信号函数
RS = 1; //RS为高电平:写内容
RW = 0;
EN = 0;
_nop_();
databuffer = datashow;
_nop_();
EN = 1;
_nop_();
_nop_();
EN = 0;
_nop_();
读时序分析
控制引脚 | 时序描述 |
RS | 写地址==0 写数据==1 |
R/W* | 读==1 |
E | 初始状态为0,延时tR后拉高,之后再延时tPW后拉低。 写时序E=0开始传送数据 读时序需要等E=1之后才开始传送数据 |
void check_busy()//检测忙信号函数
{
char tmp = 0x80; //创建一个变量,存放数据
databuffer=0x80; //初始值为忙,只要当单片机发数据后高位变低后才为不忙
// 这里会一直检查是否忙 等待不忙的时候才会fan'hui
while(tmp & 0x80){ //检测tmp的高位bf的值是否为高电平,如果为忙程序卡住不往下执行
//高电平:忙 低电平:不忙
RS = 0;
RW = 1;
EN = 0;
_nop_();
EN = 1;
_nop_();
_nop_();
tmp=databuffer;
EN = 0;
_nop_();
}
DS18B20温度传感器
ROM
功能: 保存独有的地址序列码
高速暂存器
🟢组成部分
温度传感器
一个字节的温度上限和温度下限报警触发器(TH和TL)
配置寄存器允许用户设定9位,10位,11位和12位的温度分辨率,分别对应着温度的分辨率为:0.5°C,0.25°C,0.125°C,0.0625°C,默认为12位分辨率, 🟢==这个一般都采取默认设置 采用12位分辨率的温度==
🟢有九个字节
字节0~1 是温度存储器,用来存储转换好的温度。第0个字节存储温度低8位,第一个字节存储温度高8位
字节2~3 是用户用来设置最高报警和最低报警值(TH和TL)。
字节4 是配置寄存器,用来配置转换精度,可以设置为9~12 位。
字节5~7 保留位。芯片内部使用
字节8 CRC校验位。是64位ROM中的前56位编码的校验码。由CRC发生器产生。
存储器
高速的RAM
可擦写的EEPROM (可编程可擦写)
存储高温和低温触发器以及配置寄存器的值
初始化时序
🟢任何器件想要使用,首先就是需要初始化,对于DS18B20单总线设备,首先初始化单总线为高电平,然后总线开始也需要检测这条总线上是否存在DS18B20这个器件。如果这条总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。
单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。
这时DS8B20检测到请求之后,会拉低信号,大约60 ~240us表示应答。
DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功
DS18B20拉低电平60~240us之后,会释放总线。
unsigned int Init_DS18B20(void)
{
unsigned int x=0;
DQ = 1; //DQ复位
delay(4); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(60); //精确延时,大于480us
DQ = 1; //拉高总线
delay(8);
x = DQ; //稍做延时后,如果x=0则初始化成功,x=1则初始化失败
delay(4);
return x;
}
写时序
🟢总线控制器通过控制单总线高低电平持续时间从而把逻辑1或0写DS18B20中。每次只传输1位数据
单片机想要给DS18B20写入一个0时,需要将单片机引脚拉低,保持低电平时间要在60~120us之间,然后释放总线
单片机想要给DS18B20写入一个1时,需要将单片机引脚拉低,拉低时间需要大于1us,然后在15us内拉高总线.
在写时序起始后15μs到60μs期间,DS18B20处于采样单总线电平状态。如果在此期间总线为高电平,则向DS18B20写入1;如果总线为低电平,则向DSl8B20写入0。
// 写一个字节 或者写指令
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
// 如果位是1的话 就拉高 然后延时 因为指令执行时间已经超过了1us 可以马上拉高 输入1
// 如果位是0的话 就拉低 然后延时
DQ = dat&0x01; //与1按位与运算,dat最低位为1时DQ总线为1,dat最低位为0时DQ总线为0
delay(4);
DQ = 1;
dat>>=1;
}
delay(4);
}
🟢写入的ROM指令
采用多个DS18B20时,需要写ROM指令来控制总线上的某个DS18B20
如果是单个DS18B20,直接写跳过ROM指令==0xCC==即
🟢温度转化命令
0X44 ==读取好的温度会存储在高速暂存器的第0个和第一个字节中==
读时序
读时隙由主机拉低总线电平至少1μs然后再释放总线,读取DS18B20发送过来的1或者0
/*****读一个字节*****/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat >>= 1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}