51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序

51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序,第1张

/无线温度发送/

#include <reg52h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5

#define TX_DATA_WITDH 5

#define RX_DATA_WITDH 5

/

// nRF24L01指令格式:

/

#define R_REGISTER 0x00 // 读寄存器

#define W_REGISTER 0x20 // 写寄存器

#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写 *** 作从字节0开始,应用于发射模式

#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式

#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式

#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#define NOP 0xFF // 空 *** 作,可以用来读状态寄存器

/

// nRF24L01寄存器地址

/

#define CONFIG 0x00 // 配置寄存器

#define EN_AA 0x01 // “自动应答”功能寄存

#define EN_RX_ADDR 0x02 // 接收通道使能寄存器

#define SETUP_AW 0x03 // 地址宽度设置寄存器

#define SETUP_RETR 0x04 // 自动重发设置寄存器

#define RF_CH 0x05 // 射频通道频率设置寄存器

#define RF_SETUP 0x06 // 射频设置寄存器

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送检测寄存器

#define CD 0x09 // 载波检测寄存器

#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器

#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器

#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器

#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器

#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器

#define RX_ADDR_P5 0x0F // 数据通道5接收地址寄存器

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 数据通道0有效数据宽度设置寄存器

#define RX_PW_P1 0x12 // 数据通道1有效数据宽度设置寄存器

#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器

#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器

#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器

#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

#define FIFO_STATUS 0x17 // FIFO状态寄存器

//

uchar sta; // 状态变量

#define RX_DR (sta & 0x40) // 接收成功中断标志

#define TX_DS (sta & 0x20) // 发射成功中断标志

#define MAX_RT (sta & 0x10) // 重发溢出中断标志

sbit CE=P1^5;

sbit IRQ=P1^0;

sbit CSN=P1^4;

sbit MOSI=P1^2;

sbit MISO=P1^1;

sbit SCK=P1^3;

//sbit key=P1^0;

sbit LED=P0^0;

sbit DQ=P1^6;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};

//uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00};

uchar RX_Buffer[RX_DATA_WITDH];

uchar Temp_Value[]={0x00,0x00};

uchar Temp=0;

uchar Display_Digit[]={0,0,0,0};

bit DS18B20_IS_OK=1;

uchar code df_tab[]={0,1,1,2,3,3,4,4,5,6,6,7,8,8,9,9};//decimal fraction

void _delay_tus(uint x)

{

while(--x);

}

void _delay_us(uint x)

{

uint i,j;

for (j=0;j<x;j++)

for (i=0;i<12;i++);

}

void _delay_ms(uint x)

{

uint i,j;

for (j=0;j<x;j++)

for (i=0;i<120;i++);

}

//

/函数功能:DS18B20初始化 /

/入口参数:无 /

/出口函数:status /

//

uchar DS18B20_Init(void)

{

uchar status;

DQ=1;

_delay_tus(10);

DQ=0;

_delay_tus(90);

DQ=1;

_delay_tus(8);

status=DQ;

_delay_tus(100);

DQ=1;

return status;

}

//

/函数功能:从DS18B20读取一字节/

/入口参数:无 /

/出口函数:dat(返回读取到数据) /

//

uchar Read_One_Byte(void)

{

uchar i,dat=0;

DQ=1;

_nop_();

for(i=8;i>0;i--)

{

DQ=0;

dat>>=1;

DQ=1;

_nop_();_nop_();

if(DQ)

dat|=0x80;

_delay_tus(30);

DQ=1;

}

return dat;

}

//

/函数功能:向DS18B20写一字节 /

/入口参数:dat(把dat写入DS18B20) /

/出口函数:无 /

//

void Write_One_Byte(uchar dat)

{

uchar i;

for(i=8;i>0;i--)

{

DQ=0;

DQ=dat&0x01;

_delay_tus(5);

DQ=1;

dat>>=1;

}

}

//

/函数功能:从DS18B20读取数据(数据)/

