打印
[51单片机]

关于51单片机串口通信的问题,请各位大神指教

[复制链接]
1513|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#THANKYOUKOBE|  楼主 | 2017-2-7 16:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 #THANKYOUKOBE 于 2017-2-7 17:06 编辑

题目:由上位机发送1给单片机时,蜂鸣器以400ms频率发声,发2时以200ms频率发声,发3时以100ms频率发声,发4时关闲蜂鸣器。

程序:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit d1=P2^3;
uchar a,flag,om,temp;
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void init()
{
        TMOD=0x21;
        TH1=0xfd;
        TL1=0xfd;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        ET0=1;
        TR1=1;
}

/*delay(uchar xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}*/
void main()
{
        init();
        while(1)
        {
        if(flag==1)
        {
                flag=0;
                ES=0;
                om=a;
                SBUF=a;
                while(!TI);
                TI=0;
                ES=1;
                TR0=1;
        }
        switch (om)
        {
                case 1:
                        if(temp==8)
                        {
                                temp=0;
                                d1=~d1;
                        }
                        break;
                case 2:
                        if(temp==4)
                        {
                                temp=0;
                                d1=~d1;
                        }
                        break;
                case 3:
                        if(temp==2)
                        {
                                temp=0;
                                d1=~d1;
                        }
                        break;
                case 4:
                        d1=1;
                        break;
        }
        }
}

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

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        temp++;
}

数据能正常发送给单片机,并且能将发送的数据正常返回给上位机,但蜂鸣器不响,想不通是什么问题  求大神指教!!

相关帖子

沙发
NE5532| | 2017-2-7 16:54 | 只看该作者
你先别整那么复杂,先调试收到数据开始叫,再收到数据停,然后再调什么几百mS的问题。

使用特权

评论回复
板凳
#THANKYOUKOBE|  楼主 | 2017-2-7 17:28 | 只看该作者
NE5532 发表于 2017-2-7 16:54
你先别整那么复杂,先调试收到数据开始叫,再收到数据停,然后再调什么几百mS的问题。 ...

void main()
{
        init();
        while(1)
        {
        if(flag==1)
        {
                flag=0;
                ES=0;
                om=a;
                SBUF=a;
                while(!TI);
                TI=0;
                ES=1;
                TR0=1;
                switch(om)
                        {
                                case 1:
                                        aa=8;
                                        break;
                                case 2:
                                        aa=4;
                                        break;
                                case 3:
                                        aa=2;
                                        break;
                                case 4:
                                        TR0=0;
                                        d1=1;
                                        break;
                        }
        }
        }

}

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

void timer0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        temp++;
                if(temp==aa)
                {       
                        temp=0;
                        d1=~d1;
                }               
}

但我把主程序和中断程序改成这样就没有问题了,麻烦问一下我刚开始的做法哪里错了

使用特权

