一、实验目的

1. 理解单片机中断的概念。

2. 掌握外部中断的编程方法。

二、实验内容

1. 验证课堂例题

编译下载运行课堂例题——“按键次数显示”(INT_EX1)和“按键次数显示清零”(INT_EX2),查看运行结果。理解程序的编程思想和程序执行过程。

2. 设计程序

参考上述例题的电路和编程思路,自行设计电路,包括三个按键K1、K2和K3,分别连接外部中断INT0-INT2,6位数码管显示,1个LED报警灯;编程实现K1按键次数的显示,显示数据清零和次数越限报警等功能。

具体要求如下:

(1)初始状态下,数码管显示“200000”,其中后两位用于K1按键次数显示,前两位用于当前按键次数报警阈值显示(报警阈值初始为20);

(2)每当K1按下时,后两位数码管显示K1按下次数,计数到报警阈值时不再进行累加;

(3)当计数超过当前设置的报警阈值时,LED进行点亮报警,此时再按下K1不再进行计数;

(4)K2按下时,显示计数值清零并且LED熄灭,即解除报警。

(5)K3每按下一次,按键次数报警阈值在20、15、10、5间进行循环转换,并在数码管前两位进行当前报警阈值的显示,并且显示计数归零。

在设计报告中,需进行总体设计思路描述,给出所涉及到的主程序、中断程序、关键功能子函数的流程图和设计代码。描述程序调试结果及出现的问题。

三、实验结果

1. 在下方贴出使用Proteus绘制的电路原理图。

2. 描述所设计程序的总体设计思路(包括根据任务划分的程序顶层结构、各任务的设计思路、各任务间的数据传递,如何解决关键问题等)

总体思路:初始化IO口,配置中断,数码管初始化,编写中断函数INT0通过K1控制按键计数、中断函数INT1通过K2控制数码管后两位清零、中断函数INT2通过K3切换阈值并使数码管后两位清零。

3.根据所设计的程序顶层结构,对主函数、中断函数(如果没有使用中断可不写)、关键功能子函数的设计思路进行简单描述,并给出各函数的流程图(用Visio画)

主函数main():初始化各个IO口,打开总中断,不断调用LED显示函数。

LEDshow(): 进行从0到5的for(i)循环,,进行数码管位选选择第i个数码管,进行数码管段选显示数组LEDBuf[i]。

Increase_INT0_Ir():K1按下数码管最后一位加1,直到达到设定的阈值,到达阈值后计数不再增加并且点亮LED。

Increase_INT1_Ir():数码管后两位计数值清零并且LED熄灭。

Increase_INT2_Ir():切换阈值并且数码管清零。

4. 给出(3)中相关函数的实现代码(在ICCAVR中进行编程,以截屏贴图方式放入实验报告中,注意规范性,必须加注释)

#include <iom16v.h>
#include <macros.h>

#define uchar unsigned char 
#define uint unsigned int

uchar LEDBuf[6]={2,0,0,0,0,0};//存放数码管显示数据,0-9数字格式
uint j=0;

//延时函数
void delay(uint ms)         //延时函数
{
   uint p,q;
   
   for(p=0;p<ms;p++)
   {
      for(q=0;q<1141;q++);
   }
}

//系统初始化
void Init(void)
{  
   DDRA|=BIT(PA0); //PA0设置为输出状态
   DDRA|=BIT(PA3); //PA3设置为输出状态
   DDRA|=BIT(PA4); //PA4设置为输出状态
 
   DDRB=0xFB;     //K3按键设置为输入端口
   PORTB = 0XFF;  //使能上拉电阻 
   
   DDRC=0xFF; //PC口设置为输出状态 
    
   DDRD = 0X00; //K1 K2按键设置为输入端口
   PORTD = 0XFF; //使能上拉电阻 
   
   MCUCR=0x0A; //下降沿INT0,下降沿INT1
   MCUCSR=0x00;
   GICR|=0b11100000; //允许INT0、INT1、INT2
     
}

