LCD1602和DS18B20两个模块的51驱动程序

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,总线会根据时序要求返回一个低电平脉冲,如果不存在的话,也就不会返回脉冲,即总线保持为高电平。

  1. 单片机拉低总线至少480us,产生复位脉冲,然后释放总线(拉高电平)。

  1. 这时DS8B20检测到请求之后,会拉低信号,大约60 ~240us表示应答。

  1. DS8B20拉低电平的60~240us之间,单片机读取总线的电平,如果是低电平,那么表示初始化成功

  1. 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值