/入口参数:无 /

/出口函数:无 /

//

void Read_Temp(void)

{

uchar ng=0;

if(DS18B20_Init()==1)

DS18B20_IS_OK=0;

else

{

Write_One_Byte(0xcc);

Write_One_Byte(0x44);

DS18B20_Init();

Write_One_Byte(0xcc);

Write_One_Byte(0xbe);

Temp_Value[0]=Read_One_Byte();

Temp_Value[1]=Read_One_Byte();

DS18B20_IS_OK=1;

}

if((Temp_Value[1]&0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;

}

Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];

Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);

Display_Digit[3]=Temp/100;

Display_Digit[2]=Temp%100/10;

Display_Digit[1]=Temp%10;

}

//

/函数功能:从DS18B20读取数据转换成ASCII码写入液晶 /

/模块 /

/入口参数:无 /

/出口函数:无 /

//

/void Display_Temperature(void)

{

uchar ng=0;

if((Temp_Value[1]&0xf8)==0xf8)

{

Temp_Value[1]=~Temp_Value[1];

Temp_Value[0]=~Temp_Value[0]+1;

if(Temp_Value[0]==0x00)

Temp_Value[1]++;

ng=1;

}

Display_Digit[0]=df_tab[Temp_Value[0]&0x0f];

Temp=((Temp_Value[0]&0xf0)>>4)|((Temp_Value[1]&0x07)<<4);

Display_Digit[3]=Temp/100;

Display_Digit[2]=Temp%100/10;

Display_Digit[1]=Temp%10;

}

Display_LINE1[13]=0x43;

Display_LINE1[12]=0xdf;

Display_LINE1[11]=Display_Digit[0]+'0';

Display_LINE1[10]='';

Display_LINE1[9]=Display_Digit[1]+'0';

Display_LINE1[8]=Display_Digit[2]+'0';

Display_LINE1[7]=Display_Digit[3]+'0';

if(Display_Digit[3]==0)

Display_LINE1[7]=' ';

if(Display_Digit[2]==0&&Display_Digit[3]==0)

Display_LINE1[8]=' ';

if(ng)

{

if(Display_LINE1[8]==' ')

Display_LINE1[8]='-';

else if(Display_LINE1[7]==' ')

Display_LINE1[7]='-';

else

Display_LINE1[6]='-';

}

LCD_POS(0);

Show_String(Display_LINE0);

LCD_POS(0x40);

Show_String(Display_LINE1);

}

void main(void)

{

Init_LCD();

Read_Temp();

_delay_ms(1000);

while(1)

{

Read_Temp();

if(DS18B20_IS_OK)

Display_Temperature();

_delay_ms(200);

}

}/

/nRF24L01初始化/

void nRF24L01_Init(void)

{

_delay_us(2000);

CE=0;//待机模式Ⅰ

CSN=1;

SCK=0;

IRQ=1;

}

/SPI时序函数/

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0;i<8;i++)//一字节8位循环8次写入

{

if(byte&0x80)//如果数据最高位是1//当访问多字节寄存器时首先要读/写的是最低字节的高位

MOSI=1;//向NRF24L01写1

else //否则写0

MOSI=0;

byte<<=1;//低一位移到最高位

SCK=1;//SCK拉高,写入一位数据,同时读取一位数据

if(MISO)

byte|=0x01;

SCK=0;//SCK拉低

}

return byte;//返回读取一字节

}

/SPI写寄存器一字节函数/

/reg:寄存器地址/

/value:一字节(值)/

uchar SPI_W_Reg(uchar reg,uchar value)

{

uchar status;//返回状态

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时读取状态

SPI_RW(value);//写入一字节

CSN=1;//

return status;//返回状态

}

/SPI/

uchar SPI_R_byte(uchar reg)

{

uchar reg_value;

CSN=0;//SPI片选

SPI_RW(reg);//写入地址

reg_value=SPI_RW(0);//读取寄存器的值

CSN=1;

return reg_value;//返回读取的值

}

