C51单片机串口的使用方法解析

很多朋友在使用单片机串口的时候存在着一定的问题,我根据自己的经验,给大家总结如下:
串口调试
经过调试,以上功能基本实现,目前可以通过上位机对单片机进行实时控制。
程序如下:
这是一个单片机c51串口接收(中断)和发送例程,可以用来测试51单片机的中断接收和查询发送,另外我觉得发送没有必要用中断,因为程序的开销是一样的。
#i nclude
#i nclude
#i nclude
#define inbuf_len 4 //数据长度
unsigned char inbuf1[inbuf_len];
unsigned char checksum,count3 , flag,temp,ch;
bit read_flag=0;
sbit cp=p1^1;
sbit dir=p1^2;
int i;
unsigned int xdata *ramdata; /*定义ram地址指针*/
unsigned char a[6] ={0x11,0x22,0x33,0x44,0x55,0x66} ;
void init_serialcomm(void)
{
scon=0x50; //在11.0592mhz下,设置串行口波特率为9600,方式1,并允许接收
pcon=0x00;
es=1;
tmod=0x21; //定时器工作于方式2,自动装载方式
th0=(65536-1000)%256;
tl0=(65536-1000)/256;
tl1=0xfd;
th1=0xfd;
et0=1;
tr0=1;
tr1=1;
// ti=0;
ea=1;
// ti=1;
ramdata=0x1f45;
}
void serial () interrupt 4 using 3
{
if(ri)
{ ri=0;
ch=sbuf;
ti=1; //置sbuf空
switch(ch)
{
case 0x01 :printf(“a”); ti=0;break;
case 0x02 :printf(“b”); ti=0;break;
case 0x03 :printf(“c”); ti=0;break;
case 0x04 :printf(“d”); ti=0;break;
default :printf(“fg”); ti=0;break;
}
}
}
//向串口发送一个字符
void timer0() interrupt 1 using 3{
// char i;
flag++;
th0=0x00;
tl0=0x00;
if(flag==10)
{// cp=!cp;
// for(i=0;i《6;i++)
p2=0x25;
ti=1;
temp=*ramdata;
printf(“%c”,temp);
ti=0;
// ramdata--;
flag=0;
}
}
//主程序
main()
{
init_serialcomm(); //初始化串口
//向6264中送数据
{
*ramdata=0x33;
}
while(1)
{
*ramdata=0x33;;
}
}
调试过程中遇到的问题:
1.发送过程:在发送时必须保证ti=1:即发送缓冲器为空,否则将导致数据发不出去,如果想强制发送可以用:ti=1.具体发送数据:利用printf(“akjdfaklfj”);函数直接发送即可。
2.接收过程:在接收时多选用中断方式,这样可以节约cpu的时间,提高效率。

整合数字电源管理和模拟控制环路的DC/DC控制器设计
开箱即用!教你如何正确使用华为云部署服务CodeArts Deploy!
在未来汽车能够远程控制家居系统吗
输入输出接口的类型和功能特点
云栖大会人脸识别闸机【技术亮点篇3】--人脸识别闸机摆闸可达500万次
C51单片机串口的使用方法解析
微软鼠标走向人体工程学 带你赏析微软精准鼠标的ID设计
全球首款最轻的助行器,为行动不便的人士带来帮助
spring boot入门篇
农机蓄电池冬季如何防冻
工业相机解决方案:低功耗16位数模转换芯片+负压线性稳压器YSO690PR
加密货币正在为替代支付系统,未来五年将有10亿人使用加密货币
荣耀V9评测:华为荣耀V9怎么样?配置、价格、外观、系统一览,你中了它的毒了吗?
物业小区高校水电抄表充值管理系统简介
很可能这就是诺基亚8将搭载骁龙835,但依然延迟
5G 不仅对消费者有利,物联网也将受益
i.MX6ULL|字符设备驱动流程深究
韩国正在接收40架F-35A战斗机
微雪电子M24LR-DISCOVERY开发板简介
具有快速瞬态响应的极低压差稳压电路