历史上的今天
今天是:2025年03月18日(星期二)
2019年03月18日 | STC89C52RC单片机实现串口打印功能
2019-03-18 来源:eefocus
stc的89c52rc型号开发板,晶振是12m。是因为买的最小系统就是这个频率。使用波特率位9600,将TL、TH都设置成0xfd后不管是英文还是中文的都是乱码。
12M的晶振波特率只能是2400,9600的情况下会有7.8%的误差,所以会产生乱码,而2400波特率的情况下误差是0.16%,这样就不会产生乱码了,TH1和TL1都设为F3
为什么51单片机的晶振一般使用11.0592?
用11.0592晶振的原因是51单片机的定时器导致的。用51单片机的定时器做波特率发生器时,如果用11.0592Mhz的晶振,根据公式算下来需要定时器设置的值都是整数;如果用12Mhz晶振,则波特率都是有偏差的,比如9600,用定时器取0XFD,实际波特率10000,一般波特率偏差在4%左右都是可以的,所以也还能用
STC90C516 晶振12M 波特率9600 ,倍数时误差率6.99%,不倍数时误差率8.51%,数据肯定会出错。 这也就是串口通信时大家喜欢用11.0592MHz晶振的原因,在波特率倍速时,最高可达到57600,误差率0.00%。 用12MHz,最高也就4800,而且有0.16%误差率,但在允许范围,所以没多大影响。
#include
//stdio.h,string.h用于printf函数原型
#include
void delay(unsigned int z);
void uart_init(void);//串行口初始化
int main(void)
{
int a=99;
char *string="abde";
uart_init();
while(1)
{
puts("abcd");
printf("%d %x %c %s %p\n",a,a,(char)a,string,string);
delay(1000);
}
return 0;
}
void uart_init(void)
{
TMOD=0x20;//即0010 0000,定时器/计数器1,工作方式2
TH1=0xf3;//设置波特率为9600
TL1=0xf3;
TR1=1;//启动定时器/计数器1
SCON=0x50; //0101 0000.串口工作方式1,允许串行控制
PCON=0x00;//设置SMOD=0
IE=0x90; //CPU允许中断,串行允许中断
TI=1;//直接使用printf必须加入此句才能实现发送
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
下一篇:STC单片机常用型号
史海拾趣
|
怎么写配置文件才能自动回车? 这个文件放在Application 下, 同目录下有一个ScanWedge.reg 内容是这样的 [HKEY_CURRENT_USER\\Software\\Symbol\\ScanWedge] \"AutoEnter\"=dword:00000001 为什么不行呢,改怎么写,高手请指教… 查看全部问答> |
|
美国Ligos公司是一家专门从事音频,视频控件开发的厂商,所生产的音频,视频类控件功能相当强大,为软件产品的开发提高了效率,也节约了成本,在全球都是享有地位的! 在慧都控件网能买到!重庆慧都科技有限公司---提供专业的控件产品咨询,代理全 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:00 编辑 本刊前几期介绍了太阳能电池板及相关的小制作,引发了包括笔者在内的许多读者的兴趣。闲来无事,突发奇想,决定利用手头上的两块太阳能电池板DIY一个微型太阳能供电系统,模拟现代化太阳能电 ...… 查看全部问答> |
|
我用的是MSPF1611 MCLK=7.3728MHZ现在想产生一个最高频率为2M的方波,程序我是这样写的 void main(void) { WDTCTL = WDTPW +WDTHOLD; // Stop WDT P3DIR|=0x04; P3OUT|=0x04; CCR0 = 4; // ...… 查看全部问答> |
|
职场中要避免不良情绪发生,控制好自己的情绪对工作前途和同事关系都会带来影响。学会控制情绪会让你变得更成熟,那么职场人士应如何控制情绪呢?一起来看看下面的介绍吧,希望对您有所帮助。 用理智控制你的情绪 如果你怒气冲冲 ...… 查看全部问答> |




