WINAVR 中文教程 一 安装 WINAVR 是一款开发 AVR 系列单片机的免费编译软件 您可以在 网上搜索或者到 www.qm999.cn 中资源下载栏目中下载 安装完 WINAVR 的菜单 二 建立项目 运行 Programmers Notedpad [WinAVR] 1
建立项目组, 如下图 : 2
建立项目, 如下图 : 输入工程名 :first 放在目录 D:\tt 下 3
在新建的文件中输入第一个程序, 保存到项目目录 d:\tt 中, 文件名定作 first.c 在 first 项目上, 点右键 4
选择刚才保存的 first.c 文件 选择存盘后, 项目已经建成 但是要编译还要配置 Makefile 文件 请继续看下面的编译调试步骤 三 编译调试 点击运行菜单中的 Mfile 项 5
输入主文件名, 即含有 main 函数的文件名 我们在上面保存的文件名是 first.c 这里填入 first 设定 MCU 型号 这里我们用的是 MEGA16 其他各项, 我们都使用默认设置 选择另存为把这个配置文件保存到项目目录中 6
还有一个问题 就是默认的配置是 8M 晶振, 我用的是 7.3728M 的 这样在使用延时函数时 就不准了 在 PN(Progrmmer's Notepad) 中打开 d:\tt\makefile 文件 7
把 F_CPU = 8000000 改为 F_CPU = 7372800 就是 7.3728M 选择保存, 就完成的 Makefile 文件配置 配置或改动 Makefile 文件后, 要执行一次 Make Clean 选项 再选择 Make All 选项编译 如果编译正确,Output 窗口会输出以下内容 : > "make.exe" all -------- begin -------- avr-gcc (GCC) 4.2.2 (WinAVR 20071221) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Compiling C: first.c avr-gcc -c -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=7372800UL -Os -funsigned-char - funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=./first.lst - std=gnu99 -Wundef -MMD -MP -MF.dep/first.o.d first.c -o first.o 8
first.c:27:2: warning: no newline at end of file 救火车单片机工作室 Linking: first.elf avr-gcc -mmcu=atmega16 -I. -gdwarf-2 -DF_CPU=7372800UL -Os -funsigned-char -funsignedbitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns=first.o -std=gnu99 - Wundef -MMD -MP -MF.dep/first.elf.d first.o --output first.elf -Wl,-Map=first.map,--cref - lm Creating load file for Flash: first.hex avr-objcopy -O ihex -R.eeprom first.elf first.hex Creating load file for EEPROM: first.eep avr-objcopy -j.eeprom --set-section-flags=.eeprom="alloc,load" \ --change-section-lma.eeprom=0 --no-change-warnings -O ihex first.elf first.eep exit 0 Creating Extended Listing: first.lss avr-objdump -h -S first.elf > first.lss Creating Symbol Table: first.sym avr-nm -n first.elf > first.sym Size after: AVR Memory Usage ---------------- Device: atmega16 Program: 198 bytes (1.2% Full) (.text +.data +.bootloader) Data: 0 bytes (0.0% Full) (.data +.bss +.noinit) -------- end -------- > Process Exit Code: 0 > Time Taken: 00:03 在工作目录 d:\tt 中生成了 hex 文件 first.hex 9
四 连接 AVR Studio 4 仿真 这里使用的是 AVR Studio 4.13 版本 运行时选择 first.elf 文件, 打开 选择仿真设备 AVR Simulator 和使用芯片 ATmega16 这时选的设备是 AVR Simulator, 即软件模拟仿真 您如果使用仿真器, 可以选择其他项, 目前常见的仿真器一般要选 JTAG ICE 项 10
现在您可以进行仿真调试了 五 常用函数介绍 1 EEPROM 访问函数在使用前应包含头文件 #include <avr\eeprom.h> int eeprom_is_ready(): 宏定义,EEPROM 准备好 (EECR=0) 返回非, 否则返回 0. unsigned char eeprom_read_byte(unsigned int addr): 从 EEPROM 读取 addr 地址处的字节数据 11
unsigned int eeprom_read_word(unsigned int addr): 从 EEPROM 读取一个整数, 低字节地址 addr, 高字节地址 (addr+1) void eeprom_read_block(void *buf,unsigned int addr,size_tn): 从 EEPROM 的 addr 地址开始, 读取 n 个字节到 buf. void eeprom_write_byte(unsigned int addr,unsigned char value): 向 EEPROM 的 addr 地址处写 入字节数据 value void eeprom_write_word(unsigned int addr,unsigned int value): 向 EEPROM 的 addr 地址处写入 整数数据 value void eeprom_write_block(const void *pointer_ram,void *pointer_eeprom,size_tn) 2 数学函数 在使用前应包含头文件 #include <math.h>, 而且 math.h 数字函数库中定义的函数需要 libm.a 库文件的支持, 因此在连接时增加 -lm 参数, 或者 makefile 的 LDFLAGS= 后面追加 -lm 参数 M_PI: 常数, 为 3.141592653589793238462643 M_SQRT2: 常数, 为 1.4142135623730950488016887 double cos(double x): 返回以弧度形式表示 x 的余弦值 double fabs(double x): 返回 x 的绝对值 double fmod(double x,double y): 返回 x/y 的余数 double modf(double x, double *iptr): 把浮点数分解成整数部分和小数部分, 整数部分存到 pint 指向的变量, 小数部分应当大于或等于 0 而小于 1, 并且作为函数返回值返回 double sin(double x): 返回以弧度形式表示 x 的正弦值 double sqrt(double x): 返回 x 的平方根 double tan(double x): 返回以弧度形式表示 x 的正切值 double floor(double x): 返回不大于 x 的最大整数 double ceil(double x): 返回不小于 x 的最小整数 double frexp(double x,int *exp): 把浮点数 x 分解成数字部分 y( 尾数 ) 和以 2 为底的指数 n 两个部分, 即 x=y*2ⁿ,y 的范围为 0.5 y 1,y 值被函数返回, 而 n 值存放在 prxp 指向的变量 中 double ldexp(double x,int exp): 返回 x*2 exp double exp(double x): 返回以 e 为底 x 的幂, 即 e x double cosh(double x): 以弧度形式返回 x 的双曲余弦值 double sinh(double x): 以弧度形式返回 x 的双曲正弦值 double tanh(double x): 以弧度形式返回 x 的双曲正切值 double acos(double x): 以弧度形式返回 x 的余弦值 double asin(double x): 以弧度形式返回 x 的正弦值 double atan(double x): 以弧度形式返回 x 的正切值 double atan2(double x,double y): 返回 y/x 的反正切, 其范围在 -π~π 之间 double log(double x): 返回 x 的自然对数 double log10(double x): 返回以 10 为底的对数 double pow(double x,double y): 返回 x y 值 int isnan(double x): 如果 x 为非负数 (NAN, 值为 0xffffffff), 返回 1, 否则返回 0 int isnaf(double x): 如果 x 的值为正溢出 ( +INF, 值大于 0x7f800000) 和负溢出 ( -INF, 值小于 0xff800000) 则返回 0, 否则返回 1 12
double strtod(const char *s,char **endprt): 将 ASCII 字符串转换为 double 数 double square(double x): 返回 x 的平方根 double inverse(double x): 返回 1/x 3 看门狗定时器函数 在使用前应包含头文件 #include <avr\wdt.h> wdt_reset(): 复位看门狗 ( 喂狗 ) wdt_enable(timeout): 打开看门狗, 定时为 timeout wdt_sisable(): 关闭看门狗 4 延时函数 在使用前应包含头文件 #include <util/delay.h> _delay_us(double us); us 的精确延时, 参数为 double, 最长为 768 us _delay_ms(double ms); ms 的精确延时, 参数为 double, 最长为 262.14 ms 5 中断函数 在使用前应包含头文件 #include <avr/interrupt.h> sei();// 开中断 cli();// 关中断 中断函数格式为 : ISR( 中断向量名 ) { // 你的程序 } 例 : ISR(INT0_vect) { // 你的程序 } 中断向量名请在芯片的库文件中查找 例如 mega16 库文件在 C:\WinAVR-20071221\avr\include\avr\iom16.h /* External Interrupt Request 0 */ #define INT0_vect #define SIG_INTERRUPT0 _VECTOR(1) _VECTOR(1) /* External Interrupt Request 1 */ #define INT1_vect _VECTOR(2) #define SIG_INTERRUPT1 _VECTOR(2) 13