C<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />8051F学习笔记4:UART0<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
C8051F有一个UART0。
UART0特点:
1) UART0是一个异步、全双工串口;
2) UART0具有增强的波特率发生器电路,波特率由定时器1工作在8位自动重载方式产生;
3) 定时器1应被配置为方式2,即8位自动重装载方式。定时器1的重装载值应设置为使其溢出频率为所期望的波特率频率的两倍;
<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />
4) 定时器1的时钟可以在6个时钟源中选择:SYSCLK、SYSCLK/4、SYSCLK/12、SYSCLK/48、外部振荡器时钟/8和外部输入T1;
5) UART0的波特率由下面方程决定;
其中T1CLK是定时器1时钟频率,TH1是定时器1的高字节(重装载值);
6) UART0 有两个相关的特殊功能寄存器:
串行控制寄存器(SCON0)和串行数据缓冲器 (SBUF0)。
用同一个 SBUF0 地址可以访问发送寄存器和接收寄存器。
写 SBUF0 时自动访问发送寄存器;
读 SBUF0 时自动访问接收寄存器,不可能从发送数据寄存器中读数据。
7) 如果UART0中断被允许:
每次发送完成 (SCON0中的TI0位被置‘1’),接收到数据字节(SCON0中的RI0位被置‘1’)时将产生中断。
当CPU转向中断服务程序时硬件不清除UART0中断标志。中断标志必须用软件清除,这就允许软件查询UART0中断的原因(发送完成或接收完成)。
由于对UART0相关寄存器的配置比较繁琐,所以借助Silicon Labs IDE软件的配置向导(Configuration Wizard)。
1. UART Mode UART模式选择
8 Bit UART 8位UART
每个数据字节共使用10位:一个起始位、8个数据位(LSB在先)和一个停止位。数据从TX0引脚发送,在RX0引脚接收。在接收时,8个数据位存入SBUF0,停止位进入RB80(SCON0.2)。
8位UART时序图
9 Bit UART 9位UART
在9位UART方式,每个数据字节共使用11位:一个起始位、8个数据位(LSB在先)、一个可编程的第九位和一个停止位。
第九发送数据位由TB80(SCON0.3)中的值决定,由用户软件赋值。它可以被赋值为PSW中的奇偶位P(用于错误检测),或用于多处理器通信。在接收时,第九数据位进入RB80(SCON0.2),停止位被忽略。
8位UART时序图
2. Multiprocessor Communications Enable
UART Mode选相应位时,此选项相应可选
UART Mode="8" bit UART,可选下面两个选项
Logic level of stop bit ignored
RI0 will only be activated if stop bit is logic level 1
UART Mode="9" bit UART,可选下面两个选项
Logic level of ninth bit ignored
RI0 is set and an interrupt is generated only when the ninth bit is logic 1
可参考SCON0的位7和位5
默认是8位UART,停止位逻辑电平忽略。
3. Receive Enable UART接收允许
通常是允许UART0接收,所以
REN0=1;
4. Configure UART Interrupts 配置UART中断
允许UART中断(Enable UART0 Interrupt)
允许总中断 (Enable All Interrupts)
IE = 0x90; //IE位7 EA =1 总中断允许
//IE位4 ES0=1 UART0中断允许位
中断优先级设置
每个中断源都可以被独立地编程为两个优先级中的一个:低优先级或高优先级。一个低优先级的中断服务程序可以被高优先级的中断所中断,但高优先级的中断不能被中断。如果这两个中断的优先级相同,则由固定的优先级顺序决定哪一个中断先得到服务。
5. Configure UART Baud Rate 配置波特率
首先先选择振荡频率(Change Clock Frequency),C8051学习笔记1对震荡器的配置有详细的描述,这里就不详说了,配制成内振荡器+4倍乘法选择器,系统时钟为24MHz。
CLKMUL = 0x80;
for (i = 0; i < 20; i++); // Wait 5us for initialization
CLKMUL |= 0xC0;
while ((CLKMUL & 0x20) == 0);
CLKSEL = 0x02;
OSCICN = 0x83;
选择波特率(Target Baud Rate)为19200bps,T1时钟自动配置成SYSCLK/4 (Prescaled Clock Inputs)。要注意,最后配置出来的实际波特率为19230bps,是有误差的,只要误差小于0.45%,串口通信时就不会有误码。
同时打开定时器1(Enable Timer)。
TCON = 0x40; //TR1=1
TMOD = 0x20;
CKCON = 0x01;
TH1 = 0x64;
6. Configure Port I/O 配置优先权交叉译码器
注意:
要注意的是,首先要使能优先权交叉译码器(Enable Crossbar)。
1)为使端口P0、P1和P2.0 ~ P2.3工作在标准端口I/O输入/输出方式,交叉开关必须被使能。当交叉开关被禁止时,端口输出驱动器被禁止。P2.4 ~ P2.7和P3.0总是作为标准GPIO使用。
2)未被交叉开关分配的端口引脚和未被模拟外设使用的端口引脚都可以作为通用I/O。
UART0管脚分配到P0.4和P0.5,还有一个系统时钟输出,便于检测,SYSCLK分配到P0.0。全都是数字管脚,推挽输出。
P0MDOUT = 0x31;
XBR0 = 0x09;
XBR1 = 0x40;
下面程序是系统时钟(SYSCLK)为24MHz,波特率为19200bps,上电复位后PC机串口调试助手显示: blog.ednchina.com/tengjingshu
PC机通过串口向C8051F发送字符,C8051F串口回传这个字符。
https://static.assets-stash.eet-china.com/album/old-resources/2009/5/4/d4f57ad3-09f1-415e-8736-4d1722ad8d05.rar
由于C8051F的电源是3.3V,所以RS232电平转换芯片采用MAX3232,我也换过用MAX232,好像也行J
用户1012002 2011-6-12 19:09
用户1012002 2011-6-12 18:58