欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    STM8的C语言编程(8)-- UART应用.doc

    • 资源ID:70328077       资源大小:52.50KB        全文页数:8页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    STM8的C语言编程(8)-- UART应用.doc

    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.h"void delay(unsigned int ms)unsigned char i;while(ms != 0)for(i=0;i<250;i+)for(i=0;i<75;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;i<100;i+);/ 延时一段时间,至少7uS,保证ADC模块的上电完成ADC_CR1 = ADC_CR1 | 0x01; / 再次将CR1寄存器的最低位置1/ 使能ADC转换while(ADC_CSR&0x80)=0); / 等待ADC结束i = ADC_DRH; / 读出ADC结果的高8位return(i);/IO初始化/void init_gpio(void)/将pb5设置成推挽输出PB_DDR = 0x20; /数据方向PB_CR1 = 0x20; / 上拉、悬空PB_CR2 = 0x00;/main() unsigned char i=0; init_uart1();init_ad();init_gpio(); while (1) delay(1000);i=read_ad();uart1_sendchar(i);PB_ODR=0x20; /*/

    注意事项

    本文(STM8的C语言编程(8)-- UART应用.doc)为本站会员(asd****56)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开