/SPI读取RXFIFO寄存器数据/

/reg:寄存器地址/

/Dat_Buffer:用来存读取的数据/

/DLen:数据长度/

uchar SPI_R_DBuffer(uchar reg,uchar Dat_Buffer,uchar Dlen)

{

uchar status,i;

CSN=0;//SPI片选

status=SPI_RW(reg);//写入寄存器地址,同时状态

for(i=0;i<Dlen;i++)

{

Dat_Buffer[i]=SPI_RW(0);//存储数据

}

CSN=1;

return status;

}

/SPI向TXFIFO寄存器写入数据/

/reg:写入寄存器地址/

/TX_Dat_Buffer:存放需要发送的数据/

/Dlen:数据长度/

uchar SPI_W_DBuffer(uchar reg,uchar TX_Dat_Buffer,uchar Dlen)

{

uchar status,i;

CSN=0;//SPI片选,启动时序

status=SPI_RW(reg);

for(i=0;i<Dlen;i++)

{

SPI_RW(TX_Dat_Buffer[i]);//发送数据

}

CSN=1;

return status;

}

/设置发送模式/

void nRF24L01_Set_TX_Mode(uchar TX_Data)

{

CE=0;//待机(写寄存器之前一定要进入待机模式或掉电模式)

SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);/写寄存器指令+接收节点地址+地址宽度/

SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);/为了接收设备应答信号,接收通道0地址与发送地址相同/

SPI_W_DBuffer(W_TX_PLOAD,TX_Data,TX_DATA_WITDH);/写有效数据地址+有效数据+有效数据宽度/

SPI_W_Reg(W_REGISTER+EN_AA,0x01);/接收通道0自动应答/

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);/使能接收通道0/

SPI_W_Reg(W_REGISTER+SETUP_RETR,0);/自动重发延时250US+86US,重发10次/

//SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);

SPI_W_Reg(W_REGISTER+RF_CH,0x40);/(2400+40)MHZ选择射频通道0X40/

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);/1Mbps速率,发射功率:0DBM,低噪声放大器增益/

SPI_W_Reg(W_REGISTER+CONFIG,0x0e);/发送模式,上电,16位CRC校验,CRC使能/

CE=1;//启动发射

_delay_ms(5);/CE高电平持续时间最少10US以上/

}

uchar Check_Rec(void)

{

uchar status;

sta=SPI_R_byte(R_REGISTER+STATUS);

if(RX_DR)

{

CE=0;

SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);

status=1;

}

SPI_W_Reg(W_REGISTER+STATUS,0xff);

return status;

}

/检测应答信号/

uchar Check_Ack(void)

{

sta=SPI_R_byte(R_REGISTER+STATUS);/读取寄存状态/

if(TX_DS||MAX_RT)/如果TX_DS或MAX_RT为1,则清除中断和清除TX_FIFO寄存器的值/

{

SPI_W_Reg(W_REGISTER+STATUS,0xff);

CSN=0;

SPI_RW(FLUSH_TX);

CSN=1;

return 0;

}

else

return 1;

}

void main(void)

{

uchar i;

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

nRF24L01_Init();

Read_Temp();

_delay_ms(1000);

while(1)

{

Read_Temp();

if(DS18B20_IS_OK)

{

for(i=0;i<TX_DATA_WITDH-4;i++)//减1是因为最后一位为结束标志

{

LED=~LED;

nRF24L01_Set_TX_Mode(&Display_Digit[i]);

_delay_ms(100);

while(Check_Ack());

//LED=0;

}

}

}

}

/无线温度接收/

#include <reg52h>

#include <intrinsh>

#define uint unsigned int

#define uchar unsigned char

#define TX_ADDR_WITDH 5//发送地址宽度设置为5个字节

#define RX_ADDR_WITDH 5

#define TX_DATA_WITDH 5

#define RX_DATA_WITDH 5

/

// nRF24L01指令格式:

/

