ImageVerifierCode 换一换
格式:DOCX , 页数:11 ,大小:275.80KB ,
资源ID:4883348      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/4883348.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(AVR单片机串口USART与PC通讯实例和中断程序分析.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

AVR单片机串口USART与PC通讯实例和中断程序分析.docx

1、AVR单片机串口USART与PC通讯实例和中断程序分析“并行”通讯:是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,数据也就容易出错。“串行”通讯:形容一下就是一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。但是并不是并口快,由于8位通道之间的互相干扰。传输时速度就受到了限制。而且当传输出错时,要同时重新传8个位的数据。串口没有干扰,传输重发一位就可以了。所以要比并口快。串行通讯协议较多,单片机常用的有USART,SPI,TWI,1-Wire 等。串行通讯有分为同步和异步通讯:通俗讲同步就是你叫我去吃饭,

2、我听到了就和你去吃饭;如果没有听到,你就不停的叫,直到我告诉你听到了,才一起去吃饭。异步就是你叫我,然后自己去吃饭,我得到消息后可能立即走,也可能等到下班才去吃饭。同步通讯:收信发信双方在使用同步时钟,在同一时刻传输线上的数据就是要传输的信息。异步通讯:以字符为传输单位,字符与字符之间是异步的,而字符的位是同步的USART:异步串行通讯,常用与单片机和单片机,单片机和PC电脑间的数据传输。波特率:表征通讯速度的参数,单位是位/秒(b/s),即每秒钟传输的二进制位数,如波特率9600,表示每秒钟传输9600个二进制位数据。收发双方必须采用同样的波特率。波特率不同将无法正常通讯。 全双工通讯:指是

3、的是可以同时发送和接收数据。半双工通讯:指的是在同一时刻只能发送或只能接收数据。单片机与PC通讯的电平转换:单片机的电压一般是TTL电平,电压0v-5v,PC机串口采用的是RS-232协议,它的的电压范围是-15-+15v,电平不同,无法通讯。要实现通讯,必须进行电平和逻辑关系的转换, 一般用MAX232集成芯片进行电平的转换。ATmega16 串口结构:有一个全双工的串行口,有两条通讯线,TXD:数据发送线,RXD:数据接收线,对应的单片机外部引脚为PD1,PD0相关寄存器:UDR 串口数据寄存器, UCSRA串口控制与状态寄存器A UCSRB串口控制与状态寄存器BUCSRC 串口控制与状态

4、寄存器CUBRRH,UBRRL 波特率寄存器发生器对波特率发生器的输出时钟进行2、8或16 的分频,具体情况取决于工作模式,如下图:如:系统时钟频率f=8MHZ,异步正常模式(16分频),波特率9600 则: UBRR=8000000/16*9600-1=52-1=51; 波特率寄存器赋值:UBRRH=0; UBRRL=51;/*10进制写法*/,或者UBRRH=0;UBRRL=0x33;/*16进制写法*/操作步骤:一、设置异步模式: UCSRC|=(1URSEL)|(1URMEL); /UCSRC和UBRRH寄存器共用一个地址,写UCSRC时,URSEL应置1 二、设置数据帧格式:8位数据

5、位,一位停止位,UCSRC|=(1URSEL)|(1UCSZ1)|(1UCSZ0); 三、设置波特率寄存器: UBRRL=51;UBRRH=0; 四、使能发送接收: UCSRB|=(1TXEN)|(1RXEN);五、中断总使能:;/函数功能:通过PC 串口向单片发送数据,单片机接收数据后,送到PA口显示,再送回到PC机#include#include#define fosc 8000000 /晶振8MHZ#define baud 9600 /波特率定义/*端口初始化函数*/void init(void)PORTA = 0xFF; /PA口输出高电平DDRA = 0xFF;/PA口设置为输出PO

6、RTD = 0X00; /USART的发送接收端口分别为PD0和PD1DDRD|=(1PD1); /PD0为接收端口置为输入;PD1为发送端口置为输出/*串口初始化函数*/void uart_init(void) UCSRB = 0x00;UCSRA = 0x00;UCSRC |= (1URSEL)|(1 UCSZ1)|(1 UCSZ0); /异步,数据格式8,N,1/UCSRC寄存器与UBRRH寄存器共用相同的I/O地址,写 UCSRC时,URSEL应设置为1。UBRRL=51; /设置波特率寄存器 10进制的写法UBRRH=0;UCSRB |= (1 TXEN)|(1 RXEN); /发送

7、接收使能/*发送数据函数*/void send(unsigned char i)while(!(UCSRA&(1UDRE); /只有数据寄存器为空时才能发送数据UDR=i;/*以下是接收数据函数*/unsigned char receive(void) while(!(UCSRA&(1RXC);/等待接收完成return UDR;/*主函数*/void main(void) unsigned char temp;init();uart_init();while(1) temp=receive(); /接收数据 PORTA=temp; /将接收的数据取反后送PA口显示 send(temp); /

8、向PC机发送数据1. 范例描述 按下按键0,LED0亮。直到松手,其他按键才能起作用 按下按键1,LED1亮。其他按键随时都能起作用 按下按键2,LED0/1都熄灭。直到松手,其他按键才能起作用2. 电路图设计 :.4. 代码设计与说明 :本程序简单的示范了如何使用ATMEGA16的外部中断 中断的设置 按键的简单延时防抖动 中断的嵌套 变量在中断中的应用-如果变量会在中断服务程序中被修改,须加volatile限定 本范例可直接使出厂状态的新M16芯片,无需对芯片的熔丝位进行配置。出于简化程序考虑,各种数据没有对外输出,学习时建议使用JTAG ICE硬件仿真器 关于外部中断作唤醒源的条件:(将

9、会在后面的电源管理和睡眠模式范例中应用) 而INT0和INT1的边沿触发中断只能在 空闲模式起作用,即 CLKI/O不停止 INT0和INT1的低电平中断,INT2在各种睡眠模式下都可以,因为这几种中断工作 于异步模式,不需要时钟驱动官方的M16中文手册对外部中断的描叙存在多处错误,请参考英文原版。*/#include #include #include #include /*宏INTERRUPT 的用法与SIGNAL 类似,区别在于SIGNAL 执行时全局中断触发位被清除、其他中断被禁止INTERRUPT 执行时全局中断触发位被置位、其他中断可嵌套执行中断服务程序的编写具有一定的格式,在不同

10、编译环境下各不相同,在WINAVR(GCC)环境下有两种方式,分别是:第一种中断服务程序的编写格式:SIGNAL(中断向量名) /中断服务程序内容 第一种中断服务程序的编写格式: ISR(中断向量名 ) /中断服务程序内容 在这两种方式中,需要分别添加头文件:#include 和#include 。另外avr-libc 提供两个API 函数用于置位和清零全局中断触发位,它们是经常用到的。分别是:void sei(void) 和void cli(void) 由interrupt.h定义 */注: 内部函数_delay_ms() 最高延时 262.144mS1MHz/* 该函数可以实现较精确的定时

11、,但用JTAG仿真时较麻烦-会进入机器码窗口(Disassembeler).注意跳开该语段。一旦JTAG仿真进入该内部函数语句,会变得像死机一样(其实在运行中),可以先break,然后在后面的C语句设breakpoint,RUN跳过*/ for()/while()语句计算延时时间较麻烦。/ 为了使 _delay_ms()函数的延时正确,须在makefile中设定F_CPU为实际的系统时钟频/ 本范例为1MHz内部RC振荡器 即 F_CPU=1000000 /*C:WinAVRavrincludeavr目录包括所有芯片的定义和其他头文件其中iom16.h 定义ATMEGA16芯片的特性(中断向量

12、,寄存器,位定义.)包括下面中断服务程序的常量 SIG_INTERRUPTx ,PORTx,GICR.*/管脚定义#define EXT_INT0 2 /PD2 按键0#define EXT_INT1 3 /PD3 按键1#define EXT_INT2 2 /PB2 按键2#define LED0 0 /PB0#define LED1 1 /PB1#define LED2 3 /PB3/宏定义#define LED0_ON() PORTB|= (1LED0) /输出高电平,灯亮#define LED0_OFF() PORTB&=(1LED0) /输出低电平,灯灭#define LED1_ON

13、() PORTB|= (1LED1)#define LED1_OFF() PORTB&=(1LED1)#define LED2_ON() PORTB|= (1LED2)#define LED2_OFF() PORTB&=(1LED2)/51系列的高电平输出能力很弱,低电平也仅能点亮LED.所以常见输出低电平才灯亮的接法。/AVR芯片的高低驱动能力都很强,甚至能推动8字数码管的公共极,怎么接都没问题。/全局变量#define has_volatile 1 /这里是条件编译/可以修改has_volatile=1或0来看程序运行的效果#if has_volatile volatile unsigne

14、d char FLAG; /全局变量,会在中断服务程序中被修改,须加volatile限定#elseunsigned char FLAG; /全局变量.#endif/仿真时在watch窗口,监控这些变量。SIGNAL(SIG_INTERRUPT0) /INT0中断服务程序 /硬件自动清除INTF0标志位 _delay_ms(10); /延时 if (PIND&(1EXT_INT0)=0) /重复检测,防抖动 LED0_ON(); /点亮LED0 loop_until_bit_is_set(PIND,EXT_INT0); /等待按键释放(变为高电平) _delay_ms(10); /延时 按键释放

15、时也会抖动。 / 即使同时发生其它的中断事件,如果在这里把相应的中断标志位清除,那么该中断将 不能触发进入中断服务/* 注意 读端口用 PINx 写端口用 PORTx */INTERRUPT(SIG_INTERRUPT1) /INT1中断服务程序/硬件自动清除INTF1标志位 /这里全局中断被打开,将允许其他中断嵌套执行 _delay_ms(10); if (PIND&(1EXT_INT1)=0) LED1_ON(); /点亮LED1 loop_until_bit_is_set(PIND,EXT_INT1); _delay_ms(10);SIGNAL(SIG_INTERRUPT2) /INT2

16、中断服务程序/硬件自动清除INTF2标志位 _delay_ms(10); if (PINB&(1EXT_INT2)=0) LED0_OFF(); /熄灭LED0 LED1_OFF(); /熄灭LED1 loop_until_bit_is_set(PINB,EXT_INT2); FLAG=!FLAG; /修改全局变量 _delay_ms(100);int main(void) /上电默认DDRx=0x00,PORTx=0x00 输入,无上拉电阻 PORTA =0xFF; /不用的管脚使能内部上拉电阻。 PORTC =0xFF; PORTD =0xFF; DDRB = (1LED2)|(1LED1

17、)|(1LED0); /输出 PORTB =(1LED2)|(1LED1)|(1LED0); /低电平,灯灭/外部中断INT0,1,2 做按键输入,使能内部上拉,就可以不用外接电阻了 MCUCR=(1ISC11)|(0ISC10)|(1ISC01)|(0ISC00); /注意该寄存器有多个功能/* ISCx1:0=00 INTx引脚为低电平时产生中断请求 ISCx1:0=01 INTx引脚上任意的逻辑电平变化都将引发中断 ISCx1:0=10 INTx引脚的下降沿产生中断请求 ISCx1:0=11 INTx引脚的上升沿产生中断请求 MCUCSR&=(1ISC2); /注意该寄存器有多个功能 /

18、* ISC2=0 INT2引脚的下降沿产生异步中断请求 ISC2=1 INT2引脚的上升沿产生异步中断请求GIFR=(1INTF1)|(1INTF0)|(1INTF2);/写1清除标志位,在使能中断前最好先把对应的标志位清除,以免误触发GICR=(1INT1)|(1INT0)|(1INT2); /使能三个外部中断 FLAG=0; sei(); /使能全局中断 while (1) while (FLAG=0); LED2_ON(); /如果FLAG不加volatile限定(即has_volatile=0), /程序将永远都运行不到这里。 while (FLAG!=0); LED2_OFF(); 程序运行效果 按下按键0,LED0亮。直到松手,其他按键才能起作用 按下按键1,LED1亮。其他按键随时都能起作用 按下按键2,LED0/1都熄灭。直到松手,其他按键才能起作用 LED2是根据按键2的顺序来亮灭,松手后变换,前提是FLAG加了volatile限定 */

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1