AVR单片机简单介绍(基于atmega128)

学前准备:

1.C语言:至少学会学入门级的程序,能看懂别人写的函数代码,熟悉其原理。熟练使用关系运算符和位运算。
2.电路:至少能看懂电路图,熟悉各种常用电子元器件的原理和使用,会使用示波器和万用表。


一、单片机的简单介绍:

        作为电子爱好者或者电子行业硬件工程的开发者,单片机技术的掌握是必须的,但是目前很多的初学者选择入门的单片机都是基于MCS-51内核的单片机,虽然此类单片机学习简单,使用方便,但是其性能在很多场合却是大打折扣,要么速度欠缺,要么存储空间欠缺或者耗电量大,因此,由于MCS-51自身的结构所限制,与目前的新技术有明显的脱节。 AVR单片机是近10年来发展起来的新型的、基于增强型 RISC结构的单片机。AVR 在运行速度,低功耗,存储器空间,内部功 能模块的集成性成,高保密度,多种外围接口(I2C,PWM,ISP,IAP,AD)等,以 及在开发技术和仿真,下载调试方面都比 MCS-51 内核的单片机有明显的优势。TS8900-M128 型单片机学习开发板采用 ATMEGA128 芯片作为主控芯片,是专门 针对 AVR 单片机初中高级开发者和电子工程师开发设计的一套多功能系统实验板, 它工作稳定,模块化设计,开发资料齐全,可为学习者提供一个较好的实验开发平台。本文就以此学习板带初学者了解此单片机。

        一个AVR单片机的最小系统电路应包括:1、保证有一个给单片机工作的正确的电源(3.3V 或者 5V);如图的 VCC 电压。2、时钟振荡电路,也就是通常说的晶振电路;(AVR 单片机总体分为内部时钟和外部时钟); 时钟涉及到单片机一个非常重要的问题,熔丝位的配置问题。(初学者应先尽量避免设置熔丝位)3、一个正确的连接下载口或者 JTAG 口, 用来为单片机下载程序或者更新程序,当然,如果是在产品中使用编程器事先给单片机写好程序的话除外。4、一个正确的复位电路。(在实际应用中也可以直接接一个 10K 的上拉电阻。)

        


二、ICCAVR的基础使用:

        初学者如果真的想入手这个领域,作者是非常希望您能购买一块学习板上手操作;购买学习板的话,商家会提供相应的视频、中文资料和配套编译和烧写的软件,按照对应的流程安装即可。这里使用的编译软件是ICCAVR。

        打开ICCAVR,建立一个New Project,建立一个New File(点击File--Save As...来保存一个.c文件);右键点击右边工作栏中的Files,点击Add  File(s)添加前面保存好的.c文件;接下来就可以在工作区开始编写你的程序了。

        如图,PA0~PA7控制着8个流水灯的电路,PE2起到了限流的作用;解读:1、PA0~PA7输出低电平;2、PE2输出高电平。满足这两个条件,灯就可以亮了。PORTX(X代表电路中对应的字母)为数据寄存器,控制对应端口的高低电平("1"为高电平,"0"是低电平);DDRX(X代表电路中对应的字母)为数据方向控制寄存器,控制对应端口的输入输出("1"为输出,"0"是输入)。

    

        在C语言里,我们至少要使用一个为<stdio.h>的头文件;在这里,我们至少需要一个为<iom128v.h>的头文件(目前我所了解到常用的头文件还有<macros.h>),然后就开始编写主函数了。

        首先,我们要对学习板进行初始化设置(用到什么端口就调什么端口)。

unsigned int i;

//初始化代码
DDRA = 0xFF;
PORTA = 0xFE;
DDRE |= (1<<2);
PORTE |= (1<<2);

        然后,编写流水灯的循环程序。

while(1)
 {
  if(i<8)
  PORTA = (~(~PORTA)<<1);
  delay_nms(1000);
  if(i==8)
  {
  i=0;
  delay_nms(1000);
  }
 }

         延迟函数的编写

void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1250;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }
  

        至此,简单的流水灯程序就编写完成了。附上完整代码:

#include<iom128v.h>

void main(void)
{
 unsigned int i=0;

 DDRA = 0xFF;   //0b1111 1111    全输出//数据方向控制寄存器
 PORTA =0xFE;    // 0b11111110   0号位低电平//数据寄存器
 DDRE |= (1<<2);    //0b0000 0100  2号位置1
 PORTE |= (1<<2);    //0b0000 0100  2号位置1 

 while(1)
 {
  if(i<8)
    PORTA = (~(~PORTA)<<1);
  delay_nms(1000);
   if(i==8)
    {
     i=0;
     delay_nms(1000);
    }
 }

}

void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1250;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i<n;i++)
   delay_1ms();
  }

好了,学会了的话就赶紧去试试吧!

