2020年 01月 06日 星期一
您的位置: 威廉希尔主页 > 单片机技术 >

AVR单片机教程——串口发送

来源:未知     作者:威廉希尔     发布时间:2020-01-06 10:39         

  到目前为止,我们的开发板只能处理很小量的数据:读取几个引脚电平,输出几个LED,顶多用数码管显示一个两位数字。至于输入一个指令、输出一条调试信息,甚至用scanf和printf来输入输出,在已经接触过的这些器件上是难以想象的。而本讲“串口发送”与下一讲“串口接收”,将打开这一扇大门。

  本讲的主题是UART(Universal Asynchronous Receiver-Transmitter,通用异步收发器),俗称串口。实际上串口是串行接口的统称,在单片机领域通常指UART。“串行”的意思是每次传输一个bit,而一个字节的数据被拆成8个bit传输;相比之下并行总线可以一次传输一个或多个字节(这并不意味着并行总线一定优于串行总线)。

  AVR单片机提供的硬件组件不是UART,而是USART(S代表Synchronous,同步的),相比UART额外支持同步通信。所谓“同步”是指收发双方通过时钟同步,“异步”是指没有时钟来同步,但实际上双方还是由一些特殊信号同步的。

  一帧包含一个起始位、5~9个数据位(常用8位;很多设备不支持9位)、可选的一个校验位(偶校验或奇校验,即所有数据位与0或1的异或结果)与1或2个终止位。起始位与终止位统称为同步位,用于在异步总线上起到同步的作用,这样接收方才能知道一帧何时开始。

  波特率的定义是信息在通信信道上传输的速率。假如信号线个方框(方框表示高电平或低电平,实际电平是其中一个),那么波特率就是9600。常用的波特率有9600与115200(打开Serial Port Utility或类似软件,可选的波特率都是常用的)。

  在开始通信之前,收发双方必须约定好波特率与帧格式。uart_init函数的配置是波特率38400,8数据位,偶校验,1停止位。相应地在电脑的串口调试软件中也要这样配置。

  开发板的TX引脚发送数据,RX引脚接收数据。为了使开发板与电脑能通过UART通信,电脑上需要插一个USB转串口的工具。用杜邦线把开发板与工具的TX与RX引脚交叉连接。本讲只涉及串口发送,所以只连接开发板的TX与串口工具的RX就可以了。在串口调试软件中打开端口,就可以通信了。

  由于printf是变参函数,不是很安全(如果格式串和参数对应错,程序可能直接跑飞),我倾向于使用类型安全的函数,即函数通过C的句法知道实参类型(写错就编译错误,而不是通过编译器无法检测的格式串)。不过,avr-gcc的中还是提供了printf等函数,你可以了解一下。

  库中提供的发送函数都是同步阻塞的,即等待硬件组件把数据全部发送完,函数才返回。这里的“同步”与刚才的“异步总线”所指是不同的。关于“同步”与“异步”、“阻塞”与“非阻塞”的概念,可以参考:怎样理解阻塞非阻塞与同步异步的区别?

  不难计算,总线发送一个字节的时间是几千个CPU周期,CPU会浪费大量时间在无用的等待上。这个问题直到我们讲到中断才会解决(也许我会把它封装起来放进库)。

  我们来写一个用串口发送按键与拨动开关信息的程序。如果你会相关的C#编程,就可以让电脑响应按键事件。

  程序首先将UART初始化为发送模式(UART_TX),然后打印start。在间隔一毫秒的循环中(实际上串口发送的时间远长于一毫秒,因为是阻塞的),程序检测每一个按键与开关的动作,如果有则发送相应数据。

  本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

  初学者的), 笔者曾经锁死过三片Atmega16。 不需要靠记忆与查文档,就能配置熔丝位(这也是初学者的) 动手之前:请你一定弄清楚了,你这样改会有什么后果,除非你有很多钱不在乎多锁死几个芯片。三、AVR单片机熔丝位设置对AVR熔丝位的配置是比较细致的工作,用户往往忽视其重要性,或感到不易掌握。下面给出对AVR熔丝位的配置操作时的一些要点和需要注意的相关事项。(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态,“Unprogrammed”表示熔丝状态为“1”();“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程

  红外测温传感器的输出是一个mV级的电压信号,大约在室温下(26℃左右)输出0电压,温度再低就是负电压了。要用单片机检测这样一个小信号,必须进行放大,可一般的单电压运放都不能放大小信号(我曾经过LM324的单电压小信号放大,发现大约在100mV以下,LM324就没有反应了),最常规的解决方案就是使用双电压供电。双电压是个头疼的事情,弄两电压一般来说要使用变压器,还得是双绕组的,全桥整流,78 79系列IC伺候着。。。看着就不爽! 如果要改用电池供电。。。麻烦啊!于是打算用负压生成电。 负压生成都是一个套,用振荡器产生交流电,然后用电感产生电动势,或者用二极管和电容组成的倍压电。。。既然用了单片机,那么产生交流电

  AVR端口是线伪双向。这也是AVR的一项优势,只是操作时大家注意DDRn就可以了。真正双向端口在模拟时序方面不如伪双向的方便。DDRnPORTnPINn解释:n为端口号:ABCDEDDRn:控制端口是输入还是输出,0为输入,1为输出。个人记忆方法:一比零大所以往外挤,即1为输出,0为输入。PORTn:从引脚输出信号,当DDRn为1时,可以通过PORTn=x等端口操作语句给引脚输出赋值。PINn:从引脚读输入信号,无论DDRn为何值,都可以通过x=PINn获得端口n的外部电平。当引脚配置为输入时,若PORTxn为“1“,上拉电阻将使能。内部上拉电阻的使用在键盘扫描的时候还要说到。端口更详细功能及介绍以

  引 言随着人们生活水平的提高, 各种热水器的使用已相当普及, 与之相配套的控制仪也相继问世。然而, 目前市场上的各种热水器控制电还与理想要求相差甚远。消费者需要真正的全自动 控制, 以实现使用的最简单化, 就像家用电视机、电冰箱一样, 接通电源、设定完毕就不用再操心了。鉴于国内太阳能热水器市场不断扩大, 而与其相配套的控制器却急需改进的情况, 研制了这套太阳能热水器控制器。本文设计的太阳能热水器是以AVR Meg a 32单片机为检测控制核心,不仅实现了温度、水位两种参数的实时显示功能, 而且具有温度设定与控制功能。控制器可以根据天气情况利用辅助加热装置使蓄水箱内的水温达到预先设定的温度, 从而达到24 小时供应热水

  AVR的主要特性高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能的重要指标,也是单片机占领市场、赖以的必要条件。早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因,所以采取稳妥方案:即采用较高的分频系数对时钟分频,使得指令周期长,执行速度慢。以后的 CMOS单片机虽然采用提高时钟频率和缩小分频系数等措施,但这种状态并未被彻底改观(51以及51兼容)。此间虽有某些精简指令集单片机(RISC)问世,但依然沿袭对时钟分频的作法。AVR单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单位,将内容丰富的操作数与操作

  一、常规方法AVR单片机的各类教材或编程应用,对介绍的端口位操作方法不外乎宏定义及整体和某个常量相或、相与来实现某一单个位状态的改变。如:PORT&=-(1《1);等价于:PORTB&=oxfd;作用是PB1清零而其余位不变。与之类似的还有:PORTBl=(1《4);PB4置位,其余位不变。PORTB=(k《4);PB4翻转,其余位不变。上述方法,无论是常量值参与还是移位操作,用起来总嫌麻烦,不够直观,且具体常量值还需人工推算,易出错。移位操作生成的目标代码偏大,在大量运用时,占用系统内存或flash空间,执行效率低。以实际运用效果来看,宏定义比较好。也偏好运用宏定义。C编译器在编译之前会事先进行宏替换,所以,如果宏定义

  了解ADI电网管理、能源计量方案,答题赢Kindle、《新概念模拟电》【世健的ADI之主题游 能源站】

  【1月14日 技术直播】工程师请就位,Keysight计量专家开讲啦 ~电子仪器计量校准基础知识与校准周期探讨

  有直播:ADI在中国能源互联网应用中的技术及产品 1月8日上午10:00-11:30 准时!

  STM32MP1系列通用型MPU, 集成双 Arm® Cortex®-A7和 Cortex®-M4 内核

  STM32MP1系列通用型MPU, 集成双 Arm® Cortex®-A7和 Cortex®-M4 内核

  站点相关:综合资讯51单片机PIC单片机AVR单片机ARM单片机嵌入式系统汽车电子消费电子数据处理视频教程电子百科其他技术STM32MSP430单片机资源下载单片机习题与教程

      威廉希尔