AVR-C语言
- 格式:pdf
- 大小:47.59 KB
- 文档页数:3
AVR单片机C语言编译器简介AVR单片机是一种常用于嵌入式系统的微控制器,它具有低功耗、高性能和广泛的应用领域。
要开发适用于AVR单片机的应用程序,需要使用特定的编译器。
在本文档中,我们将介绍AVR单片机C语言编译器的基本原理、常用工具以及一些开发实践。
编译器的作用编译器是一种将高级语言源代码转换为可执行机器代码的软件工具。
对于AVR单片机来说,C语言通常是开发应用程序的主要语言。
AVR单片机C语言编译器能够将C语言源代码转换为针对特定处理器的机器代码,使得程序能够在AVR单片机上运行。
AVR单片机C语言编译器具有以下主要功能:•语法分析和语义分析:编译器会对输入的C语言代码进行分析,检查是否符合语法和语义规则。
•优化:编译器会对代码进行优化,提高程序的执行效率和资源利用率。
•代码生成:编译器会生成与AVR单片机指令集兼容的机器代码。
•错误检查和报告:编译器会检测代码中的错误,并给出相应的错误信息和建议。
常用的AVR单片机C语言编译器在开发AVR单片机应用程序时,常用的AVR单片机C语言编译器有以下几种:1.avr-gccavr-gcc是GNU Compiler Collection (GCC)项目的一部分,是开源的C语言编译器。
它能够生成与AVR单片机兼容的机器代码,并支持多种AVR单片机型号。
2.IAR Embedded Workbench for AVRIAR Embedded Workbench是一款商业化的嵌入式开发工具,它提供了专门针对AVR单片机的C语言编译器。
IAR Embedded Workbench具有强大的代码优化功能,能够生成高效的机器代码。
3.Atmel StudioAtmel Studio是Microchip(原Atmel)推出的一款集成开发环境(IDE),它包含了AVR单片机开发所需的各种工具,包括C语言编译器。
Atmel Studio提供了可视化的开发环境,方便开发者进行程序调试和仿真。
A VR单片机C语言编译器Win-A VR是流行的GNU编译器在A VR平台上的移植。
安装完毕后会在桌面上出现一下七➢ICE〔InCircuitEmulator〕在线仿真器➢JTAG(JointTestActionGroup)联合测试行为组织➢*.hex文件用来向单片机下载的16进制文件➢*.cof文件用来利用A VRstudio进行在线仿真和调试的文件●A VRCOFF〔A VRStudio3.x〕●A VR“Extended〞COFF〔A VRStudio4.07+〕*.hex和*.cof这两个文件不能由AVR-GCC本身生成,需要其他辅助工具来完成这一步,那个工具喊avr-objcopy。
Makefile文件确实是根基一个描述性质的文件,告知make各文件之间的依靠关系,不需要扩展名。
一般在MFile那个程序中生成对应的makefile文件,然后将它复制到PN源文件的文件夹下,就能够进行makeall的命令来实现对源文件的编译了。
一般而言,makefile文件只需要修改一下几个地点。
Mainfilename〔不要带扩展名〕和MCUtype以及Defaultmaketarget,然后点file-?saveas保持到要编译的文件的文件夹下。
C语言小总结➢C语言的标识符是区分大小写的,标识符必须以字母或者下划线开头,下划线开头的标识符一般是编译器定义的。
➢一般而言,要是不是需要使用负整数,尽量使用无符号数整数来表示,如此能够减少系统处理符号的工作,从而提高程序的执行效率。
➢但凡耳目运算符,都能够和赋值符一起组成复合赋值符,C语言中可使用的10中复合赋值运算符:+=;-=;*=;/=;%=;<<=;>>=;&=;^=;|=➢逗号运算符是C语言的一种特别的运算符,其作用是将两个表达式连接起来,C语言对两个表达式分不计算,并将后一个表达式的值作为逗号表达式的值。
运算优先级最低。
#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#include <avr/eeprom.h>#include <avr/pgmspace.h>#define F_CPU 8000000 //时钟源频率int main(void){while(1)//前后台系统{}}SIGNAL(SIG_INTERRUPT0) //外部中断INT0{}SIGNAL(SIG_INTERRUPT1) //外部中断INT1{}SIGNAL(SIG_OUTPUT_COMPARE2)// 定时器/计数器比较匹配中断{}SIGNAL(SIG_OVERFLOW2)// 定时器/计数器2 溢出中断{}SIGNAL(SIG_INPUT_CAPTURE1)// 定时器/计数器2 输入捕获中断{}SIGNAL(SIG_OUTPUT_COMPARE1A )//定时器/计数器1 比较匹配A {}SIGNAL(SIG_OUTPUT_COMPARE1B )//定时器/计数器1 比较匹配B {}SIGNAL(SIG_OVERFLOW1 )//定时器/计数器1 溢出中断{}SIGNAL(SIG_OVERFLOW0 )//定时器/计数器0 溢出中断{}SIGNAL(SIG_SPI )//SPI操作完成中断{}SIGNAL(SIG_UART_RECV)// USART 接收完成{}SIGNAL(SIG_UART_DATA)// USART 寄存器空{}SIGNAL(SIG_UART_TRANS)// USART 发送完成{}SIGNAL(SIG_ADC)// ADC转换完成{}SIGNAL(SIG_EEPROM_READY)// E2PROM 准备就绪{}SIGNAL(SIG_COMPARATOR)// 模拟比较器中断{}SIGNAL(SIG_2WIRE_SERIAL)// TWI 中断{}SIGNAL(SIG_SPM_READY)// 写程序存储器准备好{}。
《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语言编程,并对嵌入式系统的开发有一个整体的了解。
A VR-C语言入门C语言既有高级语言的特点,又可对硬件进行操作,并可进行结构化程序设计。
用C语言编写的程序比较容易移植,它们可生成简洁可靠的目标代码,在代码效率和代码执行速度上完全可以和汇编媲美。
采用C语言进行单片机编程是嵌入式程序设计的发展趋势。
但由于一般教学使用的开发平台Windows下的C-Free或者是VC++6.0等开发环境。
编译单片机的程序必须要有交叉编译器,这与平时教学用的开发环境有很大的差别,本文主要讲解A VR-C语言,主要用于培训。
版权所有!开发平台为Windows操作系统;开发软件为A VR Studio和WinAVR;软件下载地址:/guide_recommend_developer_softw are.html新手入门:/guide_index.html#include<avr/io.h>包含了所有的A VR系列的单片机的IO寄存器,每次必须要加进工程的!否则DDRB、PORTB、PINB 类似的寄存器就不能使用,会编译错误!#include<util/delay.h>定义了一些延时函数,如_delay_us()、_delay_ms()等,但一般不能直接加进工程中!在使用前还需要宏定义:#define F_CPU 800000UL ;如果没有定义,会出现警告:# warning "F_CPU not defined for <util/delay.h>"还有很多头文件都是很常用的,更多的资料到网上搜索!常用的预处理指令:宏定义指令#define#define LED_ON 1#define LED_OFF 0#define SQUARE(x) x * x#define BV(bit) (1<<(bit)) //把某一位置位#undef LED_ON //移除一个宏定义文件包含指令#include<> //包含库文件#include””//包含本地文件条件编译指令#if 表达式代码#endif#if 表达式代码1#else代码2#endif#ifdef _head_ //库文件经常使用此方法避免重复包含代码1#else代码2#endif#ifndef _head_ //库文件经常使用此方法避免重复包含#define _head_代码#endif编写代码的技巧:A.每个不同功能的代码要空行隔开!B.注释要简洁,直接明了!C.每个函数要有说明/*********************************************函数的功能;函数的参数;函数的返回值*********************************************/ D.代码必须注意格式!注意缩进!数据:基本数据:int 、unsigned int 、signed int、char、unsigned char、signed char、特别注意unsigned 无符号型数据,如char的数值范围在-128到127;unsigned char 的数值范围在0到255;变量的名称要有意义,方便阅读!变量的转换要有注意:int -> char 高八位舍弃,把低八位赋给char!关键字:volatile 确保指令不被优化,去要求每次直接访问!主要应用中断处理函数要用到的变量!static 声明为静态变量,变量一直存在!const 声明常量int const a=15;。
//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 8
const 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');//显示电压单位V
DisplayOneChar(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++;
}
}。