设计一个51单片机串口奇偶校验程序 发送1的时候 第一个风扇转 发送2的时候 第二个风扇转 发送3的时候 第三个风扇

51单片机串口程序C语言版
> 51单片机串口程序C语言版
51单片机串口程序C语言版
这篇文章主要来介绍一下51单片机的串口,下面先来看一下与串口相关的寄存器。本文引用地址:
(该图来自51单片机技术文档)下面来逐个介绍个寄存器。SCON寄存器的SM1,SM2主要用来设置串行口的工作方式,具体对应关系见图2,REN:串行口接受使能位,当单片机要接受数据时该位应该置一,TB8:发送数据的第九位。在方式2或者方式3中TB8为发送的第九位数据。该位不是很常用,具体介绍请查看51单片机的技术文档,这里不多做介绍。TI:发送中断标志,由硬件在方式0串行发送第8位结束时置位,或在其它方式串行发送停止位的开始时置位,必须由软件清零。RI:接受中断标志,由硬件由硬件在方式0串行发送第8位结束时置位,或在其它方式串行发送停止位的中间时置位,必须由软件清零。在这里需要提醒的是,大家在看技术文档是一定要注意那些必须由软件清零的标志位,在写程序时一定要记得清零。 图2(本图来自51单片机技术文档)SBUF寄存器:(为了方便就直接截图说明了)PCON寄存器D7位SMOD是串行波特率倍增位,SMOD为一时,串行口在工作方式1,方式2,方式3中波特率加倍,复位时,SMOD=0.寄存器IPH,IPSADEN,SADDR不是很常用,在这里就不做介绍,我下面的程序中也没有用到,感兴趣的可以自己查阅一下技术文档。接下来开始调试串口的方法和步骤。1.STC&ISP下载软件自带串口调试功能。下面是软件界面2.在串口调试之前还必须知道自己学习板接的是电脑的哪个端口,查看端口的方法如下:右键单击桌面上的:我的电脑&设备管理器,如果学习板通过下载线连接到了电脑会显示如下界面:从端口选项中可以看到我连接的是COM3.3接下来的任务就是不程序下载到单片机中开始调试了(程序我会在下面给出,先把调试步骤介绍完)程序下载完毕之后单击STC-ISP下载软件中的:串口助手按钮,就会出现如下界面:然后在点击打开串口按钮,上图中显示的是:关闭串口,是因为我的串口已经打开了,接下来在单字符串发送区,输入要传送的数据,例如传送:77,选择十六进制发送,观察,学习班上LED的亮灭情况,和数据接区的反应。如下图:需要注意的是必须要将COM(即端口号),比特率,校验位,数据位,停止位,设置正确否则会显示乱码。可以观察到的现象是:led的第八个和第四个点亮了,原因也很简单,因为发送的数据是77,选择的是十六进制发送,即,可以看到第8位和第四位是零,所以LED点亮了。接受单口显示data recieve ok,说明单片机数据接受成功。最后也是最重要的就是编写程序了:下面是我的调试程序,希望对大家能有帮助。(因为程序粘贴过来的时候注释会显示乱码,没办法只好使用截图,请大家将就着看一下,还有需要提醒的是程序的第57,58和第29行在截图时重复了请大家仔细对着行标号看就很清楚了)程序的注释写的很清楚,我在这里就不重复解释了,不懂的请大家仔细看注释。
分享给小伙伴们:
我来说两句……
最新技术贴
微信公众号二
微信公众号一查看: 1115|回复: 5
串口发送字符串在液晶上显示,可是只能显示第一个字符,而且发送回上位机的全是00,大家帮我看看是什么原因。
主题帖子精华
中级会员, 积分 406, 距离下一级还需 94 积分
在线时间51 小时
[C] 纯文本查看 复制代码#include &reg52.h&
void ConfigUART(unsigned int baud);
unsigned char buf[64];
unsigned char cntRxd=0;
extern void InitLcd1602();
extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);
void main()
InitLcd1602();
//使能总中断
ConfigUART(9600);
//配置波特率为9600
void ConfigUART(unsigned int baud)
//配置串口为模式1
TMOD &= 0x0F;
//清零T1的控制位
TMOD |= 0x20;
//配置T1为模式2
TH1 = 256 - (/32)/
//计算T1重载值
TL1 = TH1;
//初值等于重载值
//禁止T1中断
//使能串口中断
void InterruptUART() interrupt 4
buf[cntRxd++]=SBUF;
LcdShowStr(0,0,buf);
SBUF=buf[cntRxd++];
buf[cntRxd++]=SBUF;
&LcdShowStr(0,0,buf);
SBUF=buf[cntRxd++];
串口一次只能就收一个字符,你每接收到一个字符,你放在buf中,而且显示一次,但是你发给PC的不是你当前接收到都那个字符,而是buf下一个地址中的字符,所以每次都是00,你改成SBUF=buf[cntRxd-1]试试
主题帖子精华
中级会员, 积分 494, 距离下一级还需 6 积分
在线时间95 小时
buf[cntRxd++]=SBUF;
&LcdShowStr(0,0,buf);
SBUF=buf[cntRxd++];
串口一次只能就收一个字符,你每接收到一个字符,你放在buf中,而且显示一次,但是你发给PC的不是你当前接收到都那个字符,而是buf下一个地址中的字符,所以每次都是00,你改成SBUF=buf[cntRxd-1]试试
主题帖子精华
中级会员, 积分 406, 距离下一级还需 94 积分
在线时间51 小时
误打误撞,我把中断里发送的那几行代码注释掉的话,发送字符串,液晶上是能显示的,这是怎么一回事呀?
主题帖子精华
在线时间559 小时
主题帖子精华
中级会员, 积分 494, 距离下一级还需 6 积分
在线时间95 小时
buf[cntRxd++]=SBUF;&
if(buf[cntRxd-1]&==&'\0')
&&&&LcdShowStr(0,0,buf);
SBUF=buf[cntRxd-1];
主题帖子精华
中级会员, 积分 406, 距离下一级还需 94 积分
在线时间51 小时
回复【5楼】lialong1989:
---------------------------------
好嘞,先谢过了
Powered by}

我要回帖

更多关于 单片机串口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信