<think>好的,我现在需要解决用户遇到的编译错误:在编译Arduino的IRremote.cpp时出现“找不到avr/interrupt.h文件”的问题。用户可能是在使用较新版本的Arduino IDE或者某个支持不同架构的库,而旧版本的IRremote库可能主要针对AVR芯片(如Arduino UNO)编写,导致在非AVR平台(比如ESP8266、ESP32)上编译时出现头文件缺失的问题。 首先,我应该确认这个错误的常见原因。avr/interrupt.h是AVR单片机特有的头文件,用于中断处理。如果用户的开发板不是AVR架构(比如使用的是ESP系列),那么编译器自然找不到这个文件。此外,某些更新后的库可能已经移除了对AVR特定代码的依赖,或者需要条件编译来处理不同平台。 接下来,可能的解决方案包括: 1. **检查开发板类型**:确认用户是否在使用AVR开发板(如UNO、Mega),如果是非AVR的,可能需要修改库代码以适配当前平台。 2. **更新或替换IRremote库**:较新的库版本可能已经修复了这个问题,或者有专门支持非AVR的库分支。 3. **修改库代码**:注释掉或条件编译涉及AVR特定头文件和代码的部分,特别是在使用非AVR芯片时。 4. **调整定时器配置**:IRremote库可能依赖特定的定时器设置,不同芯片的定时器配置方式不同,需要根据硬件调整。 另外,用户提供的引用内容中有提到红外发射的接线和定时器设置,特别是引用[3]中的定时器禁用PWM的宏定义,这可能与中断处理相关。因此,检查IRremote库中关于定时器和中断的代码部分是否正确地适配了当前硬件平台是关键。 可能的错误点是在IRremote库的某个部分,比如IRremote.cpp中,有条件地包含了avr/interrupt.h,而没有为非AVR平台提供替代方案。例如,代码中可能有类似#ifdef __AVR__的条件判断,但在其他平台下没有正确处理中断相关的函数。 我需要指导用户检查这些部分,并建议他们使用条件编译指令(如#if defined(ESP8266)或#if defined(__AVR__))来分隔不同平台的代码。此外,建议用户查找是否有社区维护的IRremote库版本,这些版本可能已经解决了跨平台兼容性问题。 最后,确保用户正确安装了适合其硬件的库版本,并在必要时手动修改库文件,或者寻找替代的库(如IRremoteESP8266),这些库专为ESP系列设计,避免了AVR特定的依赖。</think>### 解决 Arduino IRremote.cpp 编译错误 "avr/interrupt.h 文件缺失" 的步骤 #### 1. **分析错误原因** 此错误通常是由于以下原因导致: - **非AVR开发板**:当前项目使用的开发板(如ESP8266、ESP32)**非AVR架构**,而 `IRremote` 库默认包含AVR专用头文件 `avr/interrupt.h`,在其他平台上该文件不存在[^1][^2]。 - **旧版本库兼容性问题**:部分旧版 `IRremote` 库未对非AVR平台做适配,需手动修改代码。 --- #### 2. **解决方案** 根据硬件类型选择对应方法: ##### **情况1:使用AVR开发板(如Arduino UNO)** - **修复库路径**:确保Arduino IDE已正确安装AVR支持包(通过“开发板管理器”安装)。 - **检查库版本**:使用最新版 `IRremote` 库(GitHub仓库或Arduino库管理器更新)。 ##### **情况2:使用非AVR开发板(如ESP8266/ESP32)** - **方案一:修改库代码** 1. 定位到 `IRremote.cpp` 文件中的以下代码段: ```cpp #include <avr/interrupt.h> // 删除或注释此行 ``` 2. 查找所有 `ISR()` 或 `sei()`、`cli()` 等AVR专用中断函数,替换为平台适配代码。例如: ```cpp #if defined(__AVR__) #include <avr/interrupt.h> #elif defined(ESP8266) || defined(ESP32) // 使用ESP平台的中断函数替代 #endif ``` 3. 重新编译验证。 - **方案二:使用替代库** 推荐使用专为ESP系列优化的 `IRremoteESP8266` 库: 1. 在Arduino IDE中卸载原 `IRremote` 库。 2. 安装 `IRremoteESP8266`(通过“库管理器”搜索安装)。 3. 代码中替换头文件: ```cpp #include <IRremoteESP8266.h> ``` - **方案三:调整定时器配置** 若错误涉及定时器(如 `TIMER_DISABLE_PWM`),需根据硬件修改定时器初始化代码。例如: ```cpp // 针对ESP8266的定时器设置 #if defined(ESP8266) #define TIMER_DISABLE_PWM (T1CTRL &= ~(1 << TEN)) // 示例伪代码 #endif ``` 具体配置需参考硬件文档[^3]。 --- #### 3. **验证与测试** - 编译前确保已选择正确的开发板型号(如“NodeMCU 1.0”对应ESP8266)。 - 若仍报错,检查是否有残留的AVR专用代码(如中断服务例程 `ISR(TIMER1_COMPA_vect)`)。 --- #### 代码示例(ESP8266适配) ```cpp #include <IRremoteESP8266.h> IRsend irsend(3); // 指定红外发射引脚 void setup() { irsend.begin(); } void loop() { irsend.sendNEC(0x00FFE01F, 32); // 发送NEC协议红外信号 delay(1000); } ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值