//6位共阴极数码管 
uchar const DuanXuan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9
uchar const WeiXuan[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};//从左到右第0-5位数码管

//数码管显示函数
//数码管从左到右刷新一次 
//0-5位数码管显示数据放在LEDBuf[]中,存放0-9数字格式
void LEDshow(uchar LEDBuf[6])              
{   
   uchar i;

for(i=0;i<6;i++)//循环扫描一次
   {   
      PORTC=WeiXuan[i];             //选择第i位数码管
      PORTA|=BIT(PA4);             //PA4输出高电平,位选端拉高
      //delay(1);
      PORTA&=~BIT(PA4);             //PA4输出低电平,位选端拉低,位选锁存
       
      PORTC=DuanXuan[LEDBuf[i]]; //输出段选
      PORTA|=BIT(PA3);            //PA3输出高电平,段选端拉高
      //delay(1);
      PORTA&=~BIT(PA3);            //PA3输出低电平,段选端拉低,段选锁存   
      delay(1);
   }          
}

void main(void)
{  
   uchar i;
  
   Init();                    //调用IO初始化函数
   SREG|=0x80;              //开总中断  
   
   while(1)
   {
     LEDshow(LEDBuf);//调用数码管显示函数
     delay(1);
    }
}

#pragma interrupt_handler Increase_INT0_Ir:2
void Increase_INT0_Ir(void)
{
    if(LEDBuf[5]==LEDBuf[1]&&LEDBuf[4]==LEDBuf[0])
    { 
        PORTA|=0x01; //打开LED
        return;   
    } 
    LEDBuf[5]++;
    if(LEDBuf[5]==10)
    {
        LEDBuf[5]=0;
        LEDBuf[4]++;
        if(LEDBuf[4]==10)
        {
           LEDBuf[4]=0;
        }
    } 
    
}

#pragma interrupt_handler Increase_INT1_Ir:3
void Increase_INT1_Ir(void)
{
   uchar i;
   
   for(i=4;i<6;i++)
   {
       LEDBuf[i]=0;  //后两位清零
       PORTA&=0xFE;  //关闭LED
   }
}

#pragma interrupt_handler Increase_INT2_Ir:19
void Increase_INT2_Ir(void)
{
    j++;
    switch(j)
    {
        case 1:
             LEDBuf[0]=1,LEDBuf[1]=5;
             LEDBuf[4]=0,LEDBuf[5]=0;
             break;
        case 2:
             LEDBuf[0]=1,LEDBuf[1]=0;
             LEDBuf[4]=0,LEDBuf[5]=0;
             break;
        case 3:
             LEDBuf[0]=0,LEDBuf[1]=5;
             LEDBuf[4]=0,LEDBuf[5]=0;
             break;
        case 4:
             LEDBuf[0]=2,LEDBuf[1]=0;
             LEDBuf[4]=0,LEDBuf[5]=0;    
             break; 
    }
    if(j==4)
    {
        j=0;
    }
    return;
}

