ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

51单片机通过DHT11温度传感器读取温度(3)

2022-04-01 19:32:46  阅读:196  来源: 互联网

标签:write 温度传感器 void cmd 51 char 单片机 lcd nop


一.LCD1602的初始化

1.延时15ms

2.写指令38H(不检测忙信号)

3.延时5ms

4.以后每次写指令,读/写数据操作均需要检测忙信号

5.写指令38h:显示模式设置

6.写指令08h:显示关闭

7.写指令01h:显示清屏

8.写指令06h:显示光标移动设置

9.写指令0ch:显示开及光标设置

相关代码

 1 #include <REGX52.H>
 2 #include "intrins.h"
 3 sbit RS = P1^0;
 4 sbit RW = P1^1;
 5 sbit E = P1^2;
 6 #define data_buffer    P0
 7 /*
 8 用于读取LCD1602的忙碌状态
 9 */
10 
11 void Delay15ms()        //@11.0592MHz
12 {
13     unsigned char i, j;
14 
15     i = 27;
16     j = 226;
17     do
18     {
19         while (--j);
20     } while (--i);
21 }
22 void Delay5ms()        //@11.0592MHz
23 {
24     unsigned char i, j;
25 
26     i = 9;
27     j = 244;
28     do
29     {
30         while (--j);
31     } while (--i);
32 }
33 
34 void check_lcd_busy()
35 {
36     char tep = 0x80;
37     data_buffer = 0x80;
38     while(tep & 0x80)
39     {
40     RS = 0;
41     RW = 1;
42     E = 0;
43     _nop_();
44     E = 1;
45     _nop_();
46     tep = data_buffer;
47     }
48 }
49 void lcd_write_cmd(char cmd)
50 {
51     check_lcd_busy();
52     RS = 0;
53     RW = 0;
54     E = 0;
55     data_buffer = cmd;
56     _nop_();
57     E = 1;
58     _nop_();
59     E = 0;
60     _nop_();
61 }
62 void lcd_write_data(char datashow)
63 {
64     check_lcd_busy();
65     RS = 1;
66     RW = 0;
67     E = 0;
68     data_buffer = datashow;
69     _nop_();
70     E = 1;
71     _nop_();
72     E = 0;
73     _nop_();
74 }
75 void lcd_start()
76 {
77     Delay15ms();
78     lcd_write_cmd(0x38);
79     Delay5ms();
80     lcd_write_cmd(0x38);
81     lcd_write_cmd(0x08);
82     lcd_write_cmd(0x01);
83     lcd_write_cmd(0x06);
84     lcd_write_cmd(0x0c);
85 }

二.通过lcd1602显示一个字符

要求通过lcd1602显示字符“A”

分析:需要在屏幕上显示出资格字符,需要将显示的位置、显示的内容给屏幕,所以可以写出如下的代码

#include "reg52.h"
#include "intrins.h"
/*
RS  -- P1.0
RW  -- P1.1 
E   -- P1.4 */
#define databuffer  P0 //定义8位数据线,Po端口组
sbit RS = P1^0;
sbit RW = P1^1;
sbit EN = P1^4;

void check_busy()
{
    char tmp = 0x80;
    databuffer = 0x80;
    
    while(tmp & 0x80){//1000 0000
        RS = 0;
        RW = 1;
        EN = 0;
        _nop_();
        EN = 1;
        _nop_();
        _nop_();
        tmp = databuffer;
        EN = 0;
        _nop_();
    }
}

void Write_Cmd_Func(char cmd)
{
    check_busy();
    RS = 0;
    RW = 0;
    
    EN = 0;
    _nop_();
    databuffer = cmd;
    _nop_();
    EN = 1;
    _nop_();
    _nop_();
    EN = 0;
    _nop_();    
}

void Write_Data_Func(char dataShow)
{
    check_busy();
    RS = 1;
    RW = 0;
    
    EN = 0;
    _nop_();
    databuffer = dataShow;
    _nop_();
    EN = 1;
    _nop_();
    _nop_();
    EN = 0;
    _nop_();    
}

