首页 AVR软件,工具,m16系列基础教程

AVR软件,工具,m16系列基础教程

举报
开通vip

AVR软件,工具,m16系列基础教程 讲座专家:Tensilica 公司中国区代表—— 李冉 【高手坐堂】系列之可配置处理器技术入门专家讲座 活动进行中…… 《复杂SOC设计》免费赠送! 具体活动地址:http://bbs.eeworld.com.cn/thread-66904-1-1.html 【高手坐堂】系列之万人学习 51 单片机!专家:老练 【老练淘宝店】 具体活动地址:http://bbs.eeworld.com.cn/thread-66169-1-1.html 【高手坐堂】系列之让我们学学AVR! 专家:老练 【老练淘宝店】...

AVR软件,工具,m16系列基础教程
讲座专家:Tensilica 公司中国区代表—— 李冉 【高手坐堂】系列之可配置处理器技术入门专家讲座 活动进行中…… 《复杂SOC设计》免费赠送! 具体活动地址:http://bbs.eeworld.com.cn/thread-66904-1-1.html 【高手坐堂】系列之万人学习 51 单片机!专家:老练 【老练淘宝店】 具体活动地址:http://bbs.eeworld.com.cn/thread-66169-1-1.html 【高手坐堂】系列之让我们学学AVR! 专家:老练 【老练淘宝店】 具体活动地址:http://bbs.eeworld.com.cn/thread-66668-1-1.html AVR 讲座: 第一讲:AVR 软件、工具、m16 的基础知识 第一步 安装 ICCAVR 第二步 安装 stdio 第三步 介绍 avr c 语言的语法 1、一个简单的 AVR 程序 #include #include void main() { PORTA = 0x0F; //给 PA 口赋值,让 PA 口低四位为 1,高四位为 0 while(1) ; } 本程序的作用是把 PA 口的值设为 0x0F。 a、程序中以#号开头的语句#include 是包含特定的头文件,叫预处 理指令,iom16v 表示使用的是 mega16,macros.h 包含了必须的 avr 操作命令。 b、C 语言的程序是由函数构成的,如上面的那个 void main(),前面的 void 表 明函数没有返回值。每一个 c 程序里面里有且只有一个 main()函数,系统启动 后就从 main()开始运行。 c、函数内部的内容以大括号“{”和"}"扩起来,每句语句用分号“;”结束, 若分号前面没有内容,编译之后也无任何操作语句。 d、C 程序中可以加入一些说明文字,单行以双斜扛“//”开始,如果是多行, 就用"/*"开始,以“*/”结束,如 /*注释 */ 。 e、函数可以有参数,一律放在小括号内。 f、利用 C语言可以轻松的对AVR的设备组件进行操作,如程序中的PORTA = 0x0F; g、任何一个 AVR C 程序都必须是一个无限循环,否则程序会沿着程序存储区一 直运行,直至溢出程序存储区,程序从头运行。 2、AVR C 语言的基本字符、标识符和关键字 avr c 语言和普通 c语言一样,基本字符有阿拉伯数字 0~9;大小写拉丁字母 a~ z和 A~Z;一些选定的可打印字符,如"~!@#¥%^&*()_-+={} [],.;<>/?|\";空格符、换行符和制表符这三种空白符起到分割成 分和编排格式的作用。 对系统对象命名,称为标识符。标识符由数字、字母、下划线组合的字符串序列 构成,字母区分大小写。如下都是合法的表示符: AVR_IO PORTA CSR IT0 temp1 注意:不能以数字开头的字符串做标识符。比如 1abc 是不合法的。 C 语言的合法标识符有一部分被编译器保留作为特殊用途,这样的标识符称为关 键字。C语言的关键字有:(以字母先后为序) auto break case char const continue default do double else enum extern float for goto if int long register return short signed sizeof static struct switch typedef union unsigned void volatile while 注意,原则上除关键字外,可以使用任何有效的标识符。但实际上,根据系统不 同,有些特殊标识符具有特殊含义,不应被使用。在 AVR 里,一些端口的名称、 寄存器的名称已经被系统定义,最好不要改变其定义,如 PORTA DDRA TIMASK 等。 3、数据类型 C 语言严格 规定 关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定 数据类型,AVR 资源有限,如果数据类型选用不好,资源很快就 会耗尽。如,尽量不要使用浮点类型的运算,1.2*1.2 的浮点数运算至少要占用 mega16 的百分之十以上的空间。 选择数据类型时需要注意不要操作数据能表示的范围,比如要表示 60000,就不 能用 char,必须用 int。 整数类型的类型名前可加修饰符unsigned和 signed,表示无符号数和有符号数, 其中 unsigned 可以省略,默认表示无符号数,一般来说,尽量使用无符号数可 以节约资源。 以下三种为整数类型: 1、整数类型:一般类型的整型 int,16 位二进制编码,表示的数 0~65536,及 216。有符号类型,signed int 表示范围-32768~32767。 2、长整型类型:长整型(long int)类型的二进制编码是 32 位。有符号的长整 型类型(long)表示范围-231~231-1;无符号的类型(unsigned long)的表 示范围为 0~232-1。 3、超长整数类型:超长整数类型(long long)的二进制编码是 64 位。有符号 的长整型类型(long)表示范围-263~263-1;无符号的类型(unsigned long) 的表示范围为 0~264-1。 以下为实数类型(浮点数类型): 1、单精度浮点数类型:float,用 32 位二进制数表示。 2、双精度浮点数类型:long double,用 64 位二进制数表示。 字符类型和字符串 字符类型的类型名为 char,目前最常用的是 ASCII 字符集,其中字符包扩所有 的大小写字母,数字,常用字符等共计 128 割字符。扩展的 ASCII 字符集包括 256 个字符,字符类型占用一个字节。 一些特殊的字符串的表示方法:以反斜扛加特定字符。如 ' \n ' 回车符; ‘ \" ’ 双引号; ‘ \' ’ 单引号字符; ‘ \\ ’ 反斜杠。 无符号的字符类型: char 表示范围 0~255。 有符号的字符类型: signed char 表示范围-128~127。 第四步 AVR 的特性介绍 高可靠性、功能强、高速度、低功耗和低价位 , 一直是衡量单片机性能的 重要指标,也是单片机占领场、赖以生存的必要条件。 早期单片机主要由于工艺及设计水平不高、功耗高和抗干扰性能差等原因, 所以采取稳妥 方案 气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载 :即采用较高的分频系数对时钟分频,使得指令周期长,执行 速度慢。以后的 CMOS 单片机虽然采用提高时钟频率和缩小分频系数等 措施 《全国民用建筑工程设计技术措施》规划•建筑•景观全国民用建筑工程设计技术措施》规划•建筑•景观软件质量保证措施下载工地伤害及预防措施下载关于贯彻落实的具体措施 ,但 这种状态并未被彻底改观(51 以及 51 兼容)。此间虽有某些精简指令集单片机 (RISC)问世,但依然沿袭对时钟分频的作法。 AVR 单片机的推出,彻底打破这种旧设计格局,废除了机器周期,抛弃复杂 指令计算机(CISC)追求指令完备的做法;采用精简指令集,以字作为指令长度单 位,将内容丰富的操作数与操作码安排在一字之中(指令集中占大多数的单周期 指令都是如此),取指周期短,又可预取指令,实现流水作业,故可高速执行指 令。当然这种速度上的升跃,是以高可靠性为其后盾的。 AVR 单片机硬件结构采取 8位机与 16 位机的折中策略,即采用局部寄存器 存堆(32 个寄存器文件)和单体高速输入/输出的方案(即输入捕获寄存器、输出 比较匹配寄存器及相应控制逻辑)。提高了指令执行速度(1Mips/MHz),克服了瓶 颈现象,增强了功能;同时又减少了对外设管理的开销,相对简化了硬件结构, 降低了成本。故 AVR 单片机在软/硬件开销、速度、性能和成本诸多方面取得了 优化平衡,是高性价比的单片机。 AVR 单片机内嵌高质量的 Flash 程序存储器,擦写方便,支持 ISP 和 IAP, 便于产品的调试、开发、生产、更新。内嵌长寿命的 EEProm 可长期保存关键数 据,避免断电丢失。片内大容量的 RAM 不仅能满足一般场合的使用,同时也更有 效的支持使用高级语言开发系统程序,并可像 MCS-51 单片机那样扩展外部 RAM。 AVR 单片机的 I/O 线全部带可设置的上拉电阻、可单独设定为输入/输出、 可设定(初始)高阻输入、驱动能力强(可省去功率驱动器件)等特性,使的得 I/O 口资源灵活、功能强大、可充分利用。 AVR 单片机片内具备多种独立的时钟分频器,分别供 URAT、I2C、SPI 使用。 其中与 8/16 位定时器配合的具有多达 10 位的预分频器,可通过软件设定分频 系数提供多种档次的定时时间。AVR 单片机独有的“以定时器/计数器(单)双 向计数形成三角波,再与输出比较匹配寄存器配合,生成占空比可变、频率可变、 相位可变方波的设计方法(即脉宽调制输出 PWM)”更是令人耳目一新。 增强性的高速同/异步串口,具有硬件产生校验码、硬件检测和校验侦错、 两级接收缓冲、波特率自动调整定位(接收时)、屏蔽数据帧等功能,提高了通 信的可靠性,方便程序编写,更便于组成分布式网络和实现多机通信系统的复杂 应用,串口功能大大超过 MCS-51/96 单片机的串口,加之 AVR 单片机高速,中断 服务时间短,故可实现高波特率通讯。 面向字节的高速硬件串行接口 TWI、SPI。TWI 与 I2C 接口兼容,具备 ACK 信号硬件发送与识别、地址识别、总线仲裁等功能,能实现主/从机的收/发全部 4种组合的多机通信。SPI 支持主/从机等 4种组合的多机通信。 AVR 单片机有自动上电复位电路、独立的看门狗电路、低电压检测电路 BOD, 多个复位源(自动上下电复位、外部复位、看门狗复位、BOD 复位),可设置的启 动后延时运行程序,增强了嵌入式系统的可靠性。 AVR 单片机具有多种省电休眠模式,且可宽电压运行(5-2.7V),抗干扰能 力强,可降低一般 8位机中的软件抗干扰设计工作量和硬件的使用量。 AVR 单片机技术体现了单片机集多种器件(包括 FLASH 程序存储器、看门狗、 EEPROM、同/异步串行口、TWI、SPI、A/D 模数转换器、定时器/计数器等)和多 种功能(增强可靠性的复位系统、降低功耗抗干扰的休眠模式、品种多门类全的 中断系统、具输入捕获和比较匹配输出等多样化功能的定时器/计数器、具替换 功能的 I/O 端口…… )于一身,充分体现了单片机技术的从“片自为战”向“片 上系统 SoC”过渡的发展方向。 综上所述,AVR 单片机博采众长,又具独特技术,不愧为 8位机中的佼佼者。 第二讲 M16 IO 口的使用方法 我们使用的是 mega16 芯片,在使用之前,我们首先要做的就是将最小系统构建好。 复位电路,由于 mega16 是低电平复位。 如下图所示 在这个电路里面,当 mega16 单片机进行工作的时候,我们可以使用按键给单片机系统进行 手动复位。 晶振电路: 在这个电路里面,我们采用了,7.3728Mhz 的晶振,方便我们进行串口实验。 模拟电压和参考电压: 这个地方 在模拟电压和数字电压之间我们使用一个电感隔离一下。 ISP 下载电路: MOSI 对应的是 PB5 SCK 对应的是 PB7 MISO 对应的是 PB6 JTAG 仿真电路: 这里: TCK 对应的是 PC2 TDO 对应的是 PC4 TMS 对应的是 PC3 TDI 对应的是 PC5 按照这个进行连接,我们就可以让 mega16 进行工作了。 下面我们可以结合 ICCAVR 软件进行学习 io 的使用了 我们先看看硬件电路上面如何连接: 硬件对应的 io 接口 LED0-------------------PA6 LED1-------------------PA7 LED2-------------------PC0 LED3-------------------PC1 LED4-------------------PC6 LED5-------------------PC7 现在我们先熟悉一下 ICCAVR 软件吧,安装好以后并 crack 以后,我们可以看见如下的图标: 我们双击便可以打开界面,如果看见 ,这个样子就表示 crack 成功,如果 没有成功,请重新 crack 一下。 打开软件后,我们先建立一个工程, -Ænew,然后我们可以根据需要进行设置路 径和项目名称。然后在 --Æoption,选择器件。如下图所示: 现在一个工程就建立好了,然后我们就要进行 mega16 单片机设置了。 选择界面上的 ,这个操作,我们就可以看见一个配置界面。 选择好目标 cpu 和晶振以后,我们就可以选择 PORTS 了。点击 PORTS,然后我们看到如下 的界面: 因为我们使用的 io 口为 PA6 和 PA7,那么,我们要做如下的设置 在 Port A 口上面设置 io 输出,并且是高电平输出。 我们现在就可以点击 ok 了。 此时界面上出现如下的程序: //ICC-AVR application builder : 2008-10-9 8:12:38 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习 io的程序 #include #include void port_init(void) { PORTA = 0xC0; DDRA = 0xC0; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... } 然后我们进行手工添加部分程序,将这个程序编写完整就可以了,具体程序如下: //ICC-AVR application builder : 2008-10-9 8:12:38 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习 io的程序 #include #include void DELAY() //ÑÓʱ×Ó³ÌÐò { usnigned int i; for(i=0;i<50000;i++) { ; } } void port_init(void) { PORTA = 0xC0; DDRA = 0xC0; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... while(1) { PORTA = 0xC0; DELAY(); PORTA = 0x80; DELAY(); PORTA = 0x00; DELAY(); } } 现在我们编好程序了,然后添加到项目中去,进行编译,点击 ,这个图标就可以进行 直接编译了。 下面,我们进行在 avr stdio中使用软件仿真,可以看出 io的变化。 先点击 avrstdio的图标 进行启动软件。 出现如下界面: 我们在 OPEN 中打开刚才所建立的文件,如下图: 选择.cof 文件打开即可,此时,我们看到打开后的界面。 然后点击 finish 按键,然后我们可以选择如下图的 io 设置,这样我们就能看清楚 io 的变化 了。 并且,我们点击 ,用来设置断点,以方便观测 io 变化。 现在我们运行一下程序,点击 ,就会发现如下图所示: 继续点击全速运行图标,或者按键 F5,就会出现如下: 此时 io 上面的一个 led 应该会被点亮。我们继续按 F5,就会出现如下: 此时两个灯都被点亮了,然后取消断点,全速运行就可以了。 第三讲 外部中断的使用 我们先看看 Mega16 单片机的外部中断的引脚和接口。如下图所示: 我们可以看到 PD2 是接在外部中断 0 上面的,现在我们在这个地方接一个按键,用来表示 进入外部中断,同时点亮 LED0,LED 的电路图如下所示。 硬件对应的 io 接口 LED0-------------------PA6 LED1-------------------PA7 LED2-------------------PC0 LED3-------------------PC1 LED4-------------------PC6 LED5-------------------PC7 在这里我们只要对 KEY1 进行编程,然后使用按键操作,在 stdio 里面设置断点就可以了, 在程序里面就能看到中断的情况了。还是老规矩,打开 iccavr,我们先建立项目,选择芯片, 同时选择目标芯片,如图所示: 设置晶振,如下图所示。 此时,我们设置 PORTD2 为内部上拉。点击 ports 按键如下设置: 然后点击 ok 出现如下程序: //ICC-AVR application builder : 2008-10-10 10:14:11 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习外部中断 0的程序 #include #include void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00; } #pragma interrupt_handler int0_isr:2 void int0_isr(void) { //external interupt on INT0 } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } 现在我们可以进行修改程序,在中断程序里面,我们可以修改成中断一次,给 LED0 取反一 次。 //ICC-AVR application builder : 2008-10-10 10:22:56 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习外部中断 0的程序 #include #include #define LED_COM PORTA ^= (1 << PA6) // void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x04; DDRD = 0x00; } #pragma interrupt_handler int0_isr:2 void int0_isr(void) { LED_COM; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); MCUCR = 0x00; GICR = 0x40; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } void main() { init_devices(); while(1) { ; } } 编译后,在 avrstdio 中使用软件仿真可以看到如下结果: 先设置断点 将 PORTD 口如下设置: 点击全速运行可以看见如下 2 个结果: 这个是 LED0 点亮的状态 这个是 LED0 熄灭的状态。 第四讲 定时器的使用 定时器我们在中断里面也讲过了,就是在定时一个时间周期的时候进入中断来处理中断程 序,可以作为计时、计数、扫描等用途。 同样的,在今天的这一讲里面,我们要做的是,还是采用设置断点的方式对 LED0 进行处理, 因为我们的硬件平台还没有做好,所以目前只能这么将就着,但是原理都是一样的。 首先,我们还是老规矩,建立一个工程。 1、 打开 iccavr 软件,新建一个工程。 如图所示: 工程建好以后,下面我们就开始选择目标器件,在 option 里面选择 mega16。 如图所示: 然后点击 OK,选择 图标开始配置器件。 出现下图所示: 我们按照如上图配置好以后,选择 PORTS,就出现了如下的界面: 这次我们选择 TIMER0 进行操作,则会出现如下的界面: 按照上图设置好以后,我们按下 ok 就会出现如下的程序: //ICC-AVR application builder : 2008-10-11 7:38:57 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习定时中断 0的程序 #include #include void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //TIMER0 initialize - prescale:1024 // WGM: Normal // desired value: 10mSec // actual value: 9.861mSec (1.4%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0xB9; //set count OCR0 = 0x47; //set compare TCCR0 = 0x05; //start timer } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0 = 0xB9; //reload counter value } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x01; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... } 将程序按照我们的要求进行修改,那么就会出现以下的程序: //ICC-AVR application builder : 2008-10-11 7:38:57 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习定时中断 0的程序 #include #include #define LED0_CPL PORTA ^= (1 << PA6) void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //TIMER0 initialize - prescale:1024 // WGM: Normal // desired value: 10mSec // actual value: 9.861mSec (1.4%) void timer0_init(void) { TCCR0 = 0x00; //stop TCNT0 = 0xB9; //set count OCR0 = 0x47; //set compare TCCR0 = 0x05; //start timer } #pragma interrupt_handler timer0_ovf_isr:10 void timer0_ovf_isr(void) { TCNT0 = 0xB9; //reload counter value LED0_CPL; } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); timer0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x01; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... while(1) { ; } } 在 avrstdio 里面设置断点,如图所示: 此时 我们按下 F5,全速运行,那么,我们就会看到在断点处如图所示: 然后再按下 F5,就会继续出现如下图: 此时,我们可以看出定时中断的功能就完全实现了。 此程序仅仅是用来调试使用,并不能用来进行 LED0 的点亮,因为眼睛有个视觉暂留的特性, 所以使用这个程序的 LED0 会一直亮的。 第五讲:串口中断的使用 这一讲主要讲串口中断的使用,由于是软件模拟,我们也仅仅是讲一下原理,具体调试过程 等板子到了以后就可以上传了。 首先,我们先建立工程,并选择器件,如图所示: 点击 OK,然后点击 ,出现如下界面: 下面设置 io 口,选择如下: 下面进入 UART 设置,设置如下: 点击 OK,则出现如下程序: //ICC-AVR application builder : 2008-10-11 8:08:07 // Target : M16 // Crystal: 7.3728Mhz // 作者:南京华岳电子 练祥华 // 功能:学习串口中断的程序 #include #include void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x2F; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0xD8; } #pragma interrupt_handler uart0_rx_isr:12 void uart0_rx_isr(void) { //uart has received a character in UDR } #pragma interrupt_handler uart0_tx_isr:14 void uart0_tx_isr(void) { //character has been transmitted } //call this routine to initialize all peripherals void init_devices(void) { //stop errant interrupts until set up CLI(); //disable all interrupts port_init(); uart0_init(); MCUCR = 0x00; GICR = 0x00; TIMSK = 0x00; //timer interrupt sources SEI(); //re-enable interrupts //all peripherals are now initialized } // void main(void) { init_devices(); //insert your functional code here... } 我们在程序中添加我们要求的程序,程序如下: //ICC-AVR application builder : 2008-10-11 8:08:07 // Target : M16 // Crystal: 7.3728Mhz #include #include unsigned char DATA1,DATA2; void port_init(void) { PORTA = 0x40; DDRA = 0x40; PORTB = 0x00; DDRB = 0x00; PORTC = 0x00; //m103 output only DDRC = 0x00; PORTD = 0x00; DDRD = 0x00; } //UART0 initialize // desired baud rate: 9600 // actual: baud rate:9600 (0.0%) // char size: 8 bit // parity: Disabled void uart0_init(void) { UCSRB = 0x00; //disable while setting baud rate UCSRA = 0x00; UCSRC = BIT(URSEL) | 0x06; UBRRL = 0x2F; //set baud rate lo UBRRH = 0x00; //set baud rate hi UCSRB = 0xD8; } #pragma interrupt_handler uart0_rx_isr:12 void uart0_rx_isr(void) { //uart has received a character in UDR DATA2=DATA1; DATA1=UDR; } #pragma interrupt_handler uart0_tx_isr:14 void uart0_tx_isr(void) { //character has been transmitted } void USART0_Transmit(unsigned char data) { while(!(UCSRA&(1<
本文档为【AVR软件,工具,m16系列基础教程】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_267594
暂无简介~
格式:pdf
大小:506KB
软件:PDF阅读器
页数:0
分类:互联网
上传时间:2011-05-16
浏览量:15