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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求一个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控制数码管。
参考技术A //单片机,一个定时器,能使发光二极管亮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++;
参考技术B 首先你这问题不难,现在回答你这问题的难点在于你妹给出电路图。
在此给出你程序的大体思路,
1、写两个子函数,一个是实现8个LED顺序点亮的函数1,俗称的流水灯,另一个是数码管显示“sos”的函数2
2、在主程序中去调用函数1,完了跟着检测按键是否按下,检测到按键后,调用函数1,完了多循环几次函数2的调用来实现你的“显示一段时间后返回LED顺序点亮”
注意:按键检测需要考虑去抖动的问题,写的高大上一点,可以加入定时器,实现你的点亮一段时间。
望采纳,有问题在追加,还不会写可以发电路图出来再说
参考技术C 这个是我自己做的 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

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

请教高人C51单片机C语言中的中断优先级怎么设置?

如果是同时用到几个中断像T0,T1,外部中断0,串口的,这么多个如果要按指定的优先顺序进行处理中断,只设置IP就可以了吗?具体怎么设置?

C51中设置中断优先级,需要对中断寄存器IP进行配置。具体值需要根据用户需要的优先级顺序进行确定,具体的设置方法就是直接写如下C语言语句:

IP = 06H; // 如果5个中断同时发生,则响应次序为:定时器0 -> 外中断1 -> 外中断0 -> 定时器1 -> 串行中断

下面给出IP寄存器中每位(共8位)的含义:
PX0(IP.0),外部中断0优先级设定位;
PT0(IP.1),定时/计数器T0优先级设定位;
PX1(IP.2),外部中断0优先级设定位;
PT1(IP.3),定时/计数器T1优先级设定位;
PS (IP.4),串行口优先级设定位;
PT2 (IP.5), 定时/计数器T2优先级设定位(80C52的T2)
IP.6和IP.7无意义,均为0(在C51中PT2也设置为0)。

ps:IP默认值为00H,此时优先级顺序为:
外部中断0 > 定时/计数器0 > 外部中断1 > 定时/计数器1 > 串行中断
参考技术A 具体设置看书就知道了,自己解决问题,才能真正掌握。优先级,只有两个优先级,也就是说,如果有多个中断,那只能是有一个是最优先的,其它的按照同等处理。 参考技术B 单片机已经定好了中断优先级,你可以进入中断处理函数的时候关掉总中断 参考技术C http://wenku.baidu.com/view/062f262acfc789eb172dc835.html本回答被提问者采纳

以上是关于求一个51单片机简单的中断C语言程序的主要内容,如果未能解决你的问题,请参考以下文章

如何编程实现51单片机每隔 t 时间发出一个脉冲?求C语言详细编程。。。

51单片机中断 C语言?请教!

单片机C语言如何满足条件就立即退出中断函数

交通灯 C语言 单片机。中断函数问题

51单片机c语言中断函数不能进行参数传递,是啥意思,谁能解释一下

请教高人C51单片机C语言中的中断优先级怎么设置?