求一个51单片机简单的中断C语言程序

比如8只流水灯循环点亮,然后中断触发后全部闪烁几下,响应中断完后继续恢复循环点亮。或者类似的程序都可以,我初学者,网上很多例子是汇编的,看不懂。我需要一个C语言的有中断的简单程序来参考下,希望有文字说明更加好,谢谢了啊~!

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^5;
uchar i;
uchar code table1[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,};
uchar code table[]= {
0x02 , 0x9F, 0x25, 0x0D , 0x99 ,
0x49 , 0x40, 0x1F, 0x00, 0x08,
0x10, 0xC0, 0x62, 0x84, 0X60, 0x70
} ;
uchar num;
uint m;
void delay(uint z);
void main()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
while(1)
{
// EA=1;
// EX0=1;
// IT0=1;
// EX1=1;
// IT1=1;
for(num=0;num<8;num++)
{
delay(50) ;
P2=0X00;
P0=table1[num];
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void enter0()interrupt 0 //第一个中断无源蜂鸣器响,无源蜂鸣器响要给响,需要不停给高低电平。
{
while(1)
{ P0=0X11;
for(i=100;i>0;i--)
beep=~beep;

}
}

void enter1()interrupt 2 第二个中断是数码管从0到F闪烁。
{
while(1)
{
for(i=0;i<17;i++)
{
P2=0XFF;
P0=table[i] ;
delay(200) ;
}
}

}
注释: P0是控制LED, P2控制数码管。
温馨提示:内容为网友见解,仅供参考
第1个回答  2009-11-20
//单片机,一个定时器,能使发光二极管亮1s,灭1s,周而复始。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int

void init();
uchar a = 0;
//----------------------------
main()
{
init();
while(1) {
if(a == 40) a = 0;
if(a <= 20) P0 = 0x00;
else P0 = 0xFF;
}
}
//----------------------------
void init()
{
TMOD = 0X01;
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
TR0 = 1;
ET0 = 1;
EA = 1;
}
//----------------------------
void timer0() interrupt 1
{
TH0 = (65536 - 50000) / 256;
TL0 = (65536 - 50000) % 256;
a++;
}
第2个回答  2020-04-14
首先你这问题不难,现在回答你这问题的难点在于你妹给出电路图。
在此给出你程序的大体思路,
1、写两个子函数,一个是实现8个LED顺序点亮的函数1,俗称的流水灯,另一个是数码管显示“sos”的函数2
2、在主程序中去调用函数1,完了跟着检测按键是否按下,检测到按键后,调用函数1,完了多循环几次函数2的调用来实现你的“显示一段时间后返回LED顺序点亮”
注意:按键检测需要考虑去抖动的问题,写的高大上一点,可以加入定时器,实现你的点亮一段时间。
望采纳,有问题在追加,还不会写可以发电路图出来再说
第3个回答  推荐于2018-04-13
这个是我自己做的 99s的计数器。用数码管显示的,这里使用了中断,其目的是为了通过中断来精确计算真实的时间。如果还有需要,给我邮箱,我这里还有不少资料,我学了2个多月,基本也算有点小成了吧。呵
//自行设计 99s,用数码管显示!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wei=P1^2;
sbit duan=P1^1;
uchar num;
uchar i,j;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管模块
void delayms(unsigned int i) // 毫秒延时
{
unsigned int j;
for(;i>0;i--)
for(j=100;j>0;j--);
}

void fuzhi(uchar x,uchar y)
{
duan=1;
P0=table[x]; //8的共阴码
duan=0;
wei=1;
P0=0xfe; //送位显示码
wei=0;
delayms(5);

duan=1;
P0=table[y]; //8的共阴码
duan=0;
wei=1;
P0=0xfd; //送位显示码
wei=0;
delayms(5);
}

void main()
{
TMOD=0x01; //定时器0 工作方式1
TH0=(65536-45872)/256; //装载初值为11.0592M晶振定时50ms 数为 45872
TL0=(65536-45872)%256;
EA=1; //打开总中断
ET0=1; //开定时器0中断
TR0=1;

while(1)
{
fuzhi(i,j);
}
//程序在此等待中断的到来
}
void T0_time() interrupt 1
{
TH0=(65536-45872)/256; //重装初值
TL0=(65536-45872)%256;
num++; //num每加1次判断一次是否到20次
if(num==20) //如果到了20次,说明1秒时间到
{
num=0;
i++; //num重新置数为0

}
if(i==10)
{i=0; // i超过9 就置为0
j++;
}
if(j==10)j=0 ; //j超过9 就置为0

}本回答被提问者和网友采纳
相似回答