#include<reg52h>
unsigned char code table[] ={" "};
unsigned char code table1[]={" : "};
sbit rs=P1^2;
sbit lcden=P1^0;
unsigned char flag,m;
void delay(int xms)
{
int i,j;
for(i=xms;i>0;i--) //i=xms即延时约xms毫秒
for(j=110;j>0;j--);
}
void write_com(unsigned char com)
{//写液晶命令函数
rs=0;
lcden=0;
P2=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(unsigned char date)
{//写液晶数据函数
rs=1;
lcden=0;
P2=date;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void init()
{//初始化函数
unsigned char num;
lcden=0;
rs=0;
write_com(0x38);//1602液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(num=0;num<15;num++)//写入液晶固定部分显示
{
write_date(table[num]);
delay(3);
}
write_com(0x80+0x40);
for(num=0;num<5;num++)
{
write_date(table1[num]);
delay(3);
}
}
void write_dianya(unsigned char add,unsigned char date)
{//1602液晶刷新时分秒函数4为时,7为分,10为秒
unsigned char bai,shi,ge;
bai=date/100;
shi=date%100/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+bai);
write_date(0x30+shi);
write_date(0x30+ge);
}
void main ()
{
init();
TMOD=0x20; //设置定时器1工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1; //设置串行口工作方式
SM0=0;
SM1=1;
EA=1; //中断设置
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
SBUF=m;
while(!TI);
TI=0;
ES=1;
}
}
}
void ser() interrupt 4
{
RI=0;
m=SBUF;
write_dianya(5,m);
flag=1;
}
举个例子
二、 串行口通讯方式:
21 工作方式:主从方式。上位机为主,顺序闪光灯主机为从;控制命令和查询命令由上位机发出,顺序闪光灯主机做相应信息返回。
22 工作模式:8位数据,无校验;对于51系列单片机为模式1
23 波特率:1200,2400,4800,9600(可选,缺省为4800)。
24 信息格式:
序号 名称 字节数 内容 说明
1 帧信息头 1 0xAA 用于表示信息的开始
2 帧信息类型 1 控制0x01 用于区别控制命令、查询命令及返回信息;“控制”和“查询”由上位机发出,“返回”为顺序闪光灯主机返回信息时发出。
查询0x02
返回0x03
3 有效信息长度 1 n 表示有效信息的字节数
4 有效信息 n n个字节 有效信息。详见具体信息定义
5 校验码 1 LRC 对帧信息类型、有效信息长度、有效信息进行单字节相加,取低8位补码(即对低8位取反后再加一)作为校验码。
说明:上位机和顺序闪光灯主机使用相同的信息格式,不同之处在于信息类型、信息长度的不同。
如下即可:
void ser() interrupt 4
{
RI = 0;
flag = ~flag; //每收到一次,就取反
if(flag) P1 = SBUF;
else P2 = SBUF;
}
但是,仅仅发送两个字节的数据,第一、第二字节,不好区分。
应该编写通信协议。
以上就是关于C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢全部的内容,包括:C51单片机从串口接收数据多个字节的数据的C语言程序,谢谢、51单片机C语言的串口通讯协议、51单片机 c程序有问 串口通信 16位分2个8位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)