#define R_REGISTER 0x00 // 读寄存器

#define W_REGISTER 0x20 // 写寄存器

#define R_RX_PLOAD 0x61 // 读RX FIFO有效数据,1-32字节,当读数据完成后,数据被清除,应用于接收模式

#define W_TX_PLOAD 0xA0 // 写TX FIFO有效数据,1-32字节,写 *** 作从字节0开始,应用于发射模式

#define FLUSH_TX 0xE1 // 清除TX FIFO寄存器,应用于发射模式

#define FLUSH_RX 0xE2 // 清除RX FIFO寄存器,应用于接收模式

#define REUSE_TX_PL 0xE3 // 重新使用上一包有效数据,当CE为高过程中,数据包被不断的重新发射

#define NOP 0xFF // 空 *** 作,可以用来读状态寄存器

/

// nRF24L01寄存器地址

/

#define CONFIG 0x00 // 配置寄存器

#define EN_AA 0x01 // “自动应答”功能寄存器

#define EN_RX_ADDR 0x02 // 接收通道使能寄存器

#define SETUP_AW 0x03 // 地址宽度设置寄存器

#define SETUP_RETR 0x04 // 自动重发设置寄存器

#define RF_CH 0x05 // 射频通道频率设置寄存器

#define RF_SETUP 0x06 // 射频设置寄存器

#define STATUS 0x07 // 状态寄存器

#define OBSERVE_TX 0x08 // 发送检测寄存器

#define CD 0x09 // 载波检测寄存器

#define RX_ADDR_P0 0x0A // 数据通道0接收地址寄存器

#define RX_ADDR_P1 0x0B // 数据通道1接收地址寄存器

#define RX_ADDR_P2 0x0C // 数据通道2接收地址寄存器

#define RX_ADDR_P3 0x0D // 数据通道3接收地址寄存器

#define RX_ADDR_P4 0x0E // 数据通道4接收地址寄存器

#define RX_ADDR_P5 0x0F // 数据通道5接收地址寄存器

#define TX_ADDR 0x10 // 发送地址寄存器

#define RX_PW_P0 0x11 // 数据通道0有效数据宽度设置寄存器

#define RX_PW_P1 0x12 // 数据通道1有效数据宽度设置寄存器

#define RX_PW_P2 0x13 // 数据通道2有效数据宽度设置寄存器

#define RX_PW_P3 0x14 // 数据通道3有效数据宽度设置寄存器

#define RX_PW_P4 0x15 // 数据通道4有效数据宽度设置寄存器

#define RX_PW_P5 0x16 // 数据通道5有效数据宽度设置寄存器

#define FIFO_STATUS 0x17 // FIFO状态寄存器

//

uchar sta; // 状态变量

#define RX_DR (sta & 0x40) // 接收成功中断标志

#define TX_DS (sta & 0x20) // 发射成功中断标志

#define MAX_RT (sta & 0x10) // 重发溢出中断标志

sbit CE=P1^5; //RX/TX模式选择端

sbit IRQ=P1^0; //可屏蔽中断端

sbit CSN=P1^4; //SPI片选端//就是SS

sbit MOSI=P1^2;//SPI主机输出从机输入端

sbit MISO=P1^1;//SPI主机输出从机输出端

sbit SCK=P1^3;//SPI时钟端

sbit LED=P0^0;

sbit key=P2^0;

sbit LCD_RS=P2^2;

sbit LCD_RW=P2^1;

sbit LCD_EN=P2^0;

uchar code TX_Addr[]={0x34,0x43,0x10,0x10,0x01};

