51单片机与PC串口通信程序,求指导

C程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit CLK=P1^3;
void UART_Init(void)
{
ES=0;
TMOD &= 0x0F;
SCON=0x40;
PCON &= 0x7F;
TMOD|=0x21;

TH0=0x00;
TL0=0x3c;
TR0=1;
ET0=1;

TH1=0xFD;
TL1=0xFD;

TR1=1;
REN=1;
ET1=1;
EA=1;
}

void SendCh(uchar c)
{
EA=0;
TI=0;
SBUF=c;
while(TI==0);
TI=0;
EA=1;
}

void main()
{
UART_Init();
EA=1;
i=0;
while(1)
{
SendCh(1);
}
}

void timer0() interrupt 1
{
TH0=0x00;
TL0=0x3c;
CLK=~CLK;
}
问题:T1作为波特率发生器,此程序中T0定时中断无效。也就是CLK不会变化。求解答。
另外,如果把串口初始化以及定时器写成如下程序:
void UART_Init(void)
{
SCON=0x40;
PCON = 0x00;
TMOD=0x21;

TH0=0x00;
TL0=0x3c;
TR0=1;
ET0=1;

TH1=0xFD;
TL1=0xFD;

TR1=1;
REN=1;
ET1=1;
EA=1;
}
两个串口初始化有何不同。

我来回答你的第一的问题,毕竟比较容易回答,当然我也就是单纯的看看,没有做过实验。
你的问题出现在主函数中的while(1)大循环,当然,里面只有一个子函数,你发现了么,你的子函数一头一尾连起来以后,就是第一个调用结束时的EA=1,没过多少时间,马上到了第二个调用的头,是个EA=0,也就是说你的程序只有很小一段时间比例里总中断是打开的,从而导致中断无效。当然,我个人认为这么点时间中断程序应该也会进入(因为排队)。不管怎么说,你这么写程序还是不对的,你不应该过多的控制EA,不是有串口的中断允许么(应该是ES吧,初始化的时候关上就行了),你用他不就完事了么,哦貌似你已经关上了,那就把你子函数那两个EA删掉把,这里不怕被中断打断的。
至于你的初始化,我实在不高兴查资料比对了。就麻烦你自己再检查检查是不是初始化正确了。
我还是不小心查了下,我认为TMOD应该设置成0x21,呃,貌似你没错,但是最好直接赋值,像你上面那样可能不会错但是不保险。
总之就按你下面那个初始化程序应该就行,而且你不是说你的单片机只发不收么(见你对别人的追问),那你还REN=1干嘛,应该不管或者最好=0 啊。对了,你还ET1=1了,这个是个大问题,定时器1不是波特率发生器么,你应该把他的中断允许关了,说不定这是你程序错误的根源。
许久没碰,本来做过的也不多,希望发现我说错的大虾口下留情。
强烈要求选为最佳,要是哪儿没解决接受追问,反正时间够嘛,我很少回答的~~,呵呵,我正在试试能不能把我的采纳率弄上去。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-05-07
1、程序烧进去,串口接收显示一个菜单!《如图》A、B、……分别代表一定看样子你是UART口知道怎么发多个字节,但是不知道怎么收多个字节,希望下面追问

单片机只发不收。我用多个STC89C52单片机

相似回答