完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
51单片机串口通信大家好,新手,单片机AT89S52,实现与上位机的通信,现在测试程序主要功能是用上位机向单片机发送数据,单片机再将数据返回,用的串口猎人。
程序如下 #include #include void delay_us(unsigned int us); void main() { uchar buffer; usart0_initial(); while(1) { delay_us(10); buffer=get_char(); //读取上位机数据 delay_us(10); send_char(buffer); //发送数据至上位机 } } /***************************************************************************************************** *函数名称:delay_us(unsigned int us) *函数功能:微秒级延时函数 *函数入口:us *函数出口:无 ******************************************************************************************************/ void delay_us(unsigned int us) { uchar delayi; while(--us) { for(delayi=0;delayi<10;delayi++); } } #define TARGET_GLOBAL 1 #include /***************************************************************************************************** *函数名称:usart0_Inital(void) *函数功能:初始化串口 *入口函数:无 *出口函数:无 ******************************************************************************************************/ void usart0_Initial(void) {/*************************************TH1=256-(K*oscFreq)/384*BaudRate*********/ SCON=0x50;//SM0=0;SM1=1;REN=1,工作于方式1,允许接受数据,因为SCON存在位地址,可以进行位操作 TI=0;//发送中断标志位清零,准备数据发送 RI=0;//接受中断标志位清零,准备数据接收 PCON=0; //波特率不加倍 TH1=0xf3;//bode=2400 TL1=0xf3; TMOD=0x20; //设定定时器1工作于方式2,即自动重载8位定时器 ET1=0; //关闭定时器1中断 TR1=1; //启动定时器1,因为TCON寄存器存在位地址,可以进行位操作 ES=0; //关闭串行口中断,因为IE寄存器存在位地址,可以进行位操作 } /***************************************************************************************** *函数名称: send_char(uchar txd) *函数功能: 串口发送一个字符 *入口函数: 要发送的一个字符 txd *出口函数: 无 *******************************************************************************************/ void send_char(uchar txd) { TI=0; SBUF=txd; while(!TI); //等待数据传送 TI=0; //清除数据传送标志 } /******************************************************************************************* *函数名称:send_str(uchar *str, uchar len) *函数功能:串口发送一行字符串 *函数入口:字符串指针*str,字符串长度len *函数出口:无 ********************************************************************************************/ void send_str(uchar*str, uchar len) { uchar i; for(i=0;i } /********************************************************************************************** *函数名称:get_char(void) *函数功能:串口接收一个字符 *函数入口:串口接收的字符?rxd? *函数出口:无 *************************************************************************************************/ uchar get_char(void) { uchar temp; RI=0;//接受中断标志位清零,准备数据接收 while(!RI); //等待上位机传送数据 temp=SBUF; //从缓冲寄存器中读取数据,接受到8位数据时,RI会自动置1 RI=0; //接受中断标志位清零,准备下一次的数据接收 return temp; 发现在收发的过程中会出现错误,上位机对单片机发01,单片机返回的数值有时变成81 而且没有规律可循! 另外我现在想用串口实现单片机对上位机的数据传送 功能就是,当串口连上上位机后,就自动向上位机传送数据,希望能尽量避免数据错误或丢失。希望有校验功能 我的用的是MAX232D 哪位高人有类似的参考程序,谢谢了 |
|
相关推荐
6个回答
|
|
在线等啊
|
|
|
|
在线等啊
|
|
|
|
你的程序里没有串口中断处理程序吗?再就是串口助手发送的时候选择十六进制发送。
|
|
|
|
这个程序把串口中断关了哦 还不知道怎么用中断了
|
|
|
|
你这样不是用串口中断的方法,还是用函数的方法来控制串口。找一本单片机的书看看吧,看看里面是怎么用串口中断的。加油!!!!
|
|
|
|
非常感谢已经解决了
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
852 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
592 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
705 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
926 浏览 2 评论
657 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12009 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 10:07 , Processed in 0.690621 second(s), Total 84, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号