已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
STM8的C语言编程(8) UART应用串口通讯也是单片机应用中经常要用到,今天的实验就是利用STM8的UART资源,来进行串口通讯的实验。实验程序的功能是以中断方式接收串口数据,然后将接收到的数据以查询方式发送到串口。程序代码如下,首先要对STM8的UART进行初始化,初始化时要注意的是波特率寄存器的设置,当求出一个波特率的分频系数(一个16位的数)后,要将高4位和低4位写到BRR2中,而将中间的8位写到BRR1中,并且必须是先写BRR2,再写BRR1。同样也是利用ST的开发工具,生成一个C语言的框架,然后修改其中的main.c,同时由于需要用到中断服务,因此还要修改stm8_interrupt_vector.c。修改后,编译连接,然后下载到开发板上,再做一根与PC机相连的线,把开发板的串口与PC机的串口连接起来,注意,2、3脚要交叉。在PC机上运行超级终端,设置波特率为9600,然后每按下一个按键,屏幕上就显示对应的字符。修改后的main.c和stm8_interrupt_vector.c如下:/ 程序描述:初始化UART,以中断方式接收字符,以查询方式发送/ UART通讯参数:9600bps,8位数据,1位停止位,无校验#include STM8S207C_S.h/ 函数功能:初始化UART/ 输入参数:无/ 输出参数:无/ 返 回 值:无/ 备注: 无void UART3_Init(void) LINUART_CR2 = 0;/ 禁止UART发送和接收 LINUART_CR1 = 0; / b5 = 0,允许UART / b2 = 0,禁止校验 LINUART_CR3 = 0;/ b5,b4 = 00,1个停止位 / 设置波特率,必须注意以下几点:/(1) 必须先写BRR2/(2) BRR1存放的是分频系数的第11位到第4位,/(3) BRR2存放的是分频系数的第15位到第12位,和第3位到第0位/ 例如对于波特率位9600时,分频系数=2000000/9600=208/ 对应的十六进制数为00D0,BBR1=0D,BBR2=00 LINUART_BRR2 = 0; LINUART_BRR1 = 0x0d;/ 实际的波特率分频系数为00D0(208) / 对应的波特率为2000000/208=9600 LINUART_CR2 = 0x2C; / b3 = 1,允许发送 / b2 = 1,允许接收 / b5 = 1,允许产生接收中断 / 函数功能:从UART3发送一个字符/ 输入参数:ch - 要发送的字符/ 输出参数:无/ 返 回 值:无/ 备 注:无void UART3_SendChar(unsigned char ch) while(LINUART_SR & 0x80) = 0x00); / 若发送寄存器不空,则等待 LINUART_DR = ch; / 将要发送的字符送到数据寄存器main() / 首先初始化UART3 UART3_Init(); _asm(rim); / 允许CPU全局中断 while(1) / 进入无限循环 / 函数功能:UART3的接收中断服务程序/ 输入参数:无/ 输出参数:无/ 返 回 值:无far interrupt void UART3_Recv_IRQHandler (void) unsigned char ch; ch = LINUART_DR; / 读入接收到的字符 UART3_SendChar(ch); / 将字符发送出去 /*BASIC INTERRUPT VECTOR TABLE FOR STM8 devices* Copyright (c) 2007 STMicroelectronics*/typedef void far (*interrupt_handler_t)(void);struct interrupt_vector unsigned char interrupt_instruction; interrupt_handler_t interrupt_handler;far interrupt void NonHandledInterrupt (void)/* in order to detect unexpected events during development, it is recommended to set a breakpoint on the following instruction*/ return;extern void _stext(); /* startup routine */extern far interrupt void UART3_Recv_IRQHandler();struct interrupt_vector const _vectab = 0x82, (interrupt_handler_t)_stext, /* reset */ 0x82, NonHandledInterrupt, /* trap */ 0x82, NonHandledInterrupt, /* irq0 */ 0x82, NonHandledInterrupt, /* irq1 */ 0x82, NonHandledInterrupt, /* irq2 */ 0x82, NonHandledInterrupt, /* irq3 */ 0x82, NonHandledInterrupt, /* irq4 */ 0x82, NonHandledInterrupt, /* irq5 */ 0x82, NonHandledInterrupt, /* irq6 */ 0x82, NonHandledInterrupt, /* irq7 */ 0x82, NonHandledInterrupt, /* irq8 */ 0x82, NonHandledInterrupt, /* irq9 */ 0x82, NonHandledInterrupt, /* irq10 */ 0x82, NonHandledInterrupt, /* irq11 */ 0x82, NonHandledInterrupt, /* irq12 */ 0x82, NonHandledInterrupt, /* irq13 */ 0x82, NonHandledInterrupt, /* irq14 */ 0x82, NonHandledInterrupt, /* irq15 */ 0x82, NonHandledInterrupt, /* irq16 */ 0x82, NonHandledInterrupt, /* irq17 */ 0x82, NonHandledInterrupt, /* irq18 */ 0x82, NonHandledInterrupt, /* irq19 */ 0x82, NonHandledInterrupt, /* irq20 */ 0x82, UART3_Recv_IRQHandler, /* irq21 */ 0x82, NonHandledInterrupt, /* irq22 */ 0x82, NonHandledInterrupt, /* irq23 */ 0x82, NonHandledInterrupt, /* irq24 */ 0x82, NonHandledInterrupt, /* irq25 */ 0x82, NonHandledInterrupt, /* irq26 */ 0x82, NonHandledInterrupt, /* irq27 */ 0x82, NonHandledInterrupt, /* irq28 */ 0x82, NonHandledInterrupt, /* irq29 */; 2010-8-6程序备份/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */#include STM8S103f3p.h/void Init_UART1(void) UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; / 设置波特率,必须注意以下几点: / (1) 必须先写BRR2 / (2) BRR1存放的是分频系数的第11位到第4位, / (3) BRR2存放的是分频系数的第15位到第12位,和第3位 / 到第0位 / 例如对于波特率位9600时,分频系数=2000000/9600=208 / 对应的十六进制数为00D0,BBR1=0D,BBR2=00 UART1_BRR2=0x00; UART1_BRR1=0x0d; UART1_CR2=0x2c;/允许接收,发送,开接收中断/void UART1_sendchar(unsigned char c) while(UART1_SR&0x80)=0x00); UART1_DR=c;/IO初始化/void init_gpio(void)/将pb5设置成推挽输出PB_DDR = 0x20; /数据方向PB_CR1 = 0x20; / 上拉、悬空PB_CR2 = 0x00;/main() unsigned char i=0;init_gpio(); Init_UART1(); _asm(rim);/开中断,sim为关中断 while (1);/将收到的数据再发送出去far interrupt void UART1_Recv_IRQHandler (void) unsigned char ch; ch=UART1_DR;UART1_sendchar(ch);PB_ODR=0x20; return;/*/ 串口发送程序/#include STM8S103f3p.hvoid delay(unsigned int ms)unsigned char i;while(ms != 0)for(i=0;i250;i+)for(i=0;i75;i+)ms-; /uart初始化/void init_uart1(void) UART1_CR1=0x00; UART1_CR2=0x00; UART1_CR3=0x00; / 设置波特率,必须注意以下几点: / (1) 必须先写BRR2 / (2) BRR1存放的是分频系数的第11位到第4位, / (3) BRR2存放的是分频系数的第15位到第12位,和第3位 / 到第0位 / 例如对于波特率位9600时,分频系数=2000000/9600=208 / 对应的十六进制数为00D0,BBR1=0D,BBR2=00 UART1_BRR2=0x00; UART1_BRR1=0x0d; UART1_CR2=0x2c; /允许接收,发送,开接收中断/uart发送程序/void uart1_sendchar(unsigned char c) while(UART1_SR & 0x80)=0x00); UART1_DR=c;/初始化A/D模块/void init_ad(void)ADC_CR2 = 0x00; / A/D结果数据左对齐ADC_CR1 = 0x00; / ADC时钟=主时钟/2=1MHZ / ADC转换模式=单次 / 禁止ADC转换ADC_CSR = 0x03; / 选择通道3ADC_TDRL = 0x20; /读AD值/unsigned char read_ad(void)unsigned char i=0;ADC_CR1 = 0x01; / CR1寄存器的最低位置1,使能ADC转换for(i=0;i100;i+);/ 延时一段时间,至少7uS,保证ADC模块的上电完成ADC_CR1 = ADC_CR1 | 0x01; / 再次将CR1寄存器的最低位置1/ 使能ADC转换while(ADC_CSR&0x80)=0); / 等待ADC结束i
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025学年南阳市部分校高三语文上学期11月考试卷附答案解析
- 公司石脑油吸附分离装置操作工设备技术规程
- 安置房项目机电安装施工组织设计
- 个人承包工程挂靠公司协议书
- 2026年北师大版(2022)小学劳动技术六年级上册期末综合测试卷及答案(三套)
- 函数的概念及其表示(2考点+8大题型15种考向)-2026年新高考数学一轮复习(讲义+专练)原卷版
- 技术培训实施管理细则
- 河流地貌的发育(同步训练)-2026年高考地理一轮复习(解析版)
- 《边做边学-After Effects 2021影视后期合成案例教》课件 第5章 创建文字
- 动词的时态和语态(学生版)-高考英语高频考点复习
- 发酵食品加工技术
- 高校实验室安全基础(华东理工大学)学习通网课章节测试答案
- 储能电池产品售后服务与维保方案
- 热电集中供压缩空气项目可行性研究报告
- GB/T 27043-2025合格评定能力验证提供者能力的通用要求
- 2025年重庆高职分类考试数学试卷真题及答案详解
- 2025年重庆市事业单位招聘考试综合类专业能力测试试卷(文秘类)
- 信息泄露投标管理办法
- DB42∕T 2051-2023 文物保护单位保护标志及保护界桩设置规范
- 煤矿掘进技术课件
- 装配钳工安全培训
评论
0/150
提交评论