uchar code TX_Buffer[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

uchar RX_Buffer[RX_DATA_WITDH];

uchar code Display_LINE0[]={" FROM NRF24L01:"};

uchar Display_LINE1[]={" TEMP: "};

void _delay_us(uint x)

{

uint i,j;

for (j=0;j<x;j++)

for (i=0;i<12;i++);

}

void _delay_ms(uint x)

{

uint i,j;

for (j=0;j<x;j++)

for (i=0;i<120;i++);

}

bit LCD_Busy(void)//测忙

{

bit LCD_Status;//返回值变量

LCD_RS=0;//读取状态

LCD_RW=1;

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_Status=(bit)(P3&0x80);

LCD_EN=0;

return LCD_Status;

}

void LCD_Write_Command(uchar cmd)//写指令

{

//while(LCD_Busy());

LCD_RS=0;//

LCD_RW=0;

LCD_EN=0;

_nop_();_nop_();

P3=cmd;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=0;

}

void LCD_Write_Data(uchar dat)//写数据

{

//while(LCD_Busy());//每次写数据 *** 作之前均需要检测忙信号

LCD_RS=1;

LCD_RW=0;

LCD_EN=0;

P3=dat;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=1;

_nop_();_nop_();_nop_();_nop_();

LCD_EN=0;

}

void Init_LCD(void)//液晶初始化

{

_delay_ms(15);//延时15MS

LCD_Write_Command(0x38);

_delay_ms(5);

LCD_Write_Command(0x38);

_delay_ms(5);

LCD_Write_Command(0x38);//以后每次写指令 *** 作之前均需要检测忙信号

//while(LCD_Busy());

_delay_ms(5);

LCD_Write_Command(0x01);//清屏

//while(LCD_Busy());

_delay_ms(5);

LCD_Write_Command(0x38);//设置162显示,57点阵,8位数据接口

_delay_ms(5);

//while(LCD_Busy());

LCD_Write_Command(0x0c);//开显示,不显示光标

_delay_ms(5);

//while(LCD_Busy());

LCD_Write_Command(0x06);//当读或写一个字符后地址指针加一,且光标加一

}

void LCD_POS(uchar pos)//字符显示位置

{

LCD_Write_Command(0x80|pos);

}

void Show_String(uchar str)//显示字符串

{

while(str!='\0')

LCD_Write_Data(str++);

}

void nRF24L01_Init(void)

{

_delay_us(2000);

CE=0;

CSN=1;

SCK=0;

IRQ=1;

}

uchar SPI_RW(uchar byte)

{

uchar i;

for(i=0;i<8;i++)

{

if(byte&0x80)

MOSI=1;

else

MOSI=0;

byte<<=1;

SCK=1;

if(MISO)

byte|=0x01;

SCK=0;

}

return byte;

}

uchar SPI_W_Reg(uchar reg,uchar value)

{

uchar status;

CSN=0;

status=SPI_RW(reg);

SPI_RW(value);

CSN=1;

return status;

}

uchar SPI_R_byte(uchar reg)

{

uchar status;

CSN=0;

SPI_RW(reg);

status=SPI_RW(0);

CSN=1;

return status;

}

uchar SPI_R_DBuffer(uchar reg,uchar Dat_Buffer,uchar Dlen)

{

uchar reg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;i<Dlen;i++)

{

Dat_Buffer[i]=SPI_RW(0);

}

CSN=1;

return reg_value;

}

uchar SPI_W_DBuffer(uchar reg,uchar TX_Dat_Buffer,uchar Dlen)

{

uchar reg_value,i;

CSN=0;

reg_value=SPI_RW(reg);

for(i=0;i<Dlen;i++)

{

SPI_RW(TX_Dat_Buffer[i]);

}

CSN=1;

return reg_value;

}

void nRF24L01_Set_RX_Mode(void)

{

CE=0;//待机

//SPI_W_DBuffer(W_REGISTER+TX_ADDR,TX_Addr,TX_ADDR_WITDH);

SPI_W_DBuffer(W_REGISTER+RX_ADDR_P0,TX_Addr,TX_ADDR_WITDH);

SPI_W_Reg(W_REGISTER+EN_AA,0x01);

SPI_W_Reg(W_REGISTER+EN_RX_ADDR,0x01);

//SPI_W_Reg(W_REGISTER+SETUP_RETR,0);

SPI_W_Reg(W_REGISTER+RX_PW_P0,RX_DATA_WITDH);

SPI_W_Reg(W_REGISTER+RF_CH,0x40);

SPI_W_Reg(W_REGISTER+RF_SETUP,0x07);

SPI_W_Reg(W_REGISTER+CONFIG,0x0f);

CE=1;

_delay_ms(5);

}

