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

* 70244: 请教C51一个问题

   guest 
guest发表的帖子 

 请教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的

发表时间:2004年12月30日10:42:57

  
回复该帖

本主题共有 1 帖,分页:>>>>>该主题的所有内容[1]条

 *树形目录 只列出部分跟帖的标题以及简单的摘要信息 该主题的部分跟帖如下:

[上一篇帖子]:汉字显示哪位大虾有unicode的汉字库,帮忙给我一份,谢谢!tjhjl@126.com
[下一篇帖子]:你用在什么地方?目前很多用在税控机上。QQ:54274777