打印
[STC单片机]

Keil模拟时,无法接收SBUF值以及无**确判断

[复制链接]
2601|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
am540|  楼主 | 2015-5-7 09:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
观测中SBUF接收正确,SBUF==0x01也正确,但就是IF判断时进不去,这是为什么?

还有一个类似问题就是在串口中断中:unsigned char i; i=SBUF; 经观测发现SBUF有值,但是i始终是0x00,接收不到SBUF传来的值,这是为什么?

跪求大神帮忙解答我的疑惑

相关帖子

沙发
am540|  楼主 | 2015-5-7 09:44 | 只看该作者

补个图

使用特权

评论回复
板凳
中国微电脑网| | 2015-5-7 10:25 | 只看该作者
串口的各个寄存器标志位设置好了没有?
先下一个例程测试,再按照自己的要求局部修改。

使用特权

评论回复
地板
中国微电脑网| | 2015-5-7 10:29 | 只看该作者
STC不是有官方例程的吗?照着做就行了!

使用特权

评论回复
5
am540|  楼主 | 2015-5-7 11:13 | 只看该作者
中国微电脑网 发表于 2015-5-7 10:29
STC不是有官方例程的吗?照着做就行了!

我把代码贴出来了,麻烦帮我看一下问题出现在哪里?是代码问题还是Keil设置问题? 感谢大神
#include<reg51.h>
#include <stdlib.h>

//--定义全局函数--//
#define arrSize 10  
unsigned char ChCode[14] = "Received data:";
unsigned char err[20] = "Error! Out of Bound";
unsigned char End[3] = "End";
unsigned char arr[arrSize];
unsigned char cmd[2];
unsigned char begin标志寄存器=1;

//开始状态
bit beginStat=0;
//结束状态
bit endStat=0;
//红外收发状态
unsigned char irStat;
//数组个数
unsigned char arrCnt=0;
//数组总数
unsigned char arrNum=0;

