历史上的今天
今天是:2025年05月14日(星期三)
2021年05月14日 | 8051单片机的UART0串口初始化
2021-05-14 来源:eefocus
1、C8051f的UART0是异步、全双工串口。其波特率发生器规定由定时器1定时器提供。可配置为8位UART或9位UART(多机通讯第九位用于片选作用)。SYSCLK=24.5MHZ(我的板子采用内部晶振频率作为系统时钟) BAUDRATE=115200(波特率)
2、初值TH1 Tl1配置

由上述公式可计算初值:TH1 = 256-(SYSCLK/BAUDRATE/2)而程序内是TH1 = -(SYSCLK/BAUDRATE/2),这两种是相同的。第一种是以正数的二进制形式保存在计算机内。第二种是负数,取反加1求得补码保存在计算机中。结果是相同的。每当TL1中的值溢出后 TH1存储的重装载值装载到TL1中开始计数。
3、初始化程序(以后使用可直接调用此初始化函数)。SYSCLK与BAUDRATE参数修改即可
void UART0_Init (void)
{
SCON0 = 0x10; // SCON0: 8-bit variable bit rate
// level of STOP bit is
// 使能RX接收
// ninth bits are zeros
// 清除接收和发送中断
if (SYSCLK/BAUDRATE/2/256 《 1) {
TH1 = -(SYSCLK/BAUDRATE/2);
CKCON |= 0x10; // T1M = 1; SCA1:0 = xx
} else if (SYSCLK/BAUDRATE/2/256 《 4) {
TH1 = -(SYSCLK/BAUDRATE/2/4);
CKCON |= 0x01; // T1M = 0; SCA1:0 = 01
CKCON &= ~0x12;
} else if (SYSCLK/BAUDRATE/2/256 《 12) {
TH1 = -(SYSCLK/BAUDRATE/2/12);
CKCON &= ~0x13; // T1M = 0; SCA1:0 = 00
} else {
TH1 = -(SYSCLK/BAUDRATE/2/48);
CKCON |= 0x02; // T1M = 0; SCA1:0 = 10
CKCON &= ~0x11;
}
TL1 = 0xff; // 定时器1加1 TL1溢出 此时TH1中的重装载值加载 //到TL1中
TMOD |= 0x20; //定时器1设置为8位自动重装载模式
TMOD &= ~0xD0;
TR1 = 1; //开启定时器1
TI0 = 1; // 发送结束 此发送中断位置1
}
史海拾趣
|
FPGA 是硬件编程器件,器寄存器的长度理论上没有限制,受限与硬件容量,以及对寄存器的时钟速率要求。比如要实现一个256位的串并转换。只需如下编程即可: din : in std_logic_vector(255 downto 0);   ...… 查看全部问答> |
|
我用的伟福仿真器,p89c51的片子,通过串口写入数据,控制液晶屏的显示 在同一块板子上,仿真完全正常 固化后液晶屏就没有反映 检查发现串口通讯是正常的,在程序中加入测试点,证明程序运行也正常 仿真时就用的板子上的晶振 给液晶屏的控制管脚加了 ...… 查看全部问答> |
|
ERRO[e89]:too much object code produced[more than 0x800 byte] for this pack-age 我用的是EW430,147的片子.… 查看全部问答> |
|
很多人不喜欢用AS6和ASF,因为AS6+ASF的组合运行程序慢、打开项目文件慢、编译速度慢,的确是不够方便。但是AS6和ASF毕竟是ATMEL官方的主要开发工具,还是有它的一些优点的,比如使用ASF快速建立项目、通过ASF向导添加新的功能模块、程序在不同MCU ...… 查看全部问答> |
|
我用N-MOS的具体型号是:csd18532 ,用来做无刷电机驱动。 我是拿单个csd18532来测量的 用二极管档 表笔正接N-MOS的D(栅极),表笔负接 G (门极) 这时DS表笔正方向都是导通的并且能够保持。 表笔负接N-MOS的D(栅极), ...… 查看全部问答> |