uchar nRF24L01_RX_Data(void)

{

//uchar i,status;

sta=SPI_R_byte(R_REGISTER+STATUS);

if(RX_DR)

{

CE=0;

SPI_R_DBuffer(R_RX_PLOAD,RX_Buffer,RX_DATA_WITDH);

//P3=RX_Buffer[0];

SPI_W_Reg(W_REGISTER+STATUS,0xff);

CSN=0;

SPI_RW(FLUSH_RX);

CSN=1;

return 1;

}

else

return 0;

}

void main(void)

{

uchar i,RX_Temp_Value[RX_DATA_WITDH];//ng;

P0=0xff;

P1=0xff;

P2=0xff;

P3=0xff;

Init_LCD();

nRF24L01_Init();

_delay_us(1000);

LCD_POS(0);

Show_String(Display_LINE0);

while(1)

{

nRF24L01_Set_RX_Mode();

//_delay_ms(100);

if(nRF24L01_RX_Data())

{

for(i=0;i<RX_DATA_WITDH;i++)

{

RX_Temp_Value[i]=RX_Buffer[i];

LED=~LED;

}

}

Display_LINE1[7]=RX_Temp_Value[3]+'0';

Display_LINE1[8]=RX_Temp_Value[2]+'0';

Display_LINE1[9]=RX_Temp_Value[1]+'0';

Display_LINE1[10]='';

Display_LINE1[11]=RX_Temp_Value[0]+'0';

Display_LINE1[12]=0xdf;

Display_LINE1[13]=0x43;

if(RX_Temp_Value[3]==0)

Display_LINE1[7]=' ';

/if(RX_Temp_Value[2]==0&&RX_Temp_Value[3]==0)

Display_LINE1[8]=' ';

if(ng)

{

if(Display_LINE1[8]==' ')

Display_LINE1[8]='-';

else if(Display_LINE1[7]==' ')

Display_LINE1[7]='-';

else

Display_LINE1[6]='-';/

LCD_POS(0x40);

Show_String(Display_LINE1);

}

}

已通过测试的,希望能帮助到你!

1602A液晶屏驱动程序 晶 振 频 率:110592M/#include <reg51h>#define uchar unsigned char#define uint unsigned int sbit LCM_E=P3^5;//定义接口sbit LCM_RW=P3^6;sbit LCM_RS=P3^7; #define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM);void LCM_WriteCommand(uchar WCLCM,BuysC);uchar LCM_ReadData(void);uchar LCM_ReadStatus(void);void LCM_Init(void);void DisplayOneChar(uchar X, uchar Y, uchar DData);void DisplayListChar(uchar X, uchar Y, uchar code DData);void Delay5Ms(void);void Delay400Ms(void); uchar code uctech[] = {"1602A"};uchar code net[] = {">

所有人回答的都不对,其实是忘了将1602第5脚rw设置为0了,而郭天祥的板子是直接接地,所以不用设置,但是别的板子却不能照搬了。所以程序应改为

sbit lcdrw=P3^6;

void write_com(uchar com)

{

lcdrs=0;

lcdrw=0;//加这一条

P0=com;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void write_data(uchar date)

{

lcdrs=1;

lcdrw=0;//加这一条

P0=date;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

以上就是关于51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序全部的内容,包括:51单片机和DS18B20温度传感器、LCD1602液晶显示,NRF24L01无线传输模块 的无线温度监测系统的收发程序、单片机液晶显示驱动程序(用C语言写的)、我看郭天祥的十天学会51单片机里的程序,买了块TX的51开发板 编写1602液晶显示的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9844307.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存