一、准备工作
1、KEIL C51编译环境
2、CodeGen8 代码生成器
3、MC96F6332D 开发板
4、USB-OCD II仿真器
二、生成串口通讯代码
1、在CodeGen8 代码生成器的外设窗口中选择内部RC时钟作为时钟源,设置时钟源的频率为8MHz,配置UART的引脚P40(Pin8)–>RXD0引脚, P41(Pin9)–>TXD0引脚;配置UART0的参数为ASync. 9600bps N 8 1;具体配置如下图①所示;
在main.c的窗口中可以看到CodeGen8 已经根据选择自动生成了代码,自动生成的代码段如上图②所示。
2、点击CodeGen8 中的C 图标,自动打开KEIL C51软件;下一步进行代码的修改、编译和程序下载;
1)、在代码中删除LCD驱动代码,本实验暂时用不到LCD部分;
2)、配置代码程序,实现printf函数【可参考我的另外一篇博客:ABOV单片机UART串口通讯中Printf函数实现讲解及示例代码-[MC96F6332D]】
3、进行工程的配置和编译,可以看到编译的结果无错误、无警告。
4、代码解析:通过MC96F6332D的user‘s Manual手册中USI0 (UART + SPI + I2C)寄存器章节可以看出生成的代码的含义
1)、关于UART的引脚初始化问题:配置UART的引脚P40(Pin8)为RXD0引脚, P41(Pin9)引脚为TXD0引脚;因为RXD引脚是数据的接收引脚,故该引脚的方向应该是输入,TXD引脚是数据的发送引脚,故该引脚的方向应该是输出。
因为RXD0/TXD0引脚功能是复用P40/P41,所以需要配置复用功能寄存器P4FSR,选择复用功能。
奇怪的是:在配置P4FSR后,P40和P41的方向寄存器全部配置为输出状态,程序功能也是可以实现的;这里建议按照串口正常的逻辑进行配置。
2)、UART的寄存器配置
波特率产生寄存器USI0BD:
USI控制寄存器1:因为USI是一个UART、SPI、I2C三个硬件外设共用的寄存器,所以需要进行外设的选择;下图寄存器中选择异步的UART模式,无奇偶校验,8bit的数据位,
USI控制寄存器2:这里使能接收和发送功能,不使能中断,使能USI0;
USI控制寄存器3:选择1bit的停止位
串口的读取和发送寄存器:USI0DR,数据发送时写入数据到该寄存器,接收数据时读取该寄存器即可。
5、点击编译器的下载按钮,对代码进行单片机的下载。
三、实验现象(具体内容可以参考工程中的Readme.txt文件)
1、本实验是通过操作USI0的寄存器,实现串口数据的通讯;实际的代码中增加了printf函数的实现,可以方便的观看程序的运行;
2、循环体中增加printf("%c",getchar());函数,连接串口到电脑可以实现串口数据的透传功能,即PC发送数据到MCU,MCU会返回相同的数据到PC端;
3、单片机串口和USB转TTL的串口连接时需要注意物理上的交叉和共地操作,即单片机的TXD—->USB串口助手的RXD,单片机的RXD—->USB串口助手的TXD,两端的GND连接在一起;
4、具体的代码可以访问链接:https://share.weiyun.com/5Ivphmm;进行免费下载。
因为小编自己能力水平有限,文中难免有错误或表达不到的信息,还望广大阅读者留言批评指正,谢谢