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