51单片机与大彩屏幕通讯

由于暂时只用到屏幕按钮和文本框显示,所以只写了这俩。

首先是双向通讯,所以首先配置定时器,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.

感觉有用的话点个赞吧

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值