打印

新手求助,关于51单片机串口接收问题

[复制链接]
2253|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yinzenglu|  楼主 | 2012-2-2 15:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <c8051f020.h>
#include <intrins.h>

#define uint unsigned int
#define uchar unsigned char
sbit SPEAKER=P3^3;
sbit SLEEP=P3^1;
sbit WX_RST=P3^2;
unsigned char warning_flag;
unsigned char chaomx_flag;
unsigned char flag;
unsigned char k;
unsigned int idata c_timer0;            //计时器
unsigned char data I2C_RAM[16];        //I2C数据交换RAM
unsigned char data bat_count;      //电池采样计数
unsigned char code *pointer;
unsigned char idata uart0_se;            //uart0口接收开始同步字和结束符个数
unsigned char idata uart0_num;            //uart0口接收、发送字符个数
unsigned char idata battery_volt;        //电池电压 battery_volt=60*(battery_ad÷battery_base)
unsigned char idata battery_base[3];    //电池标称ad值和标称时的电压
unsigned int idata battery_ad;            //电池当前ad值
unsigned int idata battery_sampling[4]; //电池采样周期瞬时值

void main(void)
{
//*************************************************************
//******系统初始化*********************************************
/*初始化------------------------------*/
     P1MDIN=0xFF;
    EMI0CF=0x03;
    XBR0=0x04; //00000100B       /* UART0*/
//    XBR1=0x04; //00000100B       /* INT0 */
    XBR2=0x42; //01000010B       /* 弱上拉允许,允许交叉开关,UART1不连到端口 */
//UART0初始化
    TL1=0xfd;            
    TH1=0xfa;            //定时器T1装载值  FDH(9600), FAH(4800), F4H(2400), E8(1200)
    SCON0=0x50;          //设串口UART0为模式1(用于无线通信或PC通信)  (用T1)
    //定时器设定
    CKCON=0x00;          //T0,T1,T2,T4使用SYSCLK的12分频
    T2CON=0x04;           //T1为UART0串口波特率发生器,启动T2
    TMOD=0x21;            //T0为定时方式1,T1为8位自动装载为UART0串口波特率发生器
    TR1=1;                //启动T1
//DAC0设置
   
    P0MDOUT=0x01; //00000001B     /*P0配置*/
    P1MDOUT=0xff;                 /*P1*/
    P2MDOUT=0xff;                 /*P2*/
    P3MDOUT = 0xff; //11111111B  P3口配置 /*各个端口输入时配置为漏极开路,输出时配置为推挽方式*/
    P74OUT=0x00;
    P4=P4&0xd3;                   /*ALE=0,A16=0(P4.3),LCDE=0(P4.2)*/               
    WDTCN=0xde;                   /*暂时禁止看门狗定时器*/
    WDTCN=0xad;
    SCON0=SCON0&0xfc;    //清TI0,RI0

//外部中断设置
   
    IE0=0;  /* 清中断标志 */
    ES0=1;            //开放串口UART0中断
    EA=1;         //开总中断
    AMX0SL=0x07;
//初始化

        P5=P5&0xfd;        //开机点亮工作灯
         while (1);


}
void uart0_rt(void) interrupt 4
{
           k=0;
        if (RI0==1)
           {
           RI0=0;
           k=SBUF0;
           }
        
}

相关帖子

沙发
yinzenglu|  楼主 | 2012-2-2 15:20 | 只看该作者
能通信,能接收数据,但是sbuf一直是255,不论发什么都是255,用示波器看了波形正常,肯定是程序问题,求大神帮忙看下,学的时候基础不牢靠的后果啊。。。

使用特权

评论回复
板凳
NE5532| | 2012-2-2 17:23 | 只看该作者
void uart0_rt(void) interrupt 4
{
           k=0;
        if (RI0==1)
           {
           RI0=0;
           k=SBUF0;
           }
        
}

进了中断还需要判断中断标志?中断标志需要自己清?硬件不清?就算要清是不是也该先把数据读了再清啊?

楼主的问题不是基础不牢靠,是懒得去看数据手册,想当然的写。需要仔细看下数据手册关于串口中断部分的介绍了。

使用特权

评论回复
地板
yinzenglu|  楼主 | 2012-2-3 09:33 | 只看该作者
3# NE5532
额。。。谢谢你,我是真的才开始学,不大懂,关于串口中断那个地方是我参考的别的程序,请您把我的具体问题指出来好么,我再自己看看。。。

使用特权

评论回复
5
zj314995534| | 2012-2-7 19:48 | 只看该作者
2楼讲的是:先把SBUF中的数据读出来,然后再软件清串口,但是这无关紧要。
按下面的你再试试。
void uart0_rt(void) interrupt 4
{
        //   k=0;//你已经定义一个K的全局变量,再在中断中定义无意义。
        if (RI0==1)
           {  
           RI0=0;         
           k=SBUF0;   
           }
        
}

使用特权

评论回复
6
NE5532| | 2012-2-7 20:12 | 只看该作者
3# NE5532
额。。。谢谢你,我是真的才开始学,不大懂,关于串口中断那个地方是我参考的别的程序,请您把我的具体问题指出来好么,我再自己看看。。。 ...
yinzenglu 发表于 2012-2-3 09:33


串口的中断标志,多是硬件清的,要仔细研读你所用单片机关于串口中断部分的说明,弄清楚。

使用特权

评论回复
7
g1234567| | 2012-2-8 15:42 | 只看该作者
......................................
//UART0初始化
    TL1=0xfd;            
    TH1=0xfa;  
..........................................
这个波特率是4800吧,但是也不应该全是255啊。
先把TL1=TH1=0xFD/0xFA(不知道这有否影响),然后如5L说的:检查变量k是否被其他地方修改了,可能你查看到的是值修改后的值。

使用特权

评论回复
8
zj314995534| | 2012-2-9 10:42 | 只看该作者
还是有问题?

使用特权

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

本版积分规则

0

主题

3

帖子

0

粉丝