AVR16单片机--外部中断实验相关推荐

  1. 单片机外部中断实验C语言程序,STC89C52单片机外部中断0实验

    原标题:STC89C52单片机外部中断0实验 / 实现功能: 设置,然后通过点亮与P1口第一个引脚相连的D1来 显示系统进入了外部中断0 实验板型号:BS-XYD-C52 实验名称: 外部中断0测试 ...

  2. 51单片机 | 外部中断实验

    文章目录 一.外部中断介绍 二.外部中断配置 三.硬件设计 四.软件设计 五.实验现象    51 单片机外部中断有 2 个,外部中断 0 和外部中断 1,它们的使用方法是一样的,所以只要学会一个即可 ...

  3. 单片机原理及其应用——单片机外部中断实验(八段数码管通过按键依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)数码管 (二)八段数码管的字形编码 (三)C51变量定义的四要素 (四)中断源 (五)相关的特殊功能寄存器 1.定时器/计数器控制寄存器TCON 2.中断允许控 ...

  4. 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管

    设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...

  5. 一起学mini2440裸机开发(十)--mini2440外部中断实验

    我今天一整天都在试着将TQ2440的那种处理中断的方法(即安装中断向量表)移植到MDK中的mini2440,但是一直没成功,这种方法一直没成功,后来又想,还是先从最简单的开始吧,就是不利用中断向量表, ...

  6. 单片机原理及其应用——单片机定时器中断实验(八段数码管依次显示0~9数字)

    目录 一.实验要求 二.知识要点 (一)单片机定时器/计数器 (二)相关的特殊功能寄存器 1.工作方式寄存器TMOD 2.定时器/计数器控制寄存器TCON (三)定时器/计数器的工作方式 1.工作方式 ...

  7. 51单片机按键控制数码管0~9_51单片机外部中断

    前面为大家介绍的点亮LED灯.数码管.按键只用到了51单片机的IO资源,我们要是仅仅用单片机点灯.操作数码管,那可真是大才小用了.这些都只是51单片机资源的冰山一角,51单片机还有好多的功能,我后面将 ...

  8. 基于Atmega16的外部中断实验

    一.实验目的 1. 理解单片机中断的概念. 2. 掌握外部中断的编程方法. 二.实验内容 1. 验证课堂例题 编译下载运行课堂例题--"按键次数显示"(INT_EX1)和" ...

  9. AT89C51单片机外部中断

    C51单片机外部中断调用P3_2 ,P3_3口. 中断方式有两种,分别为电平方式和脉冲方式. 中断请求有0和1.中断总允许为EA=1, IE0:外部中断请求0标志位: IT0:外部中断0触发方式设置位 ...

最新文章

  1. 微信jsapi支付获取code_微信支付(公众号支付JSAPI)
  2. 巴奴与海底捞的战争背后,“单品即品牌”战略到底香不香?
  3. Python爬虫开发:Request的使用(随机User-Agent)
  4. 解决Windows环境下Git Bash 不能输入中文的问题
  5. 补充一点地理知识(以洲来划分各个国家(240个))
  6. 马尔可夫链的扩展 贝叶斯网络 (Bayesian Networks)
  7. MySQL常用优化指南,及大表优化思路(值得收藏)
  8. 前端程序员 学习书籍推荐
  9. git可视化管理工具sourcetree
  10. yubikey复制_使用YubiKey进行Android应用签名
  11. 计算机纳入高考作文,高考作文听人家说今年的高考作文是用计算机批 – 手机爱问...
  12. debian7 修改系统时间
  13. 有什么好的搜图软件推荐吗?
  14. php cbd架构,ThinkPHP教程--15--CBD模式
  15. win10自带的输入法变成了繁体怎么改回来
  16. Linux,grep命令,在大日志文件中搜索关键字 最后/最开始出现位置
  17. Echarts地图实现闪动气泡,或者加载本地图片,改变颜色和symbolSize大小效果
  18. 如何正确使用步道乐跑
  19. C语言 深度探究C语言中的函数
  20. C/C++——游戏界面设置(graphics)

热门文章

  1. oracle sql查询练习题2带答案(10个)
  2. 偷师饿了么:怎样用HTTP/2优化iOS APP网络层次架构?
  3. R 语言可视化学习之路——基础图形
  4. 小学生使用计算机室电脑的制度,中小学微机室管理制度
  5. 二本程序员投简历被公司嘲讽:过面试的可能性不大,别白跑了
  6. android仿天天动听歌曲自动滚动view
  7. AdminEx响应式Bootstrap后台管理模板
  8. 开发转测试没人要_我做软件测试六年的一些感悟
  9. 下载和中文攻略之更胜黎明前的琉璃色 夜明け前より瑠璃色な
  10. BeginPaint和GetDC有什么区别