在高校实验中avr单片机与C语言应用
- 格式:doc
- 大小:22.00 KB
- 文档页数:3
本章程序是用IAR C正版软件编译通过的,并可产生*.HEX烧录文件,用其它C语言编译是有差异的,不一定能通过,请用户注意这点!本章最后附几种C语言的比较,不仿一读 更详细资料参阅光盘文件<< AVR C语言的应用>>9.1 AVR – 支持C和高级语言编程的结构一般高级语言• 提高了MCU的重要性–缩短产品上市的时间– 简化了维护工作,可读性好– 轻便– 缩短学习时间– 可重复使用,便于移植– 方便调用库文件• 潜在的缺点– 代码较大– 执行速度慢为什么 AVR适宜用高级语言编程?因为它是为高级语言而设计的!IAR对AVR结构和指令集的影响• 在结构/指令集确定之前指针和之间结果• 线性程序存储空间– 1KBytes - 8MBytes– 无需页寻址– 常数区(SPM可修改)• 线性数据存储空间– 16 MBytes– 无需页寻址类似于C的寻址模式C 源代码无符号的字符*var1, *var2;*var1++ = *--var2;产生的代码LD R16,-XST Z+,R16带偏移量的间接寻址•有效访问数组和结构•Auto (local variables)放置于软件堆栈之中– 为适应重入的要求Non-destructive comparisonCP R16,R24CPC R17,R25CPC R18,R26CPC R19,R27• 带进位比较• Zero传播• 无需保存结果• 可使用所有形式的跳转Switch 支持• Switches在CASE语句中经常遇到• Straight forward approach 效率低• 间接跳转适合于紧凑的switch结构• switch由通用库管理摘要• AVR结构从一开始就是针对高级语言设计的• Atmel与IAR在结构和指令调整上的合作¸ßËٵĴúÂë • 在大的应用当中代码效率低• 可读性差 不好维护• 不易移植 C编译器:对资源的控制有限• 在小应中产生的代码量大Pre-decrementÊäÈë¿Ú)– 将其值写到 Port B (LED, 输出口)测试程序(设文件名为920.c)#include <io8515.h> /* 定义 AT90S8515 */void main(void){char c;DDRB = 0xFF; /* PortB all outputs */for(;;) /* Eternal loop */{c = PIND; /* Read Port D */PORTB = c; /* 回写到 Port B */} }9.2.1. 安装C编译器根据IAR Readme要求,从光盘安装编译器,文件安装好后,可把图标移到桌面成快捷工作图标,如图9219.2.2 设置 C 编译器启动 IAR嵌入式工作台可双击快捷图标,进入IAR编译器窗口New图923 编辑源程序文件 ͼ924 ±à¼-Ô´³ÌÐòÉèÖÃÑ¡Ïî4. ÉèÖÃÁ´½ÓÆ÷ÎļþXLINKÑ¡ÏîÔÚͼ925ÖÐÑ¡ÔñXLINKÑ¡Ïî,ΪÉú³ÉÏÂÔØÎļþ,±ØÐëÉ趨ΪÊä³ö¸ñʽ(release only);ͼ925 XLINKÑ¡Ïî,Éú³ÉÏÂÔØÎļþÈ»ºó°´OK°´Å¥,ÉèÖñàÒëÆ÷Ñ¡Ïî½áÊø,ÏÔʾ¹¤³ÌÎļþ´°¿Úͼ929图928将源程序加入到工程文件8.对工程文件进行链接编译 如图929,双击 *.C文件,将会弹出源程序窗口 Make 或键F9,或快捷工具条图标图9210 编译生成的文件9.2.3 使用AVR Studio调试如程序编译通过,可进入程序调试 1. 启动AVR Studio ,双击桌面快捷图标2. 装入调试文件 (TestProg.d90) - File -> Open如图9211• 选择AT90S8515 (只需在开始时选择一次)• 加入视图 I/O (PinB, PortD) Processor Watch 籧 籔ORTB 籔IND 单步执行, Toggle PIND bits图9211 “Debug”调试窗口9.2.4 对器件编程•选择编程下载窗口(见第三章图 3.30 AVR下载窗口)Ò²²»Òª·µ»ØÖµ• 语法:void main(void){/* 代码 */}访问外围• 所有I/O寄存器在头文件里都被定义为特殊功能寄存器• 象普通变量一样访问#include <io8515.h> /* 定义 8515 */void main(void){DDRD = 0xFF; /* Port D 输出 */}9.3.1 读/写口#include <io8515.h> /* 定义 AT90S8515 */void main(void){char c;DDRB = 0xFF; /* PortB 输出 */for(;;) /* 死循环 */{c = PIND; /* 读 Port D */PORTB = c; /* 回写到 Port B */ }}9.3.2 延时函数#include <io8515.h> /* 定义 8515 */void delay(unsigned int delayValue){unsigned int i;for(i=0;i<delayValue;i++) /* 循环 */; /* Do nothing */}9.3.2A: 延时函数void main(void)0x10 */_EEGET(temp,0x10); /* 读E2PROM 地址 按位取反; << 左移; >> 右移; 按位异或; ;i++相当于i=i+1; i--相当于i=i-1 */ #include <io8515.h> ; /* 器件配置文件 */ #define BIT(x) (1 << (x)); /* 左移 */ void delay(void) { unsigned char i,j; for (i=1;i;i++) for(j=1;j;j++); } void led_pb(void) { unsigned char i; DDRB=0xff; /* 设PB口输出 */ for (i=0;i<8;i++) /* 硬件设定低电平灯亮,LED的1位亮灯从B口PB0PB7 */ {PORTB=~BIT(i);/* LEDÁÁµÆ1λ */delay(t);/* ÑÓʱ */}PORTB=0xff; /* ¹ØPB¿Ú */}void led_pd(unsigned char t);/* LEDµÄ1λÁÁµÆ´ÓD¿ÚPD0PD7 */{PORTD=~BIT(i);delay(t);}PC7ÒÆÎ»º¯Êý */ {unsigned char i;DDRC=0xff;for (i=0;i<8;i++)/* LEDµÄ1λÁÁµÆ´ÓC¿ÚPC0P A0ÒÆÎ»º¯Êý */ {unsigned char i;DDRA=0xff;for (i=8;i>0;i--)/* LEDµÄ1λÁÁµÆ´ÓA¿ÚPA7ÓкܶàµÚÈý·½³§ÉÌΪAT90ϵÁпª·¢ÁËÓÃÓÚ³ÌÐò¿ª·¢µÄCÓïÑÔ¹¤¾ßIAR µÄICC90C odeVision AVRºÍSPJµÄAVRCÊÇÒ»¸öÀÏÅÆµÄCÓïÑÔ¹¤¾ßÔÚÕâËÄÖÖCÓïÑÔ¹¤¾ßÖÐÆäIDE¹¤×÷»·¾³²»¿ÉÓëǰÈýÖÖÏàÌá²¢ÂÛ¾-³õ²½²âÊÔÆäÉú³ÉµÄ´úÂëÆä°æ±¾¸üеÄËÙ¶ÈÒ²½ÏÂýÏÂÃæµÄ±È½ÏÖ»ÊǶÔǰÈýÖÖCÓïÑÔ¹¤¾ßµÄ±È½ÏIDE¹¤×÷»·¾³µÄ±È½Ï IAR的ICC90由于诞生的比较早应该说其IDE环境不如ICCAVR和CodeVisionAVR但它也有自己的特点而其余两家均只能通过生成COFF格式文件而IAR在两个调试环境中均可以正常工作应用程序向导 串行通信调试终端 工具配置菜单 工程属性窗口 而ICCAVR与CodeVision AVR都具有应用程序向导 可以根据选择的器件来产生I/O端口中断系统SPI片外SRAM配置的初始化代码来计算波特率发生器UBRR的常数ICCAVR除自动计算波特率外¶øC odeVisionAVRÔòÐèÒªÓû§ÊÖ¹¤¼ÆËãºóC odeVisionAVR³ýÁË¿ÉÒÔ²úÉúMCU±¾ÉíËù¹ÌÓеÄÓ²¼þµÄ³õʼ»¯´úÂëÍâÈçI2C总线接口字符型LCD接口 用户可以根据需要自由地设置波特率奇偶校验等参数 在终端的功能方面CodeVisionAVR要强一些接受和显示数据接受和显示数据接受和显示数据IAR在菜单中只增加了一个配置菜单命令 ICCAVR在IAR的基础上增加了一些项目支持STK200/300接口的在线编程和基于串口通信的ISP编程增加了调试菜单命令和工具栏图标CodeVisionAVR支持的在线编程器种类较多DT006但对初学者使用反而不如CodeVisionAVR和ICCAVR方便 1而CodeVisionAVR和ICCAVR可以设置到具体的器件型号这样在使用时有些区别在IAR的初始化程序中一定要加一行 否则在程序运行时8515的PORTA和PORTC两个端口会输出总线信号其余的工作由编译器自动完成如果用户需要修改C编译器的堆栈空间大小它需要修改相应的XCL文件才能达到目的ICCAVR在工程属性窗口中可以直接修改硬件返回堆栈的空间大小全局变量和堆外 3IAR同样需要修改相应的XCL文件才能达到目的 4ICCAVR可以直接指定相应的库文件而CodeVisionAVR必须在头文件或C语言文件中使用预处理命令#pragma library 5即空余程序存贮空间的填充功能可以在空余的程序存贮器中填入特定的数据字节而CodeVisionAVR没有这个功能它自动将所有没有使用的中断向量均指向了复位向量入口 IARÖÐÓÐÒ»¸öº¯Êý__low_level_init(void)¿ÉÔÚint__low_level_init(void)ÖмÓÈë×Ô¼ºµÄ´úÂëÕâÊÇÁíÍâÁ½¸öÈí¼þËù²»¾ßÓеÄ二而MCS51和AVR均为哈佛结构因此几种C语言都进行了不同的语法扩充 1使 C语言可以直接访问MCU的有关寄存器 而ICCAVR没有定义sfrb和sfrw数据类型如 (*(volatile unsigned char *)0x31) #define DDRD 前者sfrb定义中的0x11为DDRD寄存器的IO地址 2EEPROM和FLASH存贮器flash使用 flash关键IAR中只扩充了一个关键词FLASH存贮器在IAR词可以将使用const类型定义的常量分配进中对片内EEPROM的访问 FLASH在ICCAVR中编译器自动将const类型数据分配进eeprom.h中的函数对EEPROM存贮器中C语言可以通过头文件中某一个具体地址进行访问可以在eeprom区域中定义变量& R中flash的用法同IAR在CodeVisionAV在C语言中访问EEPROM中变量RAM中的变量完全相同的方法使用形式上和访问而ICCAVR和CodeVisionAVINTEL HEX格式R还可以对EEPROM的初始化数据生成的.EEP文件 3所以它们分别进行了语法扩充由该关键词限定的函数为中断处理函数只不过IAR和CodeVisionAVR在有关头文件中用不同的符号对同一个中断号进行了宏定义IAR中interrupt [TIM1_OVF] void timer1_overflow(void)对应于同一个中断向量的实际上它们是ICCAVR采用这种方法的一个优点是可以将若干个中断向量指向同一个中断数 #pragma interrupt_handler timer:4 timer:5中断向量4和5都指向中断处理函数timer( )位操作 µ«ÔÚ¿ØÖÆÁìÓòÓÐʱ¾-³£ÐèÒª¿ØÖÆÄ³Ò»¸ö¶þ½øÖÆÎ»ÈçKEIL51ǰÕß¿ÉÒÔÔÚMCS-51µÄÎ»Ñ°Ö·Çø½øÐзÖÅäSFR ÕâÁ½¸öÀ©³äΪMCS-51Ó¦ÓÃCÓïÑÔ±à³Ì´øÀ´ºÜ´óµÄ·½±ã³ýC odeVisionAVR¶¨ÒåÁËbitÊý¾ÝÀàÐÍÍâ¶øsbitÀàÐÍÈýÖÖCÓïÑÔ¶¼Ã»Óж¨ÒåÔÚAVRÖнøÐÐλ²Ù×÷ÔËËãC odeVisionAVRµÄ¹¦ÄÜ×îÇ¿ÁíÍâÔÚ·ÃÎÊIO¼Ä´æÆ÷ʱ¿ÉÒÔÖ±½Ó·ÃÎÊIO¼Ä´æÆ÷µÄijһλ¿ÉÒÔÕâÑù·ÃÎʵ±ËüÃÇÐèÒª·ÃÎÊIO¼Ä´æÆ÷µÄijһλֻÄÜʹÓÃANSI CÓïÑÔµÄλÔËË㹦ÄÜ¿ÉÒÔÕâÑùÀ´·ÃÎÊÔÚÏß»ã±àIAR²»Ö§³ÖÔÚÏß»ã±à¼´¿ÉÔÚCÓïÑԸ߼¶ÓïÑÔ³ÌÐòÖÐÖ±½ÓǶÈë»ã±àÓïÑÔ³ÌÐòÔÚICCAVRÖÐstringÈç·ÃÎÊDDRBµÄD3λasm()»òasm()ÈçÐèҪǶÈë¶àÐлã±àÖ¸Áî\nÈçnop\n nop\n nopÔÚC odeVisionAVRÖÐÔÚÏß»ã±àÓÐÁ½ÖÖ¸ñʽÈç·ÃÎÊDDRBµÄD3λ#asmsbi 0x17, 3ʹÓÃ#asm ()µÄÐÎʽ#asm()\n6CÓïÑÔÒ»°ã¶¼ÉèÖÃÁËһЩÄÚ´æÄ£Ê½ÏÂÃæÒÀ´Î½éÉÜÔÚTinyģʽ·ÃÎÊRAMÖбäÁ¿Ê¹ÓõÄÖ¸ÕëÊÇ8λµÄ¶øÇÒ´Ëʱ²»¿ÉÒÔʹÓÃÍⲿSRAMʹÓÃ16λµÄÖ¸Õë·ÃÎÊSRAM´Ëʱ¿ÉÒÔʹÓÃÍⲿSRAM³ÌÐòʹÓÃ16λµÄÖ¸Õë×¢ÒâÓÉÓÚ·ÃÎÊFLASHµÄ³ÌÐòÖ¸ÕëΪ16λÁíÍâÔÚIARÖÐÓÉÓÚ¹¤³ÌÊôÐÔÅäÖò»ÄܾßÌ嵽ijһ¸öÌØ¶¨Æ÷¼þÒ»¸öÊÇ´¦ÀíÆ÷ÅäÖÃÁíÍâÒ»¸öÊÇÄÚ´æÄ£Ê½1v0 Êý¾ÝSRAM ×î´ó256 ×Ö½ÚIARÖÐÀ©³äµÄnear2v1Êý¾ÝSRAM ×î´ó64K×Ö½ÚTinyģʽĬÈÏʹÓÃ256×Ö½ÚÊý¾ÝSRAMϵͳĬÈÏʹÓÃTinyÄÚ´æÄ£Ê½3v2Êý¾ÝSRAM ×î´ó256 ×Ö½Ú4v3Êý¾ÝSRAM ×î´ó64K ×Ö½Ú5v4Êý¾ÝSRAM ×î´ó16M ×Ö½Ú6)´úÂë×î´ó 8M×Ö½Ú±àÒëʱֻ¿ÉÒÔʹÓÃTinyºÍsmallģʽv6Êý¾ÝSRAM ×î´ó16M×Ö½ÚÔÚICCAVRÖÐÔÚ±àÒëʱ¸ù¾ÝÓû§ÔÚ¹¤³ÌÊôÐÔÖжÔSRAMµÄÉèÖÃICCAVRÖжÔprintf( )µÄ°æ±¾ÊǷֵȼ¶µÄÆä¹¦ÄÜԽǿ7IARÖ»ÓÐһЩ³£ÓõĿâICCAVRÓÐһЩ¸Ä½øÈçUART C odeVisionAVRÔÚÕâ·½Ãæ×öµÃ½ÏΪ³öÉ«¶øÇÒÔö¼ÓÁËһЩ³£ÓõÄÓ²¼þ½Ó¿Ú·ÃÎÊC odeVisionAVRÓÐһЩ±È½ÏÓÐÌØµãµÄ¿âÈçDS1302DS1621LM75PCF8535µÈ8IARδ¼ûÓÐ˵Ã÷TinyϵÁÐImageCraftÁíÓÐһרÃÅÓÃÓÚ²»º¬Æ¬ÄÚSRAMµÄAVR×åϵоƬµÄICCTiny CÓïÑÔ¹¤¾ß´úÂëµÄЧÂʺÍËÙ¶È在代码效率方面其中IAR的优化等级又分为0到9级其将代码优化和压缩功能放在了专业版中程序代码可以压缩¶ÔÏÂÃæµÄ³ÌÐòÎÒÃǽøÐдúÂëЧÂÊ·ÖÎö±àÒëÆ÷³ÌÐò´úÂë×Ö½ÚÊýIAR 413ICCAVR311C odeVisionAVR327KEIL51136×¢±àÒëÆ÷Ãû³Æ´úÂë×Ö½ÚÊýÖ´ÐÐʱ¼äЧÂÊIAR 58 47.63us 23.58 ICCAVR62 50.75us 22.14C odeVisionAVR60 179.38us 6.26KEIL5157 1.1235ms 1×îºóÎÒÃÇÔÙ¿´Ò»¸ö¸¡µãÔËËã³ÌÐò±àÒëÆ÷Ãû³Æ´úÂë×Ö½ÚÊýÖ´ÐÐʱ¼äЧÂÊIAR 1237 747.5us 7.09 ICCAVR1991 950.75us 5.58 C odeVisionAVR1267 521us 10.17 KEIL511403 5.301ms 1ͨ¹ýÒÔÉϼ¸ÕŶԱȱí¸ñ¿ÉÒÔ¿´³öCÓïÑÔÃܶȲ¢²»µ¥´¿µØ¾ö¶¨ÓÚAVRµÄ½á¹¹。
《AVR单片机C语言程序设计》课程教学大纲一、教师信息开设主要课程:电力电子技术、单片机原理及其接口技术,51单片机C语言程序设计、AVR 单片机C语言程序设计、单片机课程设计、C语言程序设计等。
研究经历:主要从事单片机开发和应用、电力电子技术等的教学和科研工作,参与多届“全国大学生电子竞赛”的辅导工作,参与“大学生创新项目”的辅导工作,发表论文十几篇,参与科研项目多项。
二、课程基本信息课程名称(中文):A VR单片机C语言程序设计课程名称(英文):A VR Microcontroller C Programming Language课程性质:任选课课程类别*:学术知识类课程代码:周学时:4 总学时:32(其中实验6学时)学分:2先修课程:电路、电子技术基础、C语言开设专业:计算机应用、自动化、电气工程、电子、通信、机电等相关专业三、课程简介《AVR单片机C语言程序设计》是一门重要的专业技术课程,是任选课。
主要内容有: AVR Studio集成开发环境的使用、 AVR单片机的基本结构、基础程序设计、通用I/O接口的基本结构、ATmega16的中断系统、定时/计数器的结构、模数转换器ADC、proteus在avr atmega16单片机系统设计中的应用等知识以及相关应用实例程序。
通过学习这些实例程序,可以在不花费硬件成本的前提下,学习和开发avr单片机应用系统,通过该课程的学习对学生以后找工作有利。
四、课程目标《AVR单片机C语言程序设计》是一门重要的专业技术课程。
主要内容有:AVR Studio集成开发环境的使用、 AVR单片机的基本结构、基础程序设计、通用I/O接口的基本结构、ATmega16的中断系统、定时/计数器的结构、模数转换器ADC、proteus在avr atmega16单片机系统设计中的应用等知识以及相关应用实例程序,通过学习本课程,使学生能够掌握AVR单片机C语言编程,并对嵌入式系统的开发有一个整体的了解。
在高校实验中avr单片机与C语言应用
摘要:针对我院实验教学中新开avr单片机原理课程,本文对学校实验课程提出新的方法和可行编程方法。
我院计算机本科教学基础课开设c语言编程,控制专业新开专业基础课avr单片机,本论文对avr单片机与c语言应用及命令,编程,程序举例说明:使学生有效学习avr单片机原理课程,更有效提高了学生兴趣,提高教学质量。
关键词:avr;单片机器;c语言
中图分类号:tp368.1 文献标识码:a 文章编号:1674-7712 (2013) 04-0092-01
一、avr与c语言结合安装办法
计算机使用c语言编程肯定要使用到c编译器,学生把写好的c 程序编译为机器码,单片机才能执行编写的程序。
avr是众多单片机应用开发软件中优秀的软件之一,它支持众多不同公司的特殊芯片,具备编辑,编译,仿真等于整体,支持c语言的程序设计,学生用界面和常用的微软vc++的界面相似,界面直接,简单易学易用,学生在调试c语言程序,实验软件仿真方面也有很好的功能。
因此实验教学应用很广泛,实验室先要安装它。
下载软件环境软件安装:哪些是你所需要的采用gnu c语言开发环境你需要下列:
binutils-2.11.2.tar.bz2或者安装到/usr/local/atmel下。
这是为了使这些程序和普通linux c语言编译器分开。
ftp:
///pub/gnu/binutils/下载,和应用使用
gcc-core-3.0.3.tar.gz1是一个商业的软件,对于我们学生可以到中国代理免费公司的网站上下载一份能编译2k的demo版软件,基本可以满足学生学习和对微型应用程序的开发。
二、学习怎么配置编程环境
这也是本文的主要内容,针对我院实验环境,对模块化的应用程序是有一个很好的程序结构的应用。
avr c语言程序有两种方法用户文件,以c程序文件,还有.h头文件,在程序中编写过程中需要.分别c文件中包含.h头文件。
学生对出现重复包含或者头文件包含错误的问题,我当时也时常为这种问题而困惑。
下面我以我写的程来给大家说明一下,优秀的编程文件结构。
如下图:下载程序例子电机控制案例。
三、针对avr单片机用c语言编程优势
我院对于控制计算机专业学生,要求学生掌握很强实验能力,我院开了avr课程。
其优势如下:avr往往设有看门狗电路,具有看门狗动作,使计算机复位归零,这就是计算机热启动。
机器热启动时,一般不允许从头开始,这将使存在已测量到或计算到的值复位归零,导致系统工作出现异常。
因而在程序必须判断是否出问题,简便的方法是:确定计算机内存单位为标志位(如0x7f位和0x7e 位),计算机启动时首先读该内存单元的内容,如果它等于一个特定的值(例如两个内存单元的都是0xaa),就是热启动,反之就是冷启动,计算机程序执行初始化,并将0xaa值赋与这两个内存单元。
本文针对我院学生实验课,主要介绍了avr单片机与c语言应用方法命令集应用,学习怎么配置编程环境:针对我院新开的课程有效提高学生实验能力编程技巧。
本文中介绍的数字增益控制电路用单片c语言编程实现,电路参数调整灵活快捷,同时也实现了电路板的小型化语言编程环境。