//--声明全局函数--//          
void UsartConfiguration();
void T0Configuration();
void Delay10ms(unsigned int c);   //误差 0us
/*******************************************************************************
* 函 数 名         : main
* 函数功能                   : 主函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/

void main()
{
        //unsigned char j;//,getData;
        beginStat=0;
        endStat=0;
        irStat=0;
        arrCnt=0;
        arrNum=0;
        UsartConfiguration();
        while(1)
        {
                if(endStat)
                {
                        switch(irStat)
                        {
                                case 0:break;
                                case 1:break;
                                case 2:break;

                        }
                        endStat=0;
                }
        }  
}
/*******************************************************************************
* 函 数 名         :UsartConfiguration()
* 函数功能                   :设置串口
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void UsartConfiguration()
{
        PCON=0X80;                        //波特率加倍
        SCON=0X50;                        //设置为工作方式1
        //SM0=1                REN=1       
        TMOD=0X20;                        //设置计数器工作方式2                
        TH1=0XF3;                    //计数器初始值设置,注意波特率是4800的  由于波特率加倍所以9600
        TL1=0XF3;
        ES=1;                                                //打开接收中断
        EA=1;                                                //打开总中断
        TR1=1;                                            //打开计数器
}

/*******************************************************************************
* 函 数 名         :T0Configuration()
* 函数功能                   :设置T0
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void T0Configuration()
{
        TMOD = 0x01;        //选择模式2  16位定时 最大计数65535
        TH0 = (65535 - 2000)/256;
        TL0 = (65535 - 2000)%256;
        EA = 1;                   //全局中断       
        ET0 = 1;                //开启T0定时器       
        TR0 = 1;            //启动T0定时器

}
/*************************************
        定时器0的中断号
*************************************/
void T0zd(void) interrupt 1      
{
        endStat=1;
        ET0 = 0;
}
/*******************************************************************************
* 函 数 名         :Delay(unsigned int i)
* 函数功能                   : 延时函数
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/
void Usart() interrupt 4
{
        RI = 0;                          //清除接收中断标志位
        ES=0;
        if(!beginStat)
        {
                beginStat=1;
                arrCnt=0;
                if(SBUF==0x01) //发射红外
                {       
                        irStat=1;
                        //arr[arrCnt++]=SBUF;
                       
                }
                else if(SBUF==0x10)         //录制红外
                {
                        irStat=2;
                }
                else
                {
                        irStat=0;
                        endStat=1;
                }
                T0Configuration();
        }
        else
        {
                if(arrCnt==0)
                {
                         arrNum=SBUF;
                }
                else if(arrNum==arrCnt)
                {
                          endStat=1;
                }
                arr[arrCnt++]=SBUF;         //出去接收到的数据
               
        }
        ES=1;=0;                          //清除发送完成标志位

}

使用特权

评论回复
6
ayb_ice| | 2015-5-7 11:35 | 只看该作者
am540 发表于 2015-5-7 11:13
我把代码贴出来了,麻烦帮我看一下问题出现在哪里?是代码问题还是Keil设置问题? 感谢大神
#incl ...

SBUF是特殊的寄存器

建议读出到临时变量,对临时变量判断

使用特权

评论回复
7
am540|  楼主 | 2015-5-7 14:00 | 只看该作者
ayb_ice 发表于 2015-5-7 11:35
SBUF是特殊的寄存器

建议读出到临时变量,对临时变量判断


我用变量接收也接受不到,始终是0x00
大神救我

使用特权

评论回复
8
TJJ14520| | 2015-5-7 19:46 | 只看该作者
你把这句话beginStat=1;放到if(!beginStat){}的最后,不然那个if判断条件就不成立了

使用特权

评论回复
9
yelv21| | 2015-5-7 20:05 | 只看该作者
你的超时函数用到了吗?模拟会模拟出超时吗?

使用特权

评论回复
10
am540|  楼主 | 2015-5-7 20:34 | 只看该作者
yelv21 发表于 2015-5-7 20:05
你的超时函数用到了吗?模拟会模拟出超时吗?

超时没问题,到时间会进入中断,就是串口不知怎么搞的,始终不对

使用特权

评论回复
11
am540|  楼主 | 2015-5-7 20:36 | 只看该作者
TJJ14520 发表于 2015-5-7 19:46
你把这句话beginStat=1;放到if(!beginStat){}的最后,不然那个if判断条件就不成立了 ...

应该和beginStat没关系吧,我这里是SBUF无法赋值给变量还有无法比较的问题:L

使用特权

评论回复
12
am540|  楼主 | 2015-5-7 20:39 | 只看该作者
中国微电脑网 发表于 2015-5-7 10:29
STC不是有官方例程的吗?照着做就行了!

官方大多数例程是最新STC12系列的,我用的是STC89和STC90,而且官网貌似找不到相关例子,你有吗?能发我一下不

使用特权

评论回复
13
中国微电脑网| | 2015-5-7 20:53 | 只看该作者
和ATMEL89S51兼容的吧,百度找得到,原来我的都是汇编写的,呵呵。

使用特权

评论回复
14
中国微电脑网| | 2015-5-7 21:02 | 只看该作者
串口外部中断用线搭一下取反一个IO好了,IO口接一个发光管,要想办法用各种不同的方法测试。

使用特权

评论回复
15
中国微电脑网| | 2015-5-7 21:09 | 只看该作者
你究竟是在搞红外外部中断还是串口数据通讯,感觉怎么这么乱!

使用特权

评论回复
16
am540|  楼主 | 2015-5-7 21:32 | 只看该作者
中国微电脑网 发表于 2015-5-7 21:09
你究竟是在搞红外外部中断还是串口数据通讯,感觉怎么这么乱!

我现在在做串口,发现问题做不下去了

使用特权

评论回复
17
am540|  楼主 | 2015-5-7 21:34 | 只看该作者
中国微电脑网 发表于 2015-5-7 21:02
串口外部中断用线搭一下取反一个IO好了,IO口接一个发光管,要想办法用各种不同的方法测试。 ...

我现在是keil模拟的环境下,和硬件无关,我只想知道程序的问题,如果模拟解决不了,写道硬件里运行还是会错

使用特权

评论回复
18
yelv21| | 2015-5-8 10:33 | 只看该作者
am540 发表于 2015-5-7 21:34
我现在是keil模拟的环境下,和硬件无关,我只想知道程序的问题,如果模拟解决不了,写道硬件里运行还是会 ...

建议 不要用模拟的,例子的话在STC-isp下载程序中的范例程序中就有。
我之前串口发送命令和接受命令,这种我基本都是用标志位+校验。

使用特权

评论回复
19
lvyunhua| | 2015-5-8 11:42 | 只看该作者
波特率对不对,有多高!

使用特权

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

本版积分规则

1

主题

9

帖子

0

粉丝