找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6137|回复: 10
收起左侧

请师傅们看看郭天祥的这个串口程序有没有问题?

[复制链接]
ID:204280 发表于 2017-6-2 22:21 来自手机 | 显示全部楼层 |阅读模式
发什么数字蜂鸣器都是以同样的频率响,问题出在哪里?请高手指点
#include<reg52.h>
unsigned char flag,a,num,benum;
sbit beep=P2^3;
void main()
{

        TMOD=0x21;//设置定时器1为工作方式2
        TH1=0xfd;
        TL1=0xfd;
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        EA=0;
                        flag=0;
                        TR0=1;
                        if(a==1)
                                benum=4;
                        if(a==2)
                                benum=2;
                        if(a==3)
                                benum=1;
                        if(a==4)
                        {
                                TR0=0;
                                beep=1;       
                        }
                        EA=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

void time0() interrupt 1
{
        TH0=(65536-50000)/255;
        TL0=(65536-50000)%255;
        num++;
        if(num>=benum)
        {
                num=0;
                beep=~beep;
        }       
}
回复

使用道具 举报

ID:204280 发表于 2017-6-3 08:28 来自手机 | 显示全部楼层
高手帮忙啊
回复

使用道具 举报

ID:164602 发表于 2017-6-3 10:28 | 显示全部楼层

经过仔细研究,程序是没有问题的。
但为什么不对?主要在串口出了问题。
第一:我的板子晶振12M,串口通讯必须,就是必须,波特率小于等于4800,必须,就是必须加倍。这样串口通讯误差才小,不然,根本认不到你输入的数据。
第二:你的程序定时器值的计算,也有一点点问题,我已经改过来了,虽然在这个程序中不影响效果,换个地方就不行了。
第三:你的定时器定时太长了,蜂鸣器根本就不是响,而是在“敲”
我修改的程序如下:
#include<reg52.h>
unsigned char flag,a,num,benum;
sbit beep=P1^5;//这是我的蜂鸣器口,你改回你的口
void main()
{

        TMOD=0x21;//设置定时器1为工作方式2
        PCON=0x80;//波特率加倍
                TH1=0xf3;//波特率4800
        TL1=0xf3;
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;//红色是我做的修改
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
                if(flag==1)
                {
                        EA=0;
                        flag=0;
                        TR0=1;
                        if(a==1)
                                benum=4;
                        if(a==2)
                                benum=2;
                        if(a==3)
                                benum=1;
                        if(a==4)
                        {
                                TR0=0;
                                beep=1;        
                        }
                        EA=1;
                }
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag=1;
}

void time0() interrupt 1
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        num++;
        if(num>=benum)
        {
                num=0;
                beep=~beep;
        }        
}


特别注意:你在试验时,串口通讯的软件要选择好,我用的STC下载软件的串口通讯功能页,发送HEX数据模式,4800波特率。就可以成功了
你说的只有一种声音,关键是串口根本没有认到你输出的数据,所以没有反应。
回复

使用道具 举报

ID:164602 发表于 2017-6-3 11:09 | 显示全部楼层
刚才重点想程序去了,没有把波特率为什么那么设置说清楚,补充一下。
在本站的下载的波特率计算器,计算就可以知道:
第一:对于51单片机的晶振为11.0592MHz时,任何波特率都可以,误差都为零。高波特率时,加倍反而误差大。
第二:对于晶振为12MHz的,波特率一大,误差就很大,即,你发送的数据,当51单片机接收到时,已经变成另一个数据了,所以就不能完成相应的控制。你原来的程序就是这样(我猜,你的晶振也是12M的),而原来的波特率为9600,看看我截取的图片,就可以知道误差多大。所以,必须小于等于4800,这是我试验出来的最大波特率、且误差最小。
第三:原程序为什么只有一个声音?就是因为串口输送的数据,单片机接收到的是错的,所以只以初始化的数据在发声音,我试验过,输送任何数据都是一个声音,关不了(原程序输送4是关声音)。改为4800且加倍的波特率后,就好了。
可能当时郭天祥老师在做这个例子时,是讲过这个内容的,只不过我们没有看到罢了。
1.jpg
2.jpg
3.jpg
4.jpg
5.jpg
6.jpg
回复

使用道具 举报

ID:47286 发表于 2017-6-3 14:02 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-6-3 11:09
刚才重点想程序去了,没有把波特率为什么那么设置说清楚,补充一下。
在本站的下载的波特率计算器,计算就 ...

前辈这活干的是真仔细啊
回复

使用道具 举报

ID:47286 发表于 2017-6-3 14:04 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-6-3 10:28
经过仔细研究,程序是没有问题的。
但为什么不对?主要在串口出了问题。
第一:我的板子晶振12M,串口 ...

我觉得他那程序没问题 255也好 256也好 对于这种程序只是误差大小 声音长短总是会变 即便不准也不会一样 他都一个声 应该是串口通信波特率的问题 单片机没收到正确指令 没执行对应的动作
回复

使用道具 举报

ID:207378 发表于 2017-6-3 14:22 | 显示全部楼层
应该没有问题呀
回复

使用道具 举报

ID:204280 发表于 2017-6-3 16:05 来自手机 | 显示全部楼层
HC6800-ES-V2.0 发表于 2017-6-3 11:09
刚才重点想程序去了,没有把波特率为什么那么设置说清楚,补充一下。
在本站的下载的波特率计算器,计算就 ...

非常感谢您的指点!谢谢!
回复

使用道具 举报

ID:143694 发表于 2017-10-26 23:21 来自手机 | 显示全部楼层
这么认真的解答,顶起!!!
回复

使用道具 举报

ID:213173 发表于 2017-10-27 08:59 | 显示全部楼层
楼主和楼上的坛友都有所误读此程序:
1.这个程序是针对天祥实验板写的,波特率9600,板上晶振11.0592MHz。
2..这个程序除了二楼指出的瑕疵外没有其它毛病,原作者本意写的是50ms定时器, TH0=(65536-50000)/256;
TL0=(65536-50000)%256; 所以二楼把50000改成1000是不对的。对二楼钻研精神表示赞赏。
3.天祥实验板上使用的是有源蜂鸣器,所以鸣响频率是固定的,此程序只是演示通过串口控制蜂鸣器按不同节拍间歇鸣响和停止,不是要改变鸣响频率。
4.此程序经实测满足设计意图。
回复

使用道具 举报

ID:1070602 发表于 2023-5-17 22:43 来自手机 | 显示全部楼层
如果单片机通过蓝牙模块传输数据,数据大了30左右是哪里出问题了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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