找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3158|回复: 4
收起左侧

请教一下52单片机串口通信有关的问题

[复制链接]
ID:170427 发表于 2017-10-25 19:14 | 显示全部楼层 |阅读模式
本帖为密码帖 ,请输入密码 
回复

使用道具 举报

ID:164602 发表于 2017-10-26 08:38 | 显示全部楼层
串口通讯有几点注意事项:
1、外部晶振的频率,它直接涉及你的波特率的误差大小。如果是12M的话,则误差小的最大波特率为4800,且要加倍,即PCON=0x80;如果是11.0592M的话,则可以稍大一点,也要加倍,如9600。这个你高好了吗?
2、52单片机是8位机,所以SBUF一次只能接收或发送一个字符,而你准备用字符串作为判断依据,这就是一个难题了。首先你要设置接收字符串的数组,然后要有字符串接收完成的标志符。程序思路就是:接收到一个字符,判断它是不是结束标志符,不是,则继续等待接收,是,先判断字符串位数是不是你的命令字符串的位数,不是,则抛弃此接收的字符串,是,就去逐位判断,是不是与你的命令字符串中相应位的字符相同,有一位不同,则命令无效;
最终才得到你发的命令,才执行相关操作。
3、要进行串口通讯试验,PC机的上位程序也要选好,原来我用买开发板时送的小程序,后来发现它们或多或少都有毛病,最后用的芯片厂家提供的下载程序中的串口通讯试验功能,效果才好了。
4、建议:如果你是初学者,由简单的开始做起吧,一是积累经验,二是容易上手。建议你先调通串口通讯,可以看到通讯成功了(发送,接收字符成功),再用单字符命令,实现串口控制操作,最后来这个高难度的字符串控制。

不知道你的硬件是怎么样的,就不提供程序了,单片机程序都是和硬件密切相关的。如果只是串口通讯的程序,我想你应该是有的。
回复

使用道具 举报

ID:170427 发表于 2017-10-26 09:07 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-10-26 08:38
串口通讯有几点注意事项:
1、外部晶振的频率,它直接涉及你的波特率的误差大小。如果是12M的话,则误差小 ...

感谢!
回复

使用道具 举报

ID:123289 发表于 2017-10-26 10:09 | 显示全部楼层
简单:串口接收是一个字节一个字节进行的,需要你收到后进行拼装,当你拼装成“liang”时就可以下令了。拼有误就放弃。如:
第一个不是"l",就放弃,再从头开始。
第二个不是"i",就放弃,再从头开始。
第三
第四
第五个不是"g",就放弃,再从头开始。
回复

使用道具 举报

ID:164602 发表于 2017-10-27 12:49 | 显示全部楼层
SunshineLLL 发表于 2017-10-26 22:49
实在不好意思 如果闲暇希望能看一下
最近有个项目 通过上位机发送 -open- 点亮LED
困惑在 接收字符串 ...

这个程序我研究了好久。与我平时编程的思路不一样,但也是说得通的。
那为什么不能进行控制呢?
我调试了好久,经过修改后,现在这个程序是可以进行控制的了,但还是有问题:
第一:我做的试验,总是在第一次(只在第一次)会多发送一个空字符。我也不知道为什么,反复调式没有成功消除它。
第二:正是由于第一次多了一个空字符占位,所以后来的判断比较,不再是开始的“-open-”,变成了“--open”。

程序在我自己的开发板调试的,可能与你的硬件不同,I/O口自己改一下。
另外:你确定你的晶振是11.0592?需要19200那么高的波特率吗?这个不匹配也是不行的。我的板子是12M,所以只能4800,再加倍。
调试串口通讯,软件用的STC-ISP中的串口调试功能。
1.jpg
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char

uchar i,j;
sbit led1=P2^0;

uchar sz[6]="";
void init()
{
        TMOD=0x20;
//        TH1=0xfd;//晶振11.0592MHz,19200波特率
//        TL1=0xfd;
                TH1=0xf3;//晶振12MHz,4800波特率
                TL1=0xf3;
                PCON=0X80;//波特率加倍
        REN=1;
        SM0=0;
        SM1=1;
        EA=1;
        ES=1;
        TR1=1;
}
void main()
{

        init();
                j=0;
        while(1); //循环

}
void CK() interrupt 4
{
        RI=0;
        sz[j]=SBUF;
        j++;
        if(j==6)
        {
                j=0;
                if(sz[0]=='-') {
                        if(sz[1]=='-') {
                                if(sz[2]=='o'){
                                        if(sz[3]=='p'){
                                                if(sz[4]=='e'){
                                                        if(sz[5]=='n'){
                                                                                                                        led1=~led1;
                                                }
                                        }
                                }
                        }
                }
                        }
        }  
}



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表