为什么我的51单片机向串口发送数据串口只能由电脑发送数据,而无法接受数据

51单片机学习笔记:串口接收和发送数据
12:16:22编辑:什么鱼 关键字:&&&&
芯片STC89C52RC&在PC端向单片机发送任意数据后, 单片机向PC端发送4行文本,由于在windos下,回车换行用\r\n&&&C代码&&#include&&&#include&"MY51.h"&&&&void&&&&initSer();&&&&&&&&&&//串口初始化&&uchar&&sendFlag&=&0;&&&&&//未时&&uchar&&receFlag&=0;&&&&&//未接受到数据时&&&&code&&uchar&&TEXT0[]&=&"****************************\r\n";&&//\r\n是回车换行&&code&&uchar&&TEXT1[]&=&"单片机串口通讯测试\r\n";&&code&&uchar&&TEXT2[]&=&"http://xouou.iteye.com\r\n";&&code&&uchar&&TEXT3[]&=&"****************************\r\n\r\n";//回车换行并空1行&&&&void&sendChar(uchar&sendValue);&&//发送一字节数据&&void&sendAll(uchar&*pValue);&&&&&&&//发送一组数据&&&&void&main(void)&&{&&&&&&initSer();&&&&&&while(1)&&&&&&{&&&&&&&&while(receFlag)&&&&&&&&&&&&&&&//单片机串口收到任意数据后,开始向PC发送数据&&&&&&&&{&&&&&&&&&&&&&sendAll(TEXT0);&&&&&&&&&//发送数据&&&&&&&&&&&&&sendAll(TEXT1);&&&&&&&&&&&&&sendAll(TEXT2);&&&&&&&&&&&&&sendAll(TEXT3);&&&&&&&&&&&&&&receFlag=0;&&&&&&&&&&&&&//发完了清标志&&&&&&&&&&&&}&&&&&&}&&}&&&&void&serInt()&interrupt&4&&&//中断函数&&{&&&&&&if(RI)&&&&&&&&&&&&&&&&&&//如果收到任意数据&&&&&&{&&&&&&&&&&RI&=&0;&&&&&&&&&&P1=SBUF;&&&&&&&&//数据的变化让led灯直观反应出来&&&&&&&&&&receFlag=1;&&&//修改接受标志,便于主函数进入while中发数据&&&&&&}&&&&&&&&&&&&if(TI)&&&&&&{&&&&&&&&&&TI&=&0;&&&&&&&&&&&&&&&&//发送完一个数据&&&&&&&&&&sendFlag&=&0;&&&&&&&&//清标志位&&&&&&}&&}&&&&&&void&sendChar(uchar&Value)&&//发送一个字节数据&&{&&&&&&&SBUF&=&V&&&&&&&&&&&&sendFlag&=&1;&&&&&&&//设置发送标志位,发一字节就置位&&&&&&&while(sendFlag);&&&&//直到发完数据,将sendFlag清零后,才退出sendChar函数&&}&&&&void&sendAll(uchar&*pValue)&//发送一组数据&&{&&&&&&while((*pValue)&!=&'\0')&&&//如果没有发送完毕就继续发&&&&&&{&&&&&&&&&&sendChar(*pValue);&&&&&&//发送1字节数据&&&&&&&&&&pValue++;&&&&&&&&&&&&&&&&&//指向下1个字节&&&&&&}&&}&&&&void&initSer()&&&&&&//初始化&&{&&&&&&//注意:刚上电时,SCON是为0的&&&&&&TMOD=TMOD|0x20;&//T1定时器模式,工作方式2&&&&&&TH1=0X&&&&&&&&//&256-(*12*9600))&&&&&&TL1=0&&&&&&SM0=0;&&&&&&&&&&&//属于SCON寄存器&&&&&&SM1=1;&&&&&&&&&&&//串口工作方式1,10位异步,波特率可改&&&&&&REN=&&&&&&&&&&&&&//允许&&&&&&ES=&&&&&&&&&&&&&//开串口中断&&&&&&EA=&&&&&&&&&&&&&//开总中断&&&&&&TR1=&&&&&&&//启动定时器&&}&&&
关键字:&&&&
来源: eefocus
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
/*&名称:51单片机实现LED流水灯(数组方式和位运算方式)说明:今天又重新开始系统的学习51了,LED就算个开端吧。&要注意两点:&1、sfr和sbit是C语言扩展出来的关键字。其中sfr用于对特殊功能寄存器进行声明,sbit用于对某些特殊功能寄存器的某位进行声明。这里和宏定义很相似,但是不能用宏定义进行替换,对于前者是因为51单片机的寄存器存在于内部空间0x80-0xFF,这空间属于直接寻址,51特殊功能寄存只能直接寻址,不能间接寻址。如果用宏定义的话,在翻译成汇编时就会认为是通过总线访问对应的外部地址了。对于后者,sbit是定义一个标志位,也叫位变量。而类似于#define key1 P3
/*&名称:51单片机之按键实验&说明:键盘是计算机最基础、最重要的输入设备之一。对于键盘来说,其工作任务大体可以分为以下三项:&(1)、按键识别。即判断有无按键按下。&(2)、求键值。判断哪个键被按下。&(3)、执行相应的操作。&在这里,实验所用到的键盘为独立键盘和矩阵键盘。对于独立键盘,它的每个按键需要占用一个IO口。一般来说,按键一端接地,另一端接IO口。当按键按下时,线路被导通,IO口被拉低,即状态为‘0’。所以在使用是我们一般把对应IO口置成高电平,然后不断检测此IO口是否被拉低,从而判断按键是否按下。&对于矩阵键盘来说,它用较少的IO口完成较多个按键
/*&名称:51单片机之数码管显示实验&说明:对于数码管来说,其本质上可以理解为按照一定规则组合的多个二极管。其使用只需按照特定规则显示对应的二极管即可。要稍微注意一点的就是多个数码管的显示分为静态显示和动态显示。静态显示就是每个二极管显示的内容是一样的,通过片选信号来决定是哪个二极管该显示。动态数码管,即利用人眼的视觉停留效果,快速扫描,快速显示每个数码管的内容,使得每个数码管看起来好像是一起显示的一样。&本实验编写了几个数码管显示的简单程序。在此不做赘述了。*/#include &reg52.h&#define uchar unsigned char//共阳极段码(a在高位,dp在低位
最近的一个项目中测试系统的高低温实验,结果意外的发现经过高低温实验后(80℃到-20摄氏度)单片机有些已经死机了,所以不得不着手研究一下这个问题,在网上查阅资料后,基本上可以归结于以下几个问题:1. 意外中断。是否打开了某个中断,但是没有响应和清除中端标志,导致程序一直进入中断,造成死机假象&2. 中断变量处理不妥。若定义某些会在中断中修改的全局变量,这时要注意两个问题:首先为了防止编译器优化中断变量,要在这些变量定义时前加volatile,其次在主循环中读取中断变量前应该首先关闭全局中断,防止读到一半被中断给修改了,读完之后再打开全局中断;否则出现造成数据乱套。&&3. 地址溢出,常见错误为指针操作
51单片机的外部中断有两种模式:电平触发模式和跳变沿触发模式第一,选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。第二,选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。&区别:电平触发模式时,中断标志寄存器不锁存电平中断请求信号。单片机把每个周期的S5P2采样外部中断口的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换言之,就是要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行
最近看了一下80C51单片机的中断部分的实验,做一些笔记,方便以后学习查找。&首先说一下什么是中断吧,中断是指CPU在执行当前程序的过程中,由于某种随机出现的外设(外部设备)请求或CPU内部的异常事件,使CPU暂停正在执行的程序而转去执行相应的服务处理程序;当服务处理程序运行完毕之后,CPU再返回到暂停处继续执行原来的程序。那什么是中断嵌套呢?简单点说就是低优先级的中断可以被高优先级的中断源所中断,等高优先级中断服务程序结束后,再返回去执行被中断的的低优先级的中断服务程序。举个简单的栗子吧(之前写过但不知道怎么删了,,又让我重新编辑):比如我们就是一个CPU,我们当前在洗衣服(当前程序),突然电话铃声响了(中断来了
热门资源推荐
最新单片机文章
最新视频课程
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。
相关热搜器件51单片机发串口数据总是不正确,为何?求助-CSDN论坛
单片机/工控
51单片机发串口数据总是不正确,为何?求助
小弟是单片机新手,最近做一个工程,要在初始化的同时把一串数据发给上位机,但是我程序写出来后,用串口调试助手接受串口数据,得到的数据和我发送的数据始终不一样,而且也看不出什么规律
我用的单片机是AT89C51,晶振11.0592MHz,初始化程序如下:
void&init()
EA=1;//中断模式开
TMOD=0x20;//设置定时器1为工作方式2
& TH1=0//波特率是9600
& SCON=0x40;
PCON&=0x7F;
SBUF=0x2F;
while(TI==0);
SBUF=0x5F;
while(TI==0);
SBUF=0x5A;
while(TI==0);
SBUF=0x52;
while(TI==0);
SBUF=0x0D;
while(TI==0);
delay(5000);
但是用串口调试助手接收的数据却是:68&50&A9&AB&1E,不管发送多少次都是这组一样的数据
请各位高手指教一下,多谢了
SCON=0x40;
确认这个的值
0x40是不允许接受数据,我之前用过0x50,也是一样的状况
查看寄存器设置
查看波特率设置
检查硬件连接
发送的每个数字间加个1ms延时试试
以我的经验,首先改改波特率
我把楼主的程序在我的STC89C54上跑了下&一切正常&
这说明程序是对的,我觉得可能是波特率的问题&&1)你检查下自己的晶振是否确实是11.0592M&
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&2)确认下你的串口助手波特率也是9600
要是还不行&那我就不得而知了
串口通信主要是波特率,好好查查吧。
问题解决了,是max232焊接的问题……多谢大家指点了
恭喜恭喜~&
回复串口通讯-单片机向电脑发送数据_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&100W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
串口通讯-单片机向电脑发送数据
阅读已结束,下载本文需要
定制HR最喜欢的简历
你可能喜欢串口通信-数据发送到PC加1后接收到单片机在数码管上显示
13:10:46编辑:什么鱼 关键字:&&&&&&
本程序的完整原理图下载:&http://www.51hei.com/f/ks51.pdf&
*功能:-PC加一后接收到在上显示
*时间:日10:04:07
*作者:寒竹子
*备注:波特率:19200bps
*总结:串口通信时需要发送和接收数据时可以用到串口中断,在中断中进行数据的发送和接收,
*&&& 数码管显示时必须要放在while (1)中,只有这样才可以正常显示数字!
//数码管段选和位选声明
sbit WELA = P2^7;
sbit DULA = P2^6;
//数码管编码
uchar code table[] = {
0x3F,& //"0"
&&&&&&&&&&&&&&& 0x06,& //"1"
&&&&&&&&&&&&&&& 0x5B,& //"2"
&&&&&&&&&&&&&&& 0x4F,& //"3"
&&&&&&&&&&&&&&& 0x66,& //"4"
&&&&&&&&&&&&&&& 0x6D,& //"5"
&&&&&&&&&&&&&&& 0x7D,& //"6"
&&&&&&&&&&&&&&& 0x07,& //"7"
&&&&&&&&&&&&&&& 0x7F,& //"8"
&&&&&&&&&&&&&&& 0x6F&& //"9"
uint num = 254;
void UART_init();
void UART_init();
void display(uint num);
int main(void)
UART_init();
P0 = 0xFF;
DULA& = 1;
P0 =& 0x00;
while (1)//等待串口发送和接收数据中断
//在数码管上显示
display(num);//数码管显示是动态显示的,所以必须要放在while (1)循环中,这样才可以动态显示!
//串口通信初始化(定时器T1初始化和串口通信方式的选择)
void UART_init()
//设定T1定时器工作方式2,八位自动重装,用于设定串口通信波特率
TMOD = 0x20;//T1: GATE C/!T 0 0 M1 M0:10 T0:0000
//设定波特率19200bps 初值 X = 2^8 -
/ 19200 / 12 /32; X = 254.5 0xFE
TH1 = TL1 = 0xFE;
TR1 = 1;//打开定时器T1
SCON = 0x50;//设定串口通信方式1,八位异步传输波特率可设定
SM1 = 1;//方式1
REN = 1;//允许接收
//因为要进行发送和接收,需要用到串口中断
EA = 1;//开总中断
ES = 1;//开定时器T1中断
void delayms(uint xms)
for (i = 0; i < i++)
for (j = 0; j < 110; j++);
//数码管显示
void display(uint num)
//将num分解
uchar bai, shi,
bai = num / 100 % 10;
shi = num / 10 % 10;
ge& = num % 10;
//先段选后位选
DULA = 1;//打开段选锁存器
P0 = table[ge];//送入个位
DULA = 0;//关闭段选锁存器
P0 = 0xFF;//先关闭所有数码管的显示,避免乱码
WELA = 1;//打开位选锁存器
P0 = 0xDF;//
WELA = 0;//关闭位选锁存器
//延时3毫秒
delayms(3);
P0 = 0x00;//消影
DULA& = 1;
P0 = table[shi];
P0 = 0xFF;
P0 = 0xEF; //
delayms(3);
P0 = 0x00;
P0 = table[bai];
P0 = 0xFF;//关闭所有数码管,避免段选数据的影响
P0 = 0xF7; //
delayms(3);
P0 = 0x00;//消影
//串口通信中断
void UART_sendAndReceive_int() interrupt 4//串口中断号4
//判断发送和接收的完成
if (TI)//硬件置位,发送数据完成
TI = 0;//TI清零,等待发送下一位数据
//允许接收数据
if (RI)//接收完成
RI = 0;//RI清零,等待接收下一位数据
//取出SBUF中的数据
num = SBUF;
//禁止接收数据
SBUF =//发送num
关键字:&&&&&&
来源: 51hei
引用地址:
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。
关注eeworld公众号快捷获取更多信息
关注eeworld服务号享受更多官方福利
今天学习单片机串口通信,编写了单片机与PC机的通信程序,即PC机向单片机发送信息,单片机再把信息返回给PC机,并显示出来。在调试的时候总是没有结果,检查了半天,发现错误,而且很容易被忽略的错误。用串口通信计算器在确定波特率的时候,一定要注意误差,如果过大的话(我第一次设定波特率9600,误差是6%多),通信也是有问题的,一定要把误差尽量缩小,1%以内。第二次设定波特率2400,误差1%以内。下面是代码:/************************** 串口通信*************************/&#include&reg52.h&typedef unsigned int u16
一.串口通信基础1.串行通信串行通信将数据字节分成一位一位的形式在一条传输线上逐个传送。单片机采用串行通信。特点是:传输线少,长距离传送成本低,但数据传送控制复杂。串行通信的传输的传输方向:单工(数据传输只能沿一个方向),半双工(传输数据和接受数据分布进行),全双工(传输和接受同步进行)。单片机采用异步通信,发送和接受设备使用各自的时钟频率,容易实现,但传输效率不高,数据格式&2.MAX232实验通过MAX232电平转换芯片,可把计算机串口电平(-12V~+12V)转换为单片及TTL电平。电路原理图如下&3.80C51串行口向发送缓冲器SBUF写入数据,两个物理上独立的接收、发送缓冲器SBUF,它们占用同一
学串口通信的应用主要是实现单片机和电脑之间的信息互发,可以用电脑控制单片机的一些信息,可以把单片机的一些信息状况发给电脑上的软件。下面就做一个简单的例程,实现单片机串口调试助手发送的数据,在开发板上的数码管上显示出来。#include &reg52.h&sbit ADDR3 = P1^3; & & &//LED选择地址线3sbit ENLED = P1^4; & & &//LED总使能引脚unsigned char code LedChar[] = { &//数码管显示字符转换表& & 0xC0, 0xF9, 0xA4, 0xB0
=0; & &//手动清零 & }}串口通信效果如下:但是我的这个程序有点小问题,我自己想了很多种办法来试着解决,但是都以失败告终。当我输入的数据大于2个字节时,它只能返回前两个字节的数据。如下图:
,SM0:SM0SM1工作方式功能波特率00方式08位同步移位寄存器晶振频率 / 1201方式110位UART可变10方式211位UART晶振频率/32或晶振频率/6411方式311位UART可变SM2:----多机通信控制位(可以先不理)多机通信是工作在方式2和方式3的,所以SM2主要用于方式2和方式3,多级通信时,SM2=1,当SM2=1时,只有当接收到的数据帧第9位(RB8)为1时,单片机才把前八位数据放入自己的SBUF中,否则,将丢弃数据帧。当SM2=0时,不论RB8的值是什么,都会把串口收到的数据放到SBUF中。REN:-----允许接收位REN用于控制是否允许接收数据,REN=1时,允许接收数据,REN=0时,拒绝接收
我们要实现的功能是在程序运行的时候通过单片机的串口向串口调试助手发送一个字符串诸如“hello world”,串口通信助手接收到字符串之后显示并由用户反馈回去一个长度为4的字符串并显示到数码管上来看一下效果首先是串口通信电路的配置和借助VSPD、串口通信助手对相关串口的设置通过VSPD创建两个可以相互通信的虚拟串口,如COM1和COM2。点击添加端口按钮后,可以看到左边栏中的虚拟端口处看到你新创建的两个虚拟端口。打开串口调试助手V2.2,对其进行配置,将串口改为COM2端口,波特率设为9600,校验位选择NONE,数据位为8位,停止位为1位电路图中的配置:首先将晶振改为11.0592MHZ,再将AT89C52芯片中的晶振也改为
热门资源推荐
最新单片机文章
最新视频课程
何立民专栏
北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。
相关热搜器件51单片机发串口数据总是不正确,为何?求助
[问题点数:40分,结帖人snow830917]
本版专家分:0
结帖率 66.67%
CSDN今日推荐
本版专家分:37608
2013年6月 硬件/嵌入开发大版内专家分月排行榜第一2007年10月 硬件/嵌入开发大版内专家分月排行榜第一2007年6月 硬件/嵌入开发大版内专家分月排行榜第一2007年5月 硬件/嵌入开发大版内专家分月排行榜第一2007年4月 硬件/嵌入开发大版内专家分月排行榜第一2007年3月 硬件/嵌入开发大版内专家分月排行榜第一
2013年4月 硬件/嵌入开发大版内专家分月排行榜第二2007年9月 硬件/嵌入开发大版内专家分月排行榜第二
2013年5月 硬件/嵌入开发大版内专家分月排行榜第三2012年9月 硬件/嵌入开发大版内专家分月排行榜第三2007年11月 硬件/嵌入开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:2773
本版专家分:1143
本版专家分:31
本版专家分:274
本版专家分:156
本版专家分:0
本版专家分:274
本版专家分:1143
匿名用户不能发表回复!
其他相关推荐}

我要回帖

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

更多推荐

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

点击添加站长微信