void Delay15ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 27;
    j = 226;
    do
    {
        while (--j);
    } while (--i);
}
void Delay5ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 9;
    j = 244;
    do
    {
        while (--j);
    } while (--i);
}


void LCD1602_INIT()
{
    //(1)延时 15ms
    Delay15ms();
//(2)写指令 38H(不检测忙信号) 
    Write_Cmd_Func(0x38);
//(3)延时 5ms
    Delay5ms();
//(4)以后每次写指令,读/写数据操作均需要检测忙信号
//(5)写指令 38H:显示模式设置
    Write_Cmd_Func(0x38);
//(6)写指令 08H:显示关闭
    Write_Cmd_Func(0x08);
//(7)写指令 01H:显示清屏
    Write_Cmd_Func(0x01);
//(8)写指令 06H:显示光标移动设置
    Write_Cmd_Func(0x06);
//(9)写指令 0CH:显示开及光标设置}
    Write_Cmd_Func(0x0c);
}

void main()
{
    char position = 0x80 + 0x05;
    char dataShow = 'C';
    LCD1602_INIT();
    Write_Cmd_Func(position);//选择要显示的地址
    Write_Data_Func(dataShow);//发送要显示的字符

}

三.通过lcd1602显示一行字符

分析:如果需要通过LCD1602显示一行字符,则需要定义出每一行的开始字符位置,比如,第一行从第五列开始显示,第二行开始从第一列显示,这样就可以通过LCD1602显示不同的字符串,根据以上要求可以写出如下的代码

#include <REGX52.H>
#include "intrins.h"
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
#define data_buffer    P0
/*
用于读取LCD1602的忙碌状态
*/

void Delay15ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 27;
    j = 226;
    do
    {
        while (--j);
    } while (--i);
}
void Delay5ms()        //@11.0592MHz
{
    unsigned char i, j;

    i = 9;
    j = 244;
    do
    {
        while (--j);
    } while (--i);
}

void check_lcd_busy()
{
    char tep = 0x80;
    data_buffer = 0x80;
    while(tep & 0x80)
    {
    RS = 0;
    RW = 1;
    E = 0;
    _nop_();
    E = 1;
    _nop_();
    tep = data_buffer;
    }
}
void lcd_write_cmd(char cmd)
{
    check_lcd_busy();
    RS = 0;
    RW = 0;
    E = 0;
    data_buffer = cmd;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}
void lcd_write_data(char datashow)
{
    check_lcd_busy();
    RS = 1;
    RW = 0;
    E = 0;
    data_buffer = datashow;
    _nop_();
    E = 1;
    _nop_();
    E = 0;
    _nop_();
}
void lcd_start()
{
    Delay15ms();
    lcd_write_cmd(0x38);
    Delay5ms();
    lcd_write_cmd(0x38);
    lcd_write_cmd(0x08);
    lcd_write_cmd(0x01);
    lcd_write_cmd(0x06);
    lcd_write_cmd(0x0c);
}
void lcd1602_showlines(char row,char line ,char *string)  //定义三个形式参数,分别表示行、列和字符串
{
    switch(row)
    {
        case 1:
            lcd_write_cmd(0x80 + line);
          while(*string)
            {
                lcd_write_data(*string);
                string++;
            }
            break;
        case 2:
            lcd_write_cmd(0x80 + 0x04 + line);
            while(*string)
            {
                    lcd_write_data(*string);
                string++;
            }
            break;
    }
}
void main()
{
    lcd_start();
    lcd1602_showlines(1,3,"NO.1"); //通过第一行第三列开始显示内容“NO.1”
    lcd1602_showlines(2,0,"UP handsome"); //通过第二行第一列开始显示内容“UP handsome”
}

 

标签:write,温度传感器,void,cmd,51,char,单片机,lcd,nop
来源: https://www.cnblogs.com/shitou-geigei/p/16088603.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有