打印
[51单片机]

51串口问题 求指点

[复制链接]
1457|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mou_jc|  楼主 | 2014-5-2 14:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题 我用89C52控制驱动继电器,下面是源码
问题,无法控制K0 与K7这两个继电器,其它都可以 而且在发生K0继电器的命令时会导致单片机死机。
另我单独控制单个继电器就可以控制  现在不知到那出了问题很是费解 求大家帮忙看看 小弟初学不懂忘大家指点一下感谢


#include<reg51.h>
#define uint unsigned int
unsigned char receiveData,dat;
void UsartConfiguration();
void Delay(uint z);   //延时10ms
sbit K0=P1^0;
sbit K1=P1^1;
sbit K2=P1^2;
sbit K3=P1^3;
sbit K4=P1^4;
sbit K5=P1^5;
sbit K6=P1^6;
sbit K7=P1^7;

void main()
{
        UsartConfiguration();
        while(1)
        {
                if(dat==1)
                {
                        ES=0;
                                switch(receiveData)
{
        Delay(10);
case 'S':K0=1;break;
        Delay(10);
case 'B':K0=0;break;
        Delay(10);
case 'C':K1=1;break;
        Delay(10);
case 'D':K1=0;break;
        Delay(10);
case 'E':K2=1;break;
        Delay(10);
case 'F':K2=0;break;
        Delay(10);
case 'J':K3=1;break;
        Delay(10);
case 'H':K3=0;break;
        Delay(10);
case 'I':K4=1;break;
        Delay(10);
case 'Z':K4=0;break;
        Delay(10);
case 'K':K5=1;break;
Delay(10);
case 'M':K5=0;break;
Delay(10);
case 'N':K7=1;break;
Delay(10);
case 'V':K7=0;break;
Delay(10);
case 'P':K6=1;break;
Delay(10);
case 'O':K6=0;break;
Delay(10);
default:break;       
}


                        SBUF=receiveData;
                        while(!TI);                       
                TI=0;       
                        dat=0;
                        ES=1;
        }
}
}

void UsartConfiguration()
{
        SCON=0X50;                        //设置为工作方式1
        TMOD=0X20;                        //设置计数器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //计数器初始值设置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                        //打开计数器
}


void Usart() interrupt 4
{
       

        receiveData=SBUF;//出去接收到的数据
        RI = 0;//清除接收中断标志?
       

/*        if(receiveData=='S')
        {
K1=0;
}
else
{
K1=1;
}*/
        //SBUF=receiveData;//将接收到的数据放入到发送寄存器
        dat=1;
                                                 //清除发送完成标志位
}
void Delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);       
}

相关帖子

沙发
wangch_sh| | 2014-5-2 19:11 | 只看该作者
break后面加延时干吗?

使用特权

评论回复
板凳
mou_jc|  楼主 | 2014-5-2 20:09 | 只看该作者
wangch_sh 发表于 2014-5-2 19:11
break后面加延时干吗?

加不加延时效果都一样   

使用特权

评论回复
地板
ningling_21| | 2014-5-2 20:29 | 只看该作者
程序有流程图吗?

使用特权

评论回复
5
mou_jc|  楼主 | 2014-5-2 21:35 | 只看该作者
ningling_21 发表于 2014-5-2 20:29
程序有流程图吗?

:L:L这还没有。。:L有关系么

使用特权

评论回复
6
-|continue;|-| | 2014-5-2 21:54 | 只看该作者
建议查下硬件先

使用特权

评论回复
7
mou_jc|  楼主 | 2014-5-2 22:01 | 只看该作者
-|continue;|- 发表于 2014-5-2 21:54
建议查下硬件先

硬件以检查没有问题呀:L

使用特权

评论回复
8
huangxz| | 2014-5-2 23:12 | 只看该作者
mou_jc 发表于 2014-5-2 22:01
硬件以检查没有问题呀

建议把第一个delay(10)放在switch前面,

下面所以的 delay(10)全部去除掉。

没有硬件没法调试,软件仿真一切正常,楼主不妨先改下程序试试。

使用特权

评论回复
9
mou_jc|  楼主 | 2014-5-3 19:43 | 只看该作者
huangxz 发表于 2014-5-2 23:12
建议把第一个delay(10)放在switch前面,

下面所以的 delay(10)全部去除掉。

程序以更改效果还是一样:L求指导呀

使用特权

评论回复
10
睡神耗子| | 2014-5-6 11:07 | 只看该作者
本帖最后由 睡神耗子 于 2014-5-6 11:10 编辑

你的while
循环绝大部分时间在禁止串口中断中。

建议在while大循环  
禁止串口中断的外面加上延时
例如
在if(dat == 1)
前面加入Delay(100);

PS 把其他的Delay去掉

使用特权

评论回复
11
xuyaqi| | 2014-5-6 20:40 | 只看该作者
是继电器产生干扰,继电器线圈不要和单片机用一个电源。继电器带负载了吗

使用特权

评论回复
12
handcosmos| | 2014-5-6 22:46 | 只看该作者
同意11#

使用特权

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

本版积分规则

4

主题

20

帖子

1

粉丝