AVR常用头文件
AVR编译器及SL ISP(双龙电子)AVR MCU烧录程序使用要点
一.编译程序安装:WinA VR-20060421-install.exe双击桌面上的:Programmers Notepad [WinA VR]图标,启动程序。
1.选择:File/New/Prpject/输入你欲建立的文件夹名及欲放置的位置。
(在Name栏输入你欲建立的文件夹名(如“wenjiam”),在folder栏输入你欲放置该文件夹的位置),点击OK后就会在该位置产生一个文件夹。
并在窗口的左边显示出来。
2.右击新建立的文件夹(如“wenjiam”),选择Add New Folder。
就会产生一个子文件夹,并将其改名为普遍使用的头文件夹名:“inc”。
右击“inc”文件夹,选择Add Files导入你的头文件。
另外再产生一个放c文件的文件夹并改名为:“c”。
右击“c”文件夹,选择Add Files导入你的c文件。
双击c文件即可打开编辑。
3.双击桌面上的“MFile [WinA VR]”图标。
选择makefile/make file name…/在makefile栏里输入“main”。
然后点击“OK”,在窗口里会产生一句话:“TARGET = main”。
再选择makefile/MCU type,选择你需要的MCU型号。
选择File/Save as/使用默认文件名“Makefile”保存文件(一般叫“链接文件”)到你已建立的文件夹里。
在Programmers Notepad [WinA VR]程序里的“c”文件夹里导入刚刚建立的“Makefile”文件。
双击“Makefile”文件,修改里面的参数:在“SRC =”后面加入已导入的所有c文件名,每个文件名之间用空格隔离,并保存文件。
(其中F_CPU = 8000000是CPU的主频率4;FORMA T = ihex是编译后的目标文件格式,此句为:.hex文件;TARGET = main是目标文件名。
这几句在做“Makefile”时已选好,此处不用修改),)4.选择主菜单的Tools/Make all即可编译该文件。
AVR的示例
A VR的示例1、矩阵键盘扫描的应用如果按键多的话,为节省I/O口资源,我们一般采用矩阵方式接口。
矩阵键盘由行和列组成,每个按键都有行值和列值,行值和列值的组合就是识别每个按键的编码。
确定哪个按键的流程是:先在行和列的一个口中输出高电平,在另一个行和列口读取扫描码;然后在后一个行列口输出高电平,在前一个行列口,读取第二个扫描码,然后查表就可以确定哪个按键按下了。
下面为我们的编程示例:/*功能:矩阵键盘扫描的应用CPU: ATMEGA8晶振:8MHZ */#include <iom8v.h>#include "Delay.h"//按键扫描函数,返回按键的值unsigned char ScanKey(void){unsigned char temp,temp1,key;temp=PINC; //读C口temp &=0x07;switch(temp) //判断行中哪条线有低电平{case 0x06: //PC0口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x01; //得到键值break;case 0x28:key=0x02; //得到键值break;case 0x18;key=0x03; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;case 0x05: //PC1口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x04; //得到键值break;case 0x28:key=0x05; //得到键值break;case 0x18;key=0x06; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;case 0x03: //PC2口有低电平DDRC=0X07; //PC0~PC2设为输出,PC3~PC5设为输入PORTC=0x38; //PC0~PC2输出0,PC3~PC5为1delay_us(1;);temp1=PINC; //读C口temp1 &=0x38;switch(temp1) //判断行中哪条线有低电平{case 0x30:key=0x07; //得到键值break;case 0x28:key=0x08; //得到键值break;case 0x18;key=0x09; //得到键值break;default:key=0;break;}DDRC=0x38;PORTC=0x07;break;default:key=0;break;}return (key);}//主函数,扫描按键显示数据void main(){unsigned char temp,keynum;unsigned char num[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; //初始化端口DDRB=0xFF; //设置B口为输出口PORTB=oxFF; //置高电平DDRC=0x38;PORTC=0x07;while(1){PORTB=0x40; //按键放开后显示“一”temp=PINC;temp &=0x07;if(temp==0x07) //检测是否有按键按下contune;delay_us(10);temp=PINC;temp &=0x07;if(temp==0x07) //再次检测是否有按键按下,按键防抖contune;keynum=ScanKey();PORTB=num[keynum]; //通过查表在PORTB口显示按键值while(temp!==0x07 ) //等待按键放开{temp=PINC;temp &=0x07;}}}2、中断触发键盘扫描按下任何一个按键就会触发一个中断,然后在中断函数中调用键盘处理函数。
(ATMEGA16.H)AVR的头文件
#define NOP() asm("nop")
#define SLEEP() asm("sleep");
#define _WDR() asm("wdr")
#define _SEI() asm("sei")
#define _CLI() asm("cli")
#define ADMUX (*(volatile unsigned char *)0x27)
//模拟比较器
#define ACSR (*(volatile unsigned char *)0x28)
// 通用同步异步收发机USART
#define UBRRHI (*(volatile unsigned char *)0x40)
#define SPCR (*(volatile unsigned char *)0x2D)
#define SPSR (*(volatile unsigned char *)0x2E)
#define SPDR (*(volatile unsigned char *)0x2F)
//四组输入输出端口PORTA/PORTB/PORTC/PORTD
//定时器计数器T0
#define OCR0 (*(volatile unsigned char *)0x5C)
#define TCNT0 (*(volatile unsigned char *)0x52)
#define TCCR0 (*(volatile unsigned char *)0x53)
AVR-C语言
//lcd1602.h//杨清云 2012-12-29#include <iom16v.h>#include <macros.h>// LCD Driver ST70006-OE//-----------------------------------------------#define uchar unsigned char#define uint unsigned int#define LCM_RS_1 PORTD|=BIT(PD4)#define LCM_RS_0 PORTD&=~BIT(PD4)#define LCM_RW_1 PORTD|=BIT(PD5)#define LCM_RW_0 PORTD&=~BIT(PD5)#define LCM_EN_1 PORTD|=BIT(PD6)#define LCM_EN_0 PORTD&=~BIT(PD6)//======================================#define DataPort PORTB#define Busy 0x80#define xtal 8const uchar str[]={"The Voltage Is:"};//========函数声明=========void Delay_1ms(void);void Delay_nms(uint n);void WaitForEnable(void);void LcdWriteData(uchar W);void LcdWriteCmd(uchar CMD);void DisplayOneChar(uchar Cmd, uchar wData);void DisplayValue(unsigned int Value);/*-------------名称:void DisplayOneChar(uchar Cmd, uchar wData)?参数:uchar Cmd,uchar wData输出:无-------------------*/void DisplayOneChar(uchar Cmd, uchar wData){LcdWriteCmd(Cmd);LcdWriteData(wData);}/*-------------名称:void DisplayValue(unsigned int Value)参数:unsigned int Value输出:无-------------------*/void DisplayValue(unsigned int Value){uchar Val[4];uchar i=0;Val[3]=(uchar)(Value/1000);//将数据转换为BCD码的千位Val[3]=Val[3]+0x30;//将BCD码转换为ASCII码Val[2]=(uchar)(Value%1000/100);//将数据转换为BCD码的百位Val[2]=Val[2]+0x30;//将BCD码转换为ASCII码Val[1]=(uchar)(Value%1000%100/10);//将数据转换为BCD码的十位 Val[1]=Val[1]+0x30;//将BCD码转换为ASCII码Val[0]=(uchar)(Value%1000%100%10);//将数据转换为BCD码的个位 Val[0]=Val[0]+0x30;//将BCD码转换为ASCII码LcdWriteCmd(0x80);for(i=0;i<15;i++){LcdWriteData(str[i]);//显示字符串}DisplayOneChar(0xCb,'V');//显示电压单位VDisplayOneChar(0xCA,Val[0]);//显示千分位DisplayOneChar(0xC9,Val[1]);//显示百分位DisplayOneChar(0xC8,Val[2]);//显示十分位DisplayOneChar(0xC7,'.');//显示小数点DisplayOneChar(0xC6,Val[3]);//显示整数}//**************LCD初始化***************************/*-------------名称:void InitLcd(void)参数:无输出:无-------------------*/void InitLcd(void){DDRB=0xff;PORTB=0x00;DDRD=0xff;// DDRD|=LCD_RS_1|LCD_RW_1|LCD_EN_1;PORTD=0x00; //PORTD&=~LCD_RS_0|LCD_RW_0|LCD_EN_0;LcdWriteCmd(0x38);Delay_nms(5);LcdWriteCmd(0x38);Delay_nms(5);LcdWriteCmd(0x38);Delay_nms(5);LcdWriteCmd(0x38);LcdWriteCmd(0x08);LcdWriteCmd(0x01);LcdWriteCmd(0x06);LcdWriteCmd(0x0c);}//************写命令到LCD**************/*-------------名称:void LcdWriteCmd(uchar CMD)参数:CMD输出:无-------------------*/void LcdWriteCmd(uchar CMD){WaitForEnable();LCM_RS_0;LCM_RW_0;_NOP();DataPort=CMD;_NOP();LCM_EN_1;_NOP();_NOP();LCM_EN_0;}//*************写数据到LCD***************/*-------------名称:void LcdWriteData(uchar dataW)参数:dataW输出:无-------------------*/void LcdWriteData(uchar dataW){WaitForEnable();LCM_RS_1;LCM_RW_0;_NOP();DataPort=dataW;_NOP();LCM_EN_1;_NOP();_NOP();LCM_EN_0;}//*******************检测LCD忙信号子函数********************* /*-------------名称:void WaitForEnable(void)参数:无输出:无-------------------*/void WaitForEnable(void){uchar val;DataPort=0xff;LCM_RS_0;LCM_RW_1;_NOP();LCM_EN_1;_NOP();_NOP();DDRB=0x00;val=PINB;while(val&Busy)val=PINB;LCM_EN_0;DDRB=0xff;}/*-------------名称:void Delay_1ms(void)参数:无输出:无-------------------*/void Delay_1ms(void)//1mS延时子函数{ uint i;for(i=1;i<(uint)(xtal*143-2);i++);}/*-------------名称:void Delay_nms(void)参数:无输出:无-------------------*/void Delay_nms(uint n)//n*1mS延时子函数{uint i=0;while(i<n){Delay_1ms();i++;}}。
avr补充
头文件可是是#include <iom8515v.h> #include <avr/io.h> #include <iom16v.h>等头文件#include <macros.h>可以位操作PORTB = BIT(i) 置位B口的i位PORTB |=1<<5可以表示为B口的第5位置1 其余不变PORTB ^=1<<5 异或表示为把B口的第5位取反其余不变宏定义#define uchar unsigned char #define uint unsigned int位于程序区可以定义flash unsigned int music_data#pragma data:data //设置回到数据存储器区头文件#include <avr/interrupt.h>-----中断。
中断向量:中断名称定义signame 中断类型SIG_INTERRUPT0 外部中断INT0SIG_INTERRUPT1 外部中断INT1SIG_OUTPUT_COMPARE2 定时器/计数器2比较匹配中断SIG_OVERFLOW2 定时器/计数器2 溢出中断SIG_INPUT_CAPTURE1 定时器/计数器1输入捕获中断SIG_OUTPUT_COMPARE1A 定时器/计数器1 比较匹配ASIG_OUTPUT_COMPARE1B 定时器/计数器1 比较匹配BSIG_OVERFLOW1 定时器/计数器1 溢出中断SIG_OVERFLOW0 定时器/计数器0 溢出中断SIG_SPI SPI 操作完成中断SIG_UART_RECV USART 接收完成SIG_UART_DATA USART 寄存器空SIG_UART_TRANS USART 发送完成SIG_ADC ADC 转换完成SIG_EEPROM_READY E2PROM 准备就绪SIG_COMPARATOR 模拟比较器中断SIG_2WIRE_SERIAL TWI 中断SIG_SPM_READY 写程序存储器准备好SIGNAL(SIG_OVERFLOW2){} 表示是定时/计数器2溢出中断口头文件#include<util/delay.h> #define F_CPU 8000000UL 定义时钟频率_delay_ms()执行4个机器周期_delay_us执行3个机器周期前面允许计数溢出后,TCNT1赋予值后,当TCCR1B中CS12 CS11CS10 不为0 则立刻开始计时。
AVR事无巨细系列带书签
事无巨细,AVR学习系列 发布事无巨细,GCC AVR入门详解终于拿到论坛新开的AVR的板子了,虽然只是个样板,自己焊的也很难看,但好歹能用,足够我折腾好些日子了。
希望接下去的短短日子里,能小有收获,即便是最简单的东西也希望跟大家分享。
这是第一篇,我说说AVR的集成开发环境。
也就是常说的IDE(Integrated Development Environment)。
图片比较多,虽然用软件处理过体积,网页可能还是比较慢,还请见谅。
现今世界上的AVR开发环境可以说是百花齐放了,互相当然各有长短,我们看看都有哪些:首当其冲的应该还是IAR,为什么呢,因为当初AVR还在ATMEL胎中酝酿的时候,IAR公司参与了AVR的设计,因此可以认为IAR有更为正统的血液,它最了解AVR,它的编译器编出来的代码应该最优秀。
好比你生的孩子还是你最了解——至少相当长一段时间是这样的。
事实上,IAR for AVR确实展现了这个实力,它的功能确实最为强大,无论是源代码编写还是软件乃至硬件仿真,编译出来的代码也十分优秀。
但是事物总是相对存在的,优点有时就意味着缺点。
IAR功能全面而强悍,代价就是它的软件界面比较复杂,设置选项多,网上的资料也比较少,最要命的是这个软件非常的贵,好吧你说你有破解版,但是破解文件一般并不通用,而且破解方法一般都稍显繁琐。
以上几条,对于新接触AVR的人来说,几乎是迈不过的坎。
接下来是官方的AVR studio,官方出品,但是一般没有人用这个软件来做开发环境,为什么呢,因为它本身不支持C语言,一般我们只用它的仿真功能搭配其他C编译器来用。
第三个,WINAVR,又称GCC AVR。
GCC AVR应该是目前使用率最高的AVR开发环境了,软件体积小,界面简单易用,教程资料很多,代码效率高,最重要的是,它是完全免费的。
但是它几乎没有仿真调试的功能。
所以我首要推荐GCC AVR+AVR studio搭建你的AVR IDE。
AVR自学笔记
RXB8(bit1):接收数据位 8 TXB8(bit0):发送数据位 8 *UCSRC: URSEL(bit7):读 UCSRC 时为 1,写 UCSRC 时为 1(?)(编译器自动处理) UMSEL(bit6):0,异步。1,同步 UPM1~UPM0(bit5、4):奇偶校验模式
USBS(bit3):停止位数选择;0 时,1bit 停止位,1 时,2bit 停止位 UCSZ1~UCSZ0(bit2、1):字符长度设置
一、基础知识 1.开发工具: 编辑与编译软件:WinAVR 仿真软件:AVR Studio 下载软件:AVR_fighter、MuCodeISP 等 在需要在中断函数中被修改的全局变量需要用 volatile 关键字声明 2.第一个简单的 AVR 程序 AVR 引脚排列:
ATMega8 引脚排列
ATMega16 引脚排列
*PWM 输出频率计算公式(快速 PWM 模式)
*PWM 输出频率计算公式(相位修正 PWM 模式)
4. 异步串行口 USART(同步或异步): ①相关寄存器:UDR(数据寄存器)、UCSRA(控制与状态寄存器 A)、UCSRB(控制与状态寄存器 B)、UCSRC (控制与状态寄存器 C)、UBRRL(波特率寄存器 L)、UBRRH(波特率寄存器 H) ②三个中断源:发送结束中断、发送数据寄存器空中断、接收完成中断(常用) ③寄存器介绍 *UDR: 8 位数据寄存器,接收和发送为同一地址的不同寄存器 *UCSRA:
②注意 OCR0(输出比较寄存器)用于输出比较,产生事件匹配中断,这里没有列出 *TCCR0:
FOC0(bit7):强制输出比较,仅在 WGM00 指明非 PWM 模式时才有效 WGM00、WGM01(bit6、3):波形产生模式
IAR
IAR学习笔记(摘抄)SECOMTEL 2010-04-22 10:49:47 回复转载到∙hs∙探讨人生-徐古中学∙袅袅8∙单片机∙SoPC技术联盟∙单片机交流∙嵌入式技术开发群∙永恒的记忆∙丿波斯猫灬∙SILABS单片机(世强)∙单片机学习群∙哥妹儿∙电院科技兴趣小组∙嵌入式技术开发群∙湖工飞思卡尔小车比赛∙嵌入式之家∙SOPC交流群∙FPGA黑金开发板6∙C8051F单片机(世强)∙徐古∙EDA/SOPC嵌入式系统∙性情中人∙高三4班∙08电气(2)班∙学在蓝电∙0..0∙摄像头组∙高三(13)班∙期货投资学∙55366705IAR for AVR 学习笔记(1)--数据类型数据类型(编译器支持 ISO/ANSI C 基本数据类型和一些附加数据类型)1.1.整型数据bool 数据类型在C++语言里是默认支持的。
如果你在C代码的头文件里包含stdbool.h, bool数据类型也可以使用在C语言里。
也可以使用布尔值 false和true。
1.2.浮点数据类型:1.3.指针类型:指针有数据指针和函数指针。
1、数据指针:数据指针的大小为8位,16位,24位。
定义为:在整型数据类型后加”*”符号。
例如:char * p;整型数据没有24位,具体定义指针见后面扩展关键字章节。
2、函数指针:函数指针的大小为16位,24位。
指针定义:在函数类型后加”*”符号IAR for AVR 学习笔记(2)--扩展关键字可以用来解决数据,函数的存放等。
有了它我们就可以定义变量存放在EEPROM,FLASH空间。
定义中断函数,指针等等。
IAR关键字很多,这里只列举常用的。
2.1.扩展关键字:用于控制数据和指针。
__eeprom 用于EEPROM 存储空间, 控制数据存放,控制指针类型和存放__tinyflash, __flash, __farflash, __hugeflash 用于flash 存储空间, 控制数据存放,控制指针类型和存放:__ext_io, __io 用于I/O存储空间, 控制数据存放,控制指针类型和存放__regvar 放置一个变量在工作寄存器中2.2.函数扩展关键字:。
AVR笔记
1.输入状态IO寄存器设置DDRx某一位置0,相应位的IO口被设置为输入输出|=(置1),输入&=~(置0)PORTx某一位置1,使能对应IO口相应位的上拉电阻PINx的对应位是输入的数据,0或1头文件是includ <avr/io.h>2.ISC2为0时,外部中断2是下降沿触发,为1时,是上升沿触发。
3. 4.1.2.T/C寄存器在全局变量前加volatile,这个变量才能应用在中断程序中USART 1.2.GCC编程1)另外,宏_BV(bit) 是我们操作I/O 寄存器时频繁用到的,avr-libc 建议使用这一宏进行寄存器的位操作,它在文件sfr_defs.h 中定义如下:#define _BV(bit) (1 << (bit))2)avr-libc 建议使用一组数据类型符号,这些数据类型的定义在头文件inttype.h 中,头文件的包含形式如下:#include <inttype.h>其中定义了常用的整数类型如下表所示3)const int n = 5;4)int a[n];注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量!= 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是ANSI C对数组的规定限制了它。
5)那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。
6)在程序中访问 FLASH 程序存储器avr-libc 对FLASH 存储器的读写支持API 和宏在头文件pgmspace.h中定义,在源文件中的包含形式如下:#include < avr/pgmspace.h >在程序存储器内的数据定义使用关键字__attribute__((__progmem__))。
从ICC AVR 到 Atmel Studio 6
以前一直在用ICCAVR 感觉生成文档方便,现在发现了Atmel Studio 6, 因为偶尔会用C#(VS2010)所以一下子就喜欢上了这个编译器,我只用8bit 的AVR 另外也是刚刚接触,所以在移植过程中会遇到各种问题,以下是自己的一些问题写出来共大家参考;1.MCU必须的头文件例如在ICC AVR(以下简称ICC)中使用#include <iom16v.h>或#include <iom128v.h>,要根据不同的mcu 型号选择头文件。
而在Atmel Studio 6 (以下简称AS6)中统一用#include <avr/io.h>。
(ICC AVR 7 的版本中也可以用统一的头文件了)2.头文件<macros.h>在ICC 中,头文件<macros.h>包含#include <AVRdef.h>。
在AVRdef.h 中,宏定义了一些常用的汇编指令和一些不常用的函数。
例如:(详细内容请参考ICC 安装程序中AVRdef.h)#define WDR() asm("wdr")#define SEI() asm("sei")#define CLI() asm("cli")#define NOP() asm("nop")#define SLEEP() asm("sleep");#define _WDR() asm("wdr")#define _SEI() asm("sei")#define _CLI() asm("cli")#define _NOP() asm("nop")#define _SLEEP() asm ("sleep");#define BIT(x) (1 << (x));在AS6 中,你可以直接使用asm("xxx")格式.或者用小写的sei();(当然要包含相应的头文件);Ps:如果移植ICC的代码比较麻烦,可以将这些宏命令添加到一个总的头文件(include.h) 中,所有c 文件都引用include.h,那么在移植过程中,将不需要修改代码。
AVR 软件使用基础
第一讲:AVR软件、工具、m16的基础知识10月6日主要内容有 ICCAVR、STDIO、AVR C语言简明教程、avr的特性avr单片机的主要软件开发工具有:iccavr软件、stdio软件;avr单片机的主要开发工具有:JTAG仿真器、ISP下载线、STK500下载线avr M16单片机的开发板第一步安装ICCAVR第二步安装stdio 第三步介绍avr c语言的语法1、一个简单的AVR程序#include#includevoid 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;一些选定的可打印字符,如"~!@#¥%^&*()_-+={}[],.;<>/?|\";空格符、换行符和制表符这三种空白符起到分割成分和编排格式的作用。
2.软件使用
一、icc avr 使用
5、添加头文件到项目(Add Head file to project)
使用同样的方法找到macro.h文件,在*.c文件 第2行添加‚#include <macros.h>‛语句即可
一、icc avr 使用
5、添加头文件到项目(Add Head file to project)
点击‚Browse For key file‛,找到MAXIM_LICENCE.lxk破 解文件,确定。
二、Proteus 使用 2、破解(crack)
鼠标选中‚MAXIM‛,点 击‚Install‛,点yes。
二、Proteus 使用 2、破解(crack)
如图,点close,关闭,继续next,直到安装成功。
file->onpe->c:\icc\include\。使用过滤器, 在文件框中输入‚*16*.h‛,如下图:
一、icc avr 使用
5、添加头文件到项目(Add Head file to project)
iom16.h,iom16v.h 都是常用的头文件。在*.c 文件第1行添加‚#include <iom16v.h>‛语句即可
2、新建调试文件
file->open, 打开*.cof调试 文件,输入项目 文件名,并保存 在合适路径。
三、AVR Studio使用
3、开始调试
三、AVR Studio使用
3、开始调试
三、AVR Studio使用
3、开始调试
三、AVR Studio使用
3、开始调试
单步、全速调试。 注意:(1)AVR ICC和AVR STUDIO最好同时打开; (2)AVR STUDIO不能编辑源程序,可以回到AVR ICC中修改,AVR STUDIO会自动重载。
AVR单片机学习三开发基础知识
AVR单片机学习(三)开发基础知识一、AVR开发工具简介及开发环境的建立软件开发工具编译环境:WinAVR下载软件:MucodeISP仿真环境:AVR Studio集成环境:AVR Studio,可以内联WinAVR 成为一个具有编译、仿真、下载功能的集成环境硬件开发工具下载线(并口也有USB接口的,功能是下载程序配置熔丝位)仿真器学习板(或手工焊接的系统板)工具手册WinAVR技术手册ATmega16官方中文版技术手册(英文水平好也可以看看英文版)WinAVR 说明WinAVR 下载安装后只用到PN其他删除就行了、PN我们一般把他作为一个编辑环境来使用,保存为.c文件之后他就会变成一个有颜色的C文件了,这个有点就显示出来了(关键字带颜色深蓝色和点击小括号其中另一半就会高亮很多层括号就有用了)而WinAVR 的编译功能需要编写Makefile文件所以对初学者有难度先不介绍了。
而编译使用AVR Studio来完成就可以了。
下载线作用一、修改熔丝位熔丝位可理解为是一个独立于CPU 之外的一块小存储区它保存了一些关键的控制位、如:时钟源、一些I/O口的特殊作用。
二、向单片机Flash中下载程序代码。
不具备单步调试仿真功能。
三、下载线有很多种,最常用的是插在计算机并口上的STK200/300下载软件说明下载软件有很多、但推荐初学者使用Mucode isp 优点是熔丝位设置很清晰,不至于设错而锁死芯片MUcode ISP 如果外部石英晶振高于8MHZ 也选3.0---8MHZ 防止锁死如果芯片锁死了,就下载不进去程序了。
芯片解锁只能采用高压编程器,将熔丝位修改回来。
然后另一个比较重要的熔丝位是(共16个红点和绿点)这个表示的是ATmega16的2字节的熔丝位,上面8个表示时钟电源模式。
更改时钟的话上面8个自动做出相应的变化。
变绿=1 表示没有使能变红表示使能的红点按下去就是使能的意思就好在这里。
下面8个最重要的是JTAGEN这个,打开ATmega16 技术文档发现JTAG有个4个脚和普通的I/O口是复用的(TDI TDO TMS TCK )可以配置成普通I/O用也可以当JTAG接口用。
AVR单片机IIC驱动头文件
#ifndef I2C_BH1750_H_#define I2C_BH1750_H_unsigned char display[]={"0000 lux"};//显示数据float lux_data;//使用AVR内部硬件iic,引脚定义//PC0->SCL ; PC1->SDA//I2C 状态定义//MT 主方式传输MR 主方式接受#define START 0x08#define RE_START 0x10#define MT_SLA_ACK 0x18#define MT_SLA_NOACK 0x20#define MT_DATA_ACK 0x28#define MT_DATA_NOACK 0x30#define MR_SLA_ACK 0x40#define MR_SLA_NOACK 0x48#define MR_DATA_ACK 0x50#define MR_DATA_NOACK 0x58#define RD_DEVICE_ADDR 0x47 //ADDR脚接地时的读地址#define WD_DEVICE_ADDR 0x46 //ADDR脚接地时的写地址//常用TWI操作(主模式写和读)#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //启动I2C #define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //停止I2C #define Wait() {while(!(TWCR&(1<<TWINT)));} //等待中断发生#define TestAck() (TWSR&0xf8) //观察返回状态#define SetAck (TWCR|=(1<<TWEA)) //做出ACK 应答#define SetNoAck (TWCR&=~(1<<TWEA)) //做出Not Ack应答#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C #define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //写数据到TWDRunsigned char I2C_Write(unsigned char Wdata);unsigned int I2C_Read(void);/*********************************************I2C总线写一个字节返回0:写成功返回1:写失败**********************************************/unsigned char I2C_Write(unsigned char Wdata){Start(); //I2C启动Wait();if(TestAck()!=START)return 1; //ACKWrite8Bit(WD_DEVICE_ADDR); //写I2C从器件地址和写方式Wait();if(TestAck()!=MT_SLA_ACK)return 1; //ACKWrite8Bit(Wdata); //写数据到器件相应寄存器Wait();if(TestAck()!=MT_DATA_ACK)return 1; //ACKStop(); //I2C停止return 0;}/*********************************************I2C总线读一个字节返回:16位数值**********************************************/unsigned int I2C_Read(void){unsigned int temp;Start(); //I2C启动Wait();if(TestAck()!=START)return 1; //ACKWrite8Bit(RD_DEVICE_ADDR); //写I2C从器件地址和写方式Wait();if(TestAck()!=MR_SLA_ACK)return 1; //ACKTwi(); //启动主I2C读方式TWCR = 0xC4; //清中断标志,结果应答ACKWait();temp=TWDR; //读取I2C接收数据第一字节Twi(); //启动主I2C读方式,结果应答NO_ACK Wait();temp = (temp<<8)+TWDR; //读第二字节合成16位数值Stop(); //I2C停止return temp;}/*********************************************数据转换,十六进制数据转换成10进制输入十六进制范围:0x0000-0x270f(0-9999)结果分成个十百千位,以ascii存入显示区**********************************************/void conversion(unsigned int i){display[0]=i/10000+0x30 ;i=i%10000; //取余运算display[1]=i/1000+0x30 ;i=i%1000; //取余运算display[2]=i/100+0x30 ;i=i%100; //取余运算display[3]=i/10+0x30 ;i=i%10; //取余运算display[4]=i+0x30;}#endif。
AVRGCC常用头文件
AVRGCC常用头文件一、库函数头文件介绍库函数按不同的类别声明在不同的头文件中,以字母为序分别介绍头文件:ctype.h:字符类型函数eeprom.h:EEPROM 访问函数errno.h:错误处理函数ina90.h:与IAR C兼容的头文件interrupt.h:中断处理函数inttypes.h:定义不同的数据类型io.h:包含寄存器定义和其它头文件math.h:数学函数pgmspace.h:与IAR C兼容的头文件,内含对Flash存储器中数据读写函数progmem.h:与pgmspace.h 头文件相同setjmp.h:长跳转函数sig-avr.h:与signal.h相同,旧版头文件,建议不使用signal.h:信号处理函数stdlib.h:标准库函数stdio.h:标准输入输出函数string.h:字符串操作函数timer.h:定时器控制函数twi.h:针对ATmega163的I2C函数wdt.h:看门狗定时器控制函数注:AVRGCC在使用前应包含头文件,例如#include <avr/signal.h>,这里要包含头文件所在的文件夹avr,用户自己的头文件可以先复制到avr文件夹下。
二、字符类型处理函数库int isalnum(int c):如果c为字母或数字则返回1,否则返回0。
int isalpha(int c):如果c为字母则返回1,否则返回0。
int isascii(int c):如果c为ASCII码则返回1,否则返回0。
int isblank(int c):如果c为空格字符则返回1,否则返回0,可以是space键或tab键输入的空格字符。
int iscntrl(int c):如果c为控制字符则返回1,否则返回0。
int isdigit(int c):如果c为数字则返回1,否则返回0。
int isgraph(int c):如果c为可打印字符(不包括空格)则返回1,否则返回0。
AVR单片机程序
A VR单片机程序* 文件名:闪烁灯.c* 杜邦线接法:用单条杜邦线把PD.0与J38的1端相连接。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的有关晶振频率#include <util/delay.h>#define LED1 PORTD|=~0XFE //LED=1 LED不亮#define LED0 PORTD&=0XFE //LED=0 LED发光int main(void){DDRD = 0x01; //PD0定义为输出,PD的其他端口为输入。
while(1){LED1;_delay_ms(500);LED0;_delay_ms(500);}}/********************************************************************* 文件名:闪烁灯2.c* 创建人:东流,2012年2月10日* 版本号:1.0* 杜邦线接法:用8针杜邦线把PD与J38的1--8连接(PD0对应J38的1端)。
用杜邦线把PB0对应J38的9端。
用杜邦线把PB1对应J38的10端。
用杜邦线把PB2对应J38的11端。
用杜邦线把PB3对应J38的12端。
***********************************************************************/ #include <avr/io.h>#define F_CPU 8000000 //这里的值是单片机工作的有关晶振频率#include <util/delay.h>int main(void){DDRD = 0xff;DDRB = 0x0f;while(1){/*北面的三个LED亮*/PORTD = 0xf8;PORTB = 0xff;_delay_ms(300);/*东面的三个LED亮*/PORTD = 0xc7;PORTB = 0xff;_delay_ms(300);/*南面的三个LED亮*/PORTD = 0x3f;PORTB = 0xfe;_delay_ms(300);/*西面的三个LED亮*/PORTD = 0xff;PORTB = 0xf1;_delay_ms(300);/*北面的两个LED亮,中间一个不亮*/ PORTD = 0xfa;PORTB = 0xff;_delay_ms(300);/*东面的两个LED亮,中间一个不亮*/ PORTD = 0xd7;PORTB = 0xff;_delay_ms(300);/*南面的两个LED亮,中间一个不亮*/ PORTD = 0xbf;PORTB = 0xfe;_delay_ms(300);/*西面的两个LED亮,中间一个不亮*/ PORTD = 0xff;PORTB = 0xf5;_delay_ms(300);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);/*12个LED全亮*/PORTD = 0x00;PORTB = 0xf0;_delay_ms(200);/*12个LED全灭*/PORTD = 0xff;PORTB = 0xff;_delay_ms(200);_delay_ms(500); //延时0.5秒}}/********************************************************************* 文件名:闪烁灯2.c* 描述: 在LED上根据要求,进行不一致的显示。