有关单片机的一道题目

某MCS—51单片机使用12MHZ时钟,需要用串行通信方式与PC进行通信,在默认的SMOD状态下,请设置与串行通信相关的控制寄存器,计算满足要求波特率的时间常数(波特率计算公式及控制寄存器、2400)
题目后面好像有些不完整,大概是这样的(记得不太清楚了)

MCS-51单片机PCON是电源控制寄存器,其第7位为SMOD为波特率增倍,默认SMOD=0,你题目没有写清楚串行口的工作方式,我给你介绍一下,有以下几种:
方式0:波特率固定不变,其值为f/12,这里就是12MHZ/12,即100000
方式2:波特率有两种固定值
因为SMOD给的为0,就不说SMOD为1的情况了,SMOD=0时,波特率=(2^SMOD/64)*f,这里就是12*10^6/64
方式1和方式3时,波特率可变的,关键是定时器T1的溢出率
波特率=(2^SMOD/32)*定时器T1的溢出率
我举个例子:
设串行口工作方式1下,SMOD=0,f=11.059MHZ,T1工作在方式2下,TL1.TH1,的初值为FDH(253D),求波特率
解:
T1因为工作方式2为自动重装初值的8位定时器,求
其溢出一出要的时间Tc=(256-253)*12/11.059*10^6
根据Tc求溢出率=1/Tc=307194.4
根据上面的公式求波特率=2^0*307194.4/32=9600(位/秒)

希望我的回答能对你有用
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-09-07
void uart_init()//初始化UART,fosc=11.0592M,波特率19200
{
TMOD=0x20;//定时器T1工作于8位自动重载模式
TH1=0xfd;
TL1=TH1;
TR1=1;
PCON=0x80;//波特率倍增
SCON=0x50;//uart工作于模式1
}

void senddata(unsigned char sdata)//发送数据
{

SBUF=sdata;
while(!TI);//等待发送完成
TI=0;
}

unsigned char recdata()//接收数据
{
unsigned char readdata;
while(!RI);//等待接收完成
readdata=SBUF;
RI=0;
return readdata;
}
void uart()
{
unsigned char tem,j;
uart_init();
for(j=0;j<10;j++)
{
tem=recdata();
senddata(tem);
}
}
与电脑通信的话,单片机的晶振一般是11.0592M
这是我写的一个程序,
如果改成12M,2400波特率的话,应该这样

TMOD=0x20;//定时器T1工作于8位自动重载模式
波特率的计算=K*Fose/(32*12*[256-(TH1)])
当smod=1时,k=2;当smod=0时(默认)k=1;
得TH1=D;
PCON不用设置,默认SMOD为0
其他的跟上面的差不多
但是一般来说,串行的话 晶振的就是用11.0592M
第2个回答  2008-09-06
上大学时学的,早忘了,你愿意的话可以去问我的老师,陕西科技大学的,下面是他的邮箱,在单片机方面很强的一人[email protected]
第3个回答  2008-09-07
难度不是一般的大,还是去专业一点的地方问吧。
第4个回答  2008-09-15
不太会の。。
第5个回答  2008-09-23
没有清楚的题目就没有清楚的答案!