avr 单片机 atmega16 编写程序 用中断来控制 按下一个按钮 一个数码管加1

#include <mega16.h>
int shu[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int time=0;

interrupt [EXT_INT0] void ext_int0_isr(void)
{ time++;

}

void main(void)
{ DDRB=0XFF;

GICR|=0x40;
MCUCR=0x02;
MCUCSR=0x00;
GIFR=0x40;
#asm("sei")

while (1)
{
PORTB=shu[time];

};
}
这程序 无法计数 不知道怎么搞的 求大侠指点

第1个回答  2011-11-25
你用的是icc还是gcc软件编的程序,icc中断这样写#pragma interrupt ****:数字
******代表子程序名 这是声明中断子程序,下边还要在按一般子程序写法写子程序功能如void *****(){} 数字是中断号,每种中断号的数字不一样(如外部中断和定时中断),要看你是用的单片机手册,中断向量一节追问

我用的是 CodeVisionAVR C Compiler 编写的

追答

没用过 按这个写试试,不同的软件写c程序都会有点差别

第2个回答  2011-11-27
要么看门狗开了,不断复位,要么是中断没设置好(下降沿中断)追问

我是用的 下降沿中断的 是向导来做的

追答

我仔细看了一下,初始化是对的,我没用过AVR,但我知道很多单片机的C编译对这个程序是不能正常工作的,原因是你定义的数据类型是16位的,而很多编译器是用高位存储低位数据,用低位存储高位数据,如你的整型time申请了两个空间分别为a和a+1,当time=1时,低位地址a为0,高位地址a+1为1。当你申请数组int shu[]时,长度没指定,但已经初始化为10,所以编译器会编译为最小的类型char ,那么把shu[time]就会把time的低位地址放到偏移量,即变成shu[0].
楼主请把你的现象说一下,以便容易分析,比如说上电是什么现象,按了按键是什么现象,如果按了按键无响应,请继续按,超过255次,看有没有变化,或者把数据类型改为unsigned char 再试,如果还不行,那么请检查你的电路

追问

我改了数据类型,还是不行呀 ,现象是开始显示0.按下中断按键后 很快跳到1,然后又很快跳到0,就不动了,在按也是一样

追答

应该是复位了,复位后又从头来,你按按键快上点,连按几个,看能不能跳到2或者比2大的数

追问

我是画的仿真图,更本没有画什么复位,怎么更复位有关 搞不懂

追答

你的看得不太清楚,你的数码管怎么不加限流电阻啊,做这行的不能乱来啊。一定要注意每一个参数

本回答被提问者采纳
第3个回答  2012-05-24
全局中断没有设置:在GIFR=0X40;后面写:SREG|=0X80;
第4个回答  2011-11-25
中断的寄存器设置有问题,仔细看看资料追问

我是用向导来写的中断 因该不会错吧,那你觉得怎么写 求大虾指点

第5个回答  2011-11-25
中断函数不是这么写的追问

我用的向导写的中断 因该不会错吧

追答

你用的什么编译的?

高分悬赏AVR ATmega16程序 程序要求 :当输入方波信号小于7.5hz时,断开...
给你个思路吧:利用单片机的外部中断作为信号输入口,上升沿触发或下降沿触发都可以,在其中断服务函数设置一个计数用的全局变量,我们设这个变量为N,这个服务函数每触发一次N的值加1。然后利用一个计时器,设置为每秒钟触发一次中断,在计时器中断服务函数中,使用由外部中断统计的变量N,这就知道了每秒...

ATmega16单片机学习(5)看门狗—watchdogtimer
1. 在同一个指令内把WDTOE和WDE置为1,即使WDE已为1。2. 紧接的四个时钟周期内把WDE置为0。ICC编程 复位看门狗指令为WDR()。初始化看门狗,设定相应时间,并封装成函数。编写关闭看门狗的函数。在之前的数码管实验中,加入看门狗。通过程序观察,喂狗程序需时2秒,并在循环中执行。当单片机死机...

AVR单片机ATmega16中的查询方式和中断方式是什么意思
查询方式即使用循环,在循环中检测是否改变。改变了就做某些处理,处理完再循环,不变则继续循环。中断方式即改变了才引发中断,在中断中做某些处理。两种方式各有优缺点。查询方式响应快,单片机累(不能睡眠)。中断方式响应慢,单片机轻松些(可睡眠)

AVR单片机定时器中断问题
如果中断全能打开了就会产生中断;就像51的定时器计算定时值(假如方式1):(65536-初始值)*Fosc\/12,这个12就是12分频了;不知我有没解释清楚。

如何在液晶上显示汉字,单片机用的ATmega16,液晶是1602,求详细代码...
1、此款采用并口ISP下载线,配AT89S52单片机,可以很方便的下载程序到单片机。下载后不用插拔线缆, 下载好后自动直接运行程序。2、USB供电系统,直接插接到电脑USB口即可提供电源,不需另接直流电源。 3、8位数码管(可做数码管的静态扫描以及动态扫描显示实验 不如 0-999 计数器实验 18B20温度检测实验 遥控解码实验等...

AVR单片机实用C语言程序设计与典型实例目录
第一章从单片机概述开始,详细介绍了AVR单片机的性能特点、型号与编号意义,以及常见的AVR开发工具。第二章深入探讨AVR的基本硬件资源,包括ATMEGAl6基本硬件结构、总体结构、系统时钟、电源管理、睡眠模式、系统控制、复位、中断、串行外设接口、通用串行口、定时器\/计时器等。第三章介绍GCC的AVR编程,涵盖GNI...

求一个单片机程序
利用AVR单片机片内的ADC对模拟输入进行转换,并在LED数码管上显示结果。 PS:实验条件⑴ SL-AVRAD编程开发实验板 (2) AVR系列单片机ATMega16(L) (3) AVR单片机的C语言编译器WinAVR (4) AVR单片机下载软件SLISP对不起 没有说清楚吧 在WinAVR下用GCC编写单片机程序 用汇编太辛苦了 老师要求GCC 不过还是多谢了~~ 展...

我想学习单片机
第一步:数字I\/O的使用 使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I\/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出...

关于单片机学习,学了51,又学什么???【请高手和前辈指点】
单片机的硬件结构首先要有一个基本的了解,最起码要知道各引脚的功能、区别,能自己动手搭一个单片机的最小系统,然后就可以直接从程序入手,程序最好还是用 C 语言编程,从简单的跑马灯做起,逐渐深入,陆续可以做一些数码管、液晶、 DS1302 、 DS18B20 等电子元器件的应用,在深入就可以结合一些具体实例扩展一些中断、串口...

单片机学好
第一步:数字I\/O的使用 使用按钮输入信号,发光二极管显示输出电平,就可以学习引脚的数字I\/O功能,在按下某个按钮后,某发光二极管发亮,这就是数字电路中组合逻辑的功能,虽然很简单,但是可以学习一般的单片机编程思想,例如,必须设置很多寄存器对引脚进行初始化处理,才能使引脚具备有数字输入和输出输出...

相似回答