由于暂时只用到屏幕按钮和文本框显示,所以只写了这俩。
首先是双向通讯,所以首先配置定时器,9600,8,NO,1
void Uart1Init(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES =1; //开中断
EA = 1;
}
定时器配置好后,开始写发送一位的程序
void send_data(unsigned char i_data)
{
SBUF = i_data;
while(!TI);
TI = 0;
}
其中SBUF为51特殊串口数据缓冲寄存器,我这里理解为给他赋值,单片机自动发送,反之则接收。
这边再附上一个发送多位的程序段,注意uchar。
uchar rcv_data[30]=0,HuaMian,Butten,rcv_falg,S_butten;
for( rcv_bit_number=0;rcv_bit_number<=8;rcv_bit_number++)//发送9位,0到8
{
send_data(rcv_data[rcv_bit_number]);
}
接收程序
void UART() interrupt 4
{
if(RI)
{
RI=0;
rcv_data[i] = SBUF;
if(rcv_data[0] == 0XEE ) //如果接收到帧头为EE 则开始接收后边的数据,否则丢弃重新接收
{
++i;
}
else
{
i=0;
}
}
if( rcv_data[i-4]==0XFF && rcv_data[i-3]==0XFC && rcv_data[i-2]==0XFF && rcv_data[i-1]==0XFF)//判断帧尾是否正确
{
w = i;
i=0;
rcv_falg = 1; //接收完成后给主程序一个标志,然后主程序处理。
}
}
好了,懒得一个个介绍了,上高速,直接放完整程序。
#include "reg52.h"
sbit LED = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;
sbit L = P3^5;
sbit L1 = P3^4;
sbit L2 = P3^3;
int i=0,rcv_bit_number=0,wen,yanshi; // i为内部数据位 w为数据个数i传出的值 rcv_bit_number循环用于发送数据
unsigned char w=0,n,rcv_data[30]=0,HuaMian,Butten,rcv_falg,S_butten;//rcv_da[30]=0,
unsigned wendu_ZhiLin[] = {0xEE,0xB1,0x10,0x00,0x00,0x00,0x04,0x20,0x20,0x30,0xFF,0xFC,0xFF,0xFF };
unsigned code call[]= {0X30,0X31,0X32,0X33,0X34,0X35,0X36,0X37,0X38,0X39};//0 1 2 3 4 5 6 7 8 9{};
void Uart1Init(void);
void send_data(unsigned char i_data);
char putchar(char c);
void fanhui() //按钮判断函数
{
switch(rcv_data[4])
{
case 0X00: HuaMian = 00;break;
case 0X01: HuaMian = 10;break;
case 0X02: HuaMian = 20;break;
case 0X03: HuaMian = 30;break;
case 0X04: HuaMian = 40;break;
case 0X05: HuaMian = 50;break;
}
switch(rcv_data[6])
{
case 0: Butten = 0;break;
case 1: Butten = 1;break;
case 2: Butten = 2;break;
case 3: Butten = 3;break;
case 4: Butten = 4;break;
case 5: Butten = 5;break;
}
n = Butten+HuaMian;
}
send_wendu( unsigned char wendu , unsigned char JieMianID,unsigned char KuangID)
{
unsigned char Gewei,Shiwei,Baiwei;
Gewei = wendu/1%10;
Shiwei = wendu/10%10;
Baiwei = wendu/100%10;
wendu_ZhiLin[4] = JieMianID;
wendu_ZhiLin[6] = KuangID;
wendu_ZhiLin[7] = call[Baiwei];
wendu_ZhiLin[8] = call[Shiwei];
wendu_ZhiLin[9] = call[Gewei];
for( rcv_bit_number=0;rcv_bit_number<=13;rcv_bit_number++)
{
send_data(wendu_ZhiLin[rcv_bit_number]);
}
return 0 ;
}
void wendu_INCV()//初始化温度显示
{
for( rcv_bit_number=0;rcv_bit_number<=13;rcv_bit_number++)
{
send_data(wendu_ZhiLin[rcv_bit_number]);
}
}
void main()
{
L=1;
L1=1;
wen = 0;//温度值
Uart1Init();
wendu_INCV();
while(1)
{
fanhui(); //返回按钮值,界面+按钮 返回参数为n
if( L == 0) //发送接收到的数据
{
send_wendu(wen,0,04);
++wen;
rcv_falg = 0;
// while(L==0);
}
switch(n) //判断哪个按钮按下如
{
case 01: LED=rcv_data[9] ^ 0x01;break;
case 02: LED1=rcv_data[9]^ 0x01;break;
case 03: LED2=rcv_data[9]^ 0x01;break;
case 04: LED3=rcv_data[9]^ 0x01;break;
}
}
}
void Uart1Init(void) //9600bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x20; //设置定时器模式
TL1 = 0xFD; //设置定时初始值
TH1 = 0xFD; //设置定时重载值
ET1 = 0; //禁止定时器中断
TR1 = 1; //定时器1开始计时
ES =1;
EA = 1;
}
void send_data(unsigned char i_data)
{
SBUF = i_data;
while(!TI);
TI = 0;
}
void UART() interrupt 4
{
if(RI)
{
RI=0;
rcv_data[i] = SBUF;
if(rcv_data[0] == 0XEE ) //如果接收到帧头为EE
{
++i;
}
else
{
i=0;
}
}
if( rcv_data[i-4]==0XFF && rcv_data[i-3]==0XFC && rcv_data[i-2]==0XFF && rcv_data[i-1]==0XFF)//判断帧尾是否正确
{
w = i;
i=0;
rcv_falg = 1;
}
}
大彩屏幕那边,界面ID为0,按钮1,2,3,文本框ID为4.
感觉有用的话点个赞吧