#include<reg52.h> #define LCD1602_DB P0 sbit LCD1602_RS=P1^0; sbit LCD1602_RW=P1^1; sbit LCD1602_E=P1^5; void cntUART(unsigned int baud); void InitLcd1602(); void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str); void LcdWriteCmd(unsigned char cmd); void LcdWaitReady(); void LcdSet(unsigned char x,unsigned char y); void LcdWriteDat(unsigned char dat); void renewstr(); unsigned char str[10]={0}; unsigned char RxdByte=0; unsigned char renew=0; void main() { EA=1; cntUART(9600); InitLcd1602(); LcdShowStr(2,0,str); while(1); } void cntUART(unsigned int baud) { SCON=0x50;//波特率发生器使用模式一并且使能REN TMOD&=0x0f; TMOD|=0x20; TH1=256-(11059200/12/32)/baud; TL1=TH1; ET1=0; ES=1; TR1=1; } void InitLcd1602() { LcdWriteCmd(0x38); LcdWriteCmd(0x0c); LcdWriteCmd(0x06); LcdWriteCmd(0x01); } void LcdWriteCmd(unsigned char cmd) { LcdWaitReady(); LCD1602_RS=0; LCD1602_RW=0; LCD1602_DB=cmd; LCD1602_E=1; LCD1602_E=0; } void LcdWaitReady() { unsigned char sta; LCD1602_DB=0xff; LCD1602_RS=0; LCD1602_RW=1; do{ LCD1602_E=1;//打开肯定先要打开,毕竟要P0读状态,但不能一直打开,后面用到再打开 sta=LCD1602_DB; LCD1602_E=0; }while(sta&0x80); } void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str) { LcdSet(x,y); while(*str!='\0') { LcdWriteDat(*str++); } } void LcdSet(unsigned char x,unsigned char y) { unsigned char addr; if(y==0) addr=0x00+x; else addr=0x40+x; LcdWriteCmd(addr|0x80); } void LcdWriteDat(unsigned char dat) { LcdWaitReady(); LCD1602_RS=1; LCD1602_RW=0; LCD1602_DB=dat; LCD1602_E=1; LCD1602_E=0; } void renewstr() { static unsigned char i=0; if(renew) { renew=0; str[i]=RxdByte; i++; } } void Inter2() interrupt 4 { if(RI) { RI=0; RxdByte=SBUF; SBUF=RxdByte; renew=1; renewstr(); } if(TI) { TI=0; } }
时间: 2023-10-25 17:08:00 浏览: 40
这段代码是一个基于8051单片机的LCD1602液晶显示屏的驱动程序,同时也包括了串口通信部分。主要功能是通过串口接收数据,并在LCD1602屏幕上显示接收到的数据。其中,cntUART函数用于设置串口通信的波特率;InitLcd1602函数用于初始化LCD1602屏幕;LcdWriteCmd函数用于向LCD发送命令;LcdWaitReady函数用于等待LCD准备好;LcdShowStr函数用于在LCD上显示字符串;LcdSet函数用于设置LCD的显示位置;LcdWriteDat函数用于向LCD发送数据;renewstr函数用于更新接收到的数据到str数组中;Inter2函数是串口中断处理函数,用于处理串口接收和发送中断。
代码的主要逻辑是:初始化串口和LCD屏幕,然后进入一个无限循环,不断接收串口数据并将其显示在LCD屏幕上。
需要注意的是,这段代码是基于reg52.h库和8051单片机的,如果你使用的是其他单片机或者开发板,可能需要做相应的修改。
相关问题
如果写#include <reg51.h>#include <stdio.h>#define LCD1602_DB P0sbit LCD1602_RS = P2^6;sbit LCD1602_RW = P2^5;sbit LCD1602_E = P2^7;#define LED P1#define BUZZER P3^7void delay(unsigned int t){ unsigned int i, j; for(i = 0; i < t; i++) for(j = 0; j < 125; j++);}void LCD1602_WriteCmd(unsigned char cmd){ LCD1602_RS = 0; LCD1602_RW = 0; LCD1602_DB = cmd; LCD1602_E = 1; delay(1); LCD1602_E = 0; delay(1);}void LCD1602_WriteData(unsigned char dat){ LCD1602_RS = 1; LCD1602_RW = 0; LCD1602_DB = dat; LCD1602_E = 1; delay(1); LCD1602_E = 0; delay(1);}void LCD1602_Init(){ LCD1602_WriteCmd(0x38); LCD1602_WriteCmd(0x0c); LCD1602_WriteCmd(0x06); LCD1602_WriteCmd(0x01);}void LCD1602_Clear(){ LCD1602_WriteCmd(0x01);}void LCD1602_SetCursor(unsigned char x, unsigned char y){ unsigned char addr; if(y == 0) addr = 0x80 + x; else addr = 0xc0 + x; LCD1602_WriteCmd(addr);}void UART_Init(){ TMOD = 0x20; TH1 = 0xfd; TL1 = 0xfd; TR1 = 1; SM0 = 0; SM1 = 1; REN = 1;}unsigned char UART_Receive(){ while(!RI); RI = 0; return SBUF;}void UART_Send(unsigned char dat){ SBUF = dat; while(!TI); TI = 0;}void main(){ unsigned char password[4] = {'1', '2', '3', '4'}; unsigned char input[4]; unsigned char i, j; unsigned char correct = 0; unsigned char tries = 0; LCD1602_Init(); UART_Init(); while(1) { LCD1602_Clear(); LCD1602_SetCursor(0, 0); LCD1602_WriteData('P'); LCD1602_WriteData('l'); LCD1602_WriteData('e'); LCD1602_WriteData('a'); LCD1602_WriteData('s'); LCD1602_WriteData('e'); LCD1602_WriteData(' '); LCD1602_WriteData('E'); LCD1602_WriteData('n'); LCD1602_WriteData('t'); LCD1602_WriteData('e'); LCD1602_WriteData('r'); LCD1602_WriteData(' '); LCD1602_WriteData('P'); LCD1602_WriteData('a'); LCD1602_WriteData('s'); LCD1602_WriteData('s'); LCD1602_WriteData('w'); LCD1602_WriteData('o'); LCD1602_WriteData('r'); LCD1602_SetCursor(0, 1); for(i = 0; i < 4; i++) { input[i] = UART_Receive(); LCD1602_WriteData('*'); } for(i = 0; i < 4; i++) { if(input[i] != password[i]) { correct = 0; break; } else { correct = 1; } } if(correct) { LCD1602_Clear(); LCD1602_SetCursor(0, 0); LCD1602_WriteData('W'); LCD1602_WriteData('e'); LCD1602_WriteData('l'); LCD1602_WriteData('c'); LCD1602_WriteData('o'); LCD1602_WriteData('m'); LCD1602_WriteData('e'); LED = 0xff; BUZZER = 0; delay(1000); } else { tries++; if(tries >= 3) { BUZZER = 1; delay(1000); BUZZER = 0; tries = 0; } else { LCD1602_Clear(); LCD1602_SetCursor(0, 0); LCD1602_WriteData('P'); LCD1602_WriteData('l'); LCD1602_WriteData('e'); LCD1602_WriteData('a'); LCD1602_WriteData('s'); LCD1602_WriteData('e'); LCD1602_WriteData(' '); LCD1602_WriteData('T'); LCD1602_WriteData('r'); LCD1602_WriteData('y'); LCD1602_WriteData(' '); LCD1602_WriteData('A'); LCD1602_WriteData('g'); LCD1602_WriteData('a'); LCD1602_WriteData('i'); LCD1602_WriteData('n'); delay(3000); } } }}之前要怎样分析
作文时遇到了写不下去的情况,应该怎么办?
遇到写不下去的情况,可以先停下来,放松一下自己的身心,让自己的思维得到缓解。可以喝口水、走动一下,或者做一些简单的伸展运动,以缓解身体的疲劳感。然后可以重新审视自己的思路,重新整理自己的思路,找到写作的重点和思路,再开始写作。如果还是无法写出来,可以先写下自己的想法和思考,不必拘泥于语言和结构,只要把自己的思路表达出来即可。最后,可以请教老师或者同学,听取他们的意见和建议,以便更好地完善自己的作文。
51单片机能实现在LCD1602模块上显示AD模块采集的电压值的keil5代码
以下是基于51单片机和LCD1602模块显示AD模块采集电压值的Keil5代码:
```
#include <reg52.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E = P2^2;
void delay(unsigned int i)
{
while(i--);
}
void LCD1602_Write_Cmd(unsigned char cmd)
{
LCD1602_RS = 0;
LCD1602_RW = 0;
LCD1602_DB = cmd;
LCD1602_E = 1;
delay(100);
LCD1602_E = 0;
}
void LCD1602_Write_Data(unsigned char dat)
{
LCD1602_RS = 1;
LCD1602_RW = 0;
LCD1602_DB = dat;
LCD1602_E = 1;
delay(100);
LCD1602_E = 0;
}
void LCD1602_Init(void)
{
LCD1602_Write_Cmd(0x38);
LCD1602_Write_Cmd(0x0c);
LCD1602_Write_Cmd(0x06);
LCD1602_Write_Cmd(0x01);
}
void LCD1602_Show_String(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char addr;
if(y == 0)
addr = 0x80 + x;
else
addr = 0xc0 + x;
LCD1602_Write_Cmd(addr);
while(*str)
LCD1602_Write_Data(*str++);
}
void ADC_Init(void)
{
P1ASF = 0x01; // P1.0作为ADC输入口
ADC_RES = 0; // 清零ADC转换结果寄存器
ADC_CONTR = 0xe0; // 使能ADC,设置ADC时钟为Fosc/32,选择ADC输入通道P1.0
}
unsigned int ADC_Read(unsigned char channel)
{
ADC_CONTR = 0xe0 | channel;
delay(100);
ADC_CONTR |= 0x08;
while((ADC_CONTR & 0x10) == 0);
return (ADC_RES * 256 + ADC_RESL);
}
int main()
{
unsigned int adc_value;
float voltage;
unsigned char str[16];
LCD1602_Init();
ADC_Init();
while(1)
{
adc_value = ADC_Read(0); // 读取ADC0通道的采样值
voltage = (float)adc_value * 5.0 / 1024.0; // 计算电压值
sprintf(str, "Voltage: %.2fV", voltage); // 将电压值转换为字符串
LCD1602_Show_String(0, 0, str); // 在LCD上显示电压值
delay(1000);
LCD1602_Write_Cmd(0x01); // 清屏
}
return 0;
}
```
注释已经说明了代码的主要逻辑,具体实现方法如下:
1. 定义LCD1602显示模块的引脚和函数,包括命令写入函数、数据写入函数、初始化函数和字符串显示函数。
2. 定义ADC模块的引脚和函数,包括初始化函数和读取通道采样值的函数。
3. 在主函数中初始化LCD1602和ADC模块,并进入循环,每次读取ADC0通道的采样值并计算电压值,将电压值转换成字符串并显示在LCD1602上,然后清屏,等待1秒后继续读取采样值。
需要注意的是,代码中使用了sprintf函数将电压值转换成字符串,需要在编译时加上-lscanf参数才能成功编译。