评论回复
地板
ningling_21| | 2017-2-7 18:57 | 只看该作者
#THANKYOUKOBE 发表于 2017-2-7 17:28
void main()
{
        init();

应该都可以吧

使用特权

评论回复
5
#THANKYOUKOBE|  楼主 | 2017-2-7 19:00 | 只看该作者

第一个运行的时候能收到数据  但是蜂鸣器不响

使用特权

评论回复
6
qinglongshushen| | 2017-2-7 19:45 | 只看该作者
问题出在你的循环函数里,你的第一个程序你把temp置零,判断中断及上位机发过来的信息全部被置零,而后一个程序你置temp时,aa没有置零

使用特权

评论回复
7
#THANKYOUKOBE|  楼主 | 2017-2-7 20:44 | 只看该作者
qinglongshushen 发表于 2017-2-7 19:45
问题出在你的循环函数里,你的第一个程序你把temp置零,判断中断及上位机发过来的信息全部被置零,而后一个 ...

第一个程序temp置零是为了让蜂鸣器以一定的频率响,跟上位机发送过来的信息没有啥关系吧........

使用特权

评论回复
8
NE5532| | 2017-2-8 08:55 | 只看该作者
#THANKYOUKOBE 发表于 2017-2-7 17:28
void main()
{
        init();

我只能告诉你方法,错,你自己找。

使用特权

评论回复
9
icecut| | 2017-2-8 10:21 | 只看该作者
NE5532 发表于 2017-2-8 08:55
我只能告诉你方法,错,你自己找。

潜规则不是代码不看么?
还没有注释...

使用特权

评论回复
评论
NE5532 2017-2-8 10:28 回复TA
自己都不愿意写注释的代码,人家也不愿意看滴。 
10
icecut| | 2017-2-8 10:29 | 只看该作者
1.temp 初值是多少?为什么是这个数?
2temp 为啥不是 volatile?

第二个程序就算能用.也是玩具级.建议初学者先学读代码,然后写代码.步子大了肯定扯了蛋.
这种积累只会写玩具级程序.连初值都没有就用++之类,嵌入式编译器是不会报错的.但高版本 vc 是肯定报错

使用特权

评论回复
11
xuyaqi| | 2017-2-8 10:36 | 只看该作者
你用的是什么蜂鸣器,电路是怎么接的。

使用特权

评论回复
12
w522930954| | 2017-2-8 11:08 | 只看该作者
temp初值要给,而且要定义成volatile;不过现在很多嵌入式的编译器都带初始化的,比如iar就自带全局变量初始化,一般为0,除非定义为_NO_INIT_,这个要看编译器属性;
楼主的问题 应该出在判断的地方,
第一个程序:如果om=1,判断为if(temp==8);此时如过中断速度过快,temp=8时,循环来不及判断,或者没有运行到判断这个地方的时候又进入了中断进行++,这个时候temp=9判断就会不通过,除非把判断改成if(temp>=8),不过可能造成频率跟你设想的不一致,所以这是不可靠的判断;而第二个程序不会出现这个问题;
中断与主循环内存共享的时候需要注意的地方很多,最好不要这样用,或者增加内存共享判断,或者内存块权限来做;

使用特权

评论回复
13
ayb_ice| | 2017-2-8 11:11 | 只看该作者
temp的处理有问题,中断与主程序不同步造成的

使用特权

评论回复
14
icecut| | 2017-2-8 12:54 | 只看该作者
w522930954 发表于 2017-2-8 11:08
temp初值要给,而且要定义成volatile;不过现在很多嵌入式的编译器都带初始化的,比如iar就自带全局变量初 ...

你说的方法就稳定好多了.让 lz 好好理解自己写的为啥是玩具级

使用特权

评论回复
15
#THANKYOUKOBE|  楼主 | 2017-2-8 13:18 | 只看该作者
NE5532 发表于 2017-2-8 08:55
我只能告诉你方法,错,你自己找。

好的,谢谢您的指教

使用特权

评论回复
16
#THANKYOUKOBE|  楼主 | 2017-2-8 13:19 | 只看该作者
icecut 发表于 2017-2-8 10:21
潜规则不是代码不看么?
还没有注释...

实在不好意思,我起码应该加个注释的...  新人不懂规矩望见谅

使用特权

评论回复
17
#THANKYOUKOBE|  楼主 | 2017-2-8 13:20 | 只看该作者
本帖最后由 #THANKYOUKOBE 于 2017-2-8 13:23 编辑
icecut 发表于 2017-2-8 10:29
1.temp 初值是多少?为什么是这个数?
2temp 为啥不是 volatile?



我是看郭天祥的教程自学的51单片机,感觉比较有兴趣但没有方向 层主能不能给指条路,感激不尽!

使用特权

评论回复
18
#THANKYOUKOBE|  楼主 | 2017-2-8 13:21 | 只看该作者
w522930954 发表于 2017-2-8 11:08
temp初值要给,而且要定义成volatile;不过现在很多嵌入式的编译器都带初始化的,比如iar就自带全局变量初 ...

非常感谢!  我大概明白是什么原因了

使用特权

评论回复
19
#THANKYOUKOBE|  楼主 | 2017-2-8 13:22 | 只看该作者
ayb_ice 发表于 2017-2-8 11:11
temp的处理有问题,中断与主程序不同步造成的

谢谢您! 我明白了!

使用特权

评论回复
20
#THANKYOUKOBE|  楼主 | 2017-2-8 13:22 | 只看该作者
xuyaqi 发表于 2017-2-8 10:36
你用的是什么蜂鸣器,电路是怎么接的。

我用的是郭天祥的板子...

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

10

帖子

0

粉丝