导航: 老古网老古论坛XMOS公共讨论区XMOS开源项目区单片机程序设计嵌入式系统广告区域
→请教C51一个问题[guest]

 *第28747篇: 请教C51一个问题

  
楼 主:guest 2004年12月30日10:42
 请教C51一个问题
/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 外部中断0  0003H
 定时器T0  000BH
 外部中断0  0013H
 定时器T1  001BH
 串行口   0023H
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/

/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
  命令为4A得到指示灯的状态
  从串发出格式为7E 4A LED XOR 7E
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/

/*$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
 程序说明:
 这个程序分为初始化:
   初始化定时器0与串口通信
$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$*/

#include   <reg52.h>  

#define DEBUG 1
#define FALSE 0 
#define TRUE  1
#define uchar unsigned char 

sbit INT0P = P3^2;
sbit T0P = P3^4;
sbit T1P = P3^5;
//17909  84331000

bit t_done, t_empty, r_full, bCheckSound;
uchar uRevBuf[32];/*接收串口的BUF*/
uchar uSendBuf[32];/*发送串口的BUF*/
uchar r_in, r_out, t_in, t_out;/*指针队列*/
uchar uRec;
void Init(void);/*初始化状态*/
void GetLedStatus();

void Init(void)
{
 SCON = 0x50;/*方式1,REN允许串行接收*/
 TMOD = 0x21;/*定时器1方式2,定时器0方式1*/
 PCON = 0x80;/*波特率加倍*/

 TH1 = 0xFA;
 TL1 = 0xFA;/*波特率为9600*/
 
 TH0 = 0xEE;/*方式1下*/
 TL0 = 0x00;/*定时器0产生5ms中断*/
  /*IP不改,使用自然中断优先级*/
 IE = 0x92;/*开中断,允许串口中断与T0中断*/
 TR0 = 1;
 TR1 = 1;
 EA = 1;
 
 uRec = 0;
}

/*定时器0中断,取LED的状态*/
void Int_T0(void) interrupt 1
{
 uRec++;
 bCheckSound = TRUE;
 TH0 = 0xEE;/*方式1下*/
 TL0 = 0x00;/*定时器0产生5ms中断*/
}

/*串行中断*/
void Int_Serial(void) interrupt 4 
{
 if(RI&& ~r_full)
 { 
   uRevBuf[r_in] = SBUF;
   RI = 0;
   r_in = ++r_in & 0x1F;
   if (r_in == r_out) r_full = 1;
 }
 else if (TI &&~t_empty)
 {
   SBUF = uSendBuf[t_out];
   TI = 0;
   t_out = ++t_out&0x1F;
   if (t_out == t_in) t_empty = 1;
 }
 else if (TI)
 {
   TI = 0;
   t_done = 1;
 }

void GetLedStatus()
{
 /*切换片选信号,读245的状态*/
  uchar cLed;
  cLed = P1;
 //memset(uSendBuf, 0, sizeof(uSendBuf));
 t_in = 0; t_out = 0;
  uSendBuf[0] = 0x7E;
  uSendBuf[1] = 0x4A;
  uSendBuf[2] = cLed;
  uSendBuf[3] = 0x4A ^ cLed;
  uSendBuf[4] = 0x7E;
  t_in+=5;
  TI = 1;
}

void main(void)
{
 Init();
 while(1)
 {
   if (bCheckSound)/*是查询是否有语音,用的是5MS一次*/
   {
     if (INT0)/*INT0是作为IO用,而不能用中断*/
     {
      T0 = 0;
      T1 = 0;
     }
     else
     {
      T0 = 1;
      T1 = 1;
     }
     bCheckSound = FALSE;
   }
  if (uRec >   40)
  {
    uRec = 0;
    GetLedStatus();
    
  }
 }
}

我写的这个程序在收到串口内容不正确。为什么呀
我的晶振是22.1184,这个波特率应该是119200,可是我用9600才能收到同样个字节。
收到的内容也是不正确,FE 9A FF 65 FE,第二个字节也可能是8A,第四个也可能是75,
为什么呀,哪儿不正确,请高手指点一下吧,本人第一次用C51的


>>>>>>对该主题发表你的看法

本主题贴数1,分页: [第1页]


[上一篇主题]:汉字显示

[下一篇主题]:一个非常棒的学习科研园地---研学论坛