⑴ 单片机c语言,设计一个计数器,中断一下,数码管显示加1
定义一个数组存放0-9的字型码
code unsigned char led[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f}; //0-9
unsigned char i=0;
int0() interrupt 0 //外部中断0
{
i++;
if(i==10)i=0;
P1=led[i];
}
void main(void)// 主程序
{
IT0=1; //外中断跳变产生中断
EX0=1;
EA=1; //打开总中断
while(1) //主程序循环
{
;
}
}
这样可以一个数码管0-9循环显示。
多位数码管的话,有点麻烦。
见你另一个问题。
⑵ 单片机中断C语言
#include<reg51.h>
#defineucharunsignedchar
ucharcodeledtab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//0-9
ucharscanled;
ucharflag=0;
uchardisdat[6];
voiddelay(unsignedintx)
{
unsignedinti,j;
for(i=0;i<x;i++)
for(j=0;j<120;j++);
}
voiddischg()
{
uchari;
for(i=0;i<6;i++)
disdat[i]=10;
}
voidext0()interrupt0
{
flag=1;
}
voidext1()interrupt2
{
flag=2;
}
voidt1isr()interrupt3 //显示
{
TH1=0xec;
TL1=0x78;
switch(scanled)
{
case0:
P2=0x01;
P0=~ledtab[disdat[5]];
break;
case1:
P2=0x02;
P0=~ledtab[disdat[4]];
break;
case2:
P2=0x04;
P0=~ledtab[disdat[3]];
break;
case3:
P2=0x08;
P0=~ledtab[disdat[2]];
break;
case4:
P2=0x10;
P0=~ledtab[disdat[1]];
break;
case5:
P2=0x20;
P0=~ledtab[disdat[0]];
break;
default:break;
}
scanled++;
scanled%=6;
}
main()
{
uchari,j;
TMOD=0x10;
TH1=0xec;
TL1=0x78;
TR1=1;
ET1=1;
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
scanled=0;
dischg();
while(1)
{
i=0;
switch(flag)
{
case1:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[5]=disdat[4];
disdat[4]=disdat[3];
disdat[3]=disdat[2];
disdat[2]=disdat[1];
disdat[1]=disdat[0];
disdat[0]=i;
delay(200);
}
dischg();
flag=0;
break;
case2:
for(j=0;j<3;j++)
for(i=0;i<10;i++)
{
disdat[0]=disdat[1];
disdat[1]=disdat[2];
disdat[2]=disdat[3];
disdat[3]=disdat[4];
disdat[4]=disdat[5];
disdat[5]=i;
delay(200);
}
dischg();
flag=0;
break;
default:break;
}
}
}
⑶ 单片机用C语言编写中断的范例
#include
sbit
csb_sat=
p1^0;
//定义超声波发生脚
void
delay(void)
//延时25微秒,12t芯片用12m误差
0us
{
unsigned
char
a;
for(a=11;a>0;a--);
}
void
csb_fs(int
dat)
{while(dat--){csb_sat=1;delay();csb_sat=0;delay();}}
//发射
void
main()
{
ea=1;
while(1)
{
csb_fs(10);
delay();delay();delay();delay();delay();delay();delay();delay();delay();
ie=0x83;
//int0允许中断
while(ie);
p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();p1_1=1;delay();p1_1=0;delay();
}
}
void
int0_chuankou(void)
interrupt
0
using
1
//外部int0中断子程序
{
ie=0;//禁止int0中断
}
⑷ c语言怎么编写单片机的中断
外部中断(INT0):
I0(void)
interrupt
0//interrupt
0用于外部中断INT0
{//中断执行的内容}
定时器/计数器中断(T0):
T0(void)
interrupt
1//interrupt
1用于定时器/计数器T0
{//中断执行的内容}
外部中断(INT1):
I1(void)
interrupt
2//interrupt
2用于外部中断INT1
{//中断执行的内容}
定时器/计数器中断(T1):
T1(void)
interrupt
3//interrupt
3用于定时器/计数器T1
{//中断执行的内容}
⑸ 单片机c语言,设计一个计数器,中断一次,数码管数字从0起加1, 4位的数码管
我直接拿一个现成的例子吧。这个是用定时器中断的,你可以改成外部中断。这是8位的数码管,对4位稍加修改就行了。
#include <reg52.h> //包括一个52标准内核的头文件
#include<intrins.h>
/****************************声明函数*****************************/
void x8led(unsigned long ddd);
void delay882us(void);
/*****************************定义IO******************************/
sbit P20=P2^0;
sbit P21=P2^1;
sbit S16=P3^0;
sbit S15=P3^1;
sbit S14=P3^2;
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
sbit P14=P1^4;
sbit P15=P1^5;
sbit P16=P1^6;
sbit P17=P1^7;
bit f=0;//位变量
/***************************定时器2中断**************************/
timer2() interrupt 5
{
static unsigned char t;
TF2=0;
t++;
if(t==30) //T2的预置值0x1000,溢出30次就是1秒钟,晶振22118400HZ
{
t=0;
f=1;//每次长时间的溢出,就置一个标记,以便主程序处理
}
}
/*****************************数码管扫描**************************/
void x8led(unsigned long ddd)
{
unsigned char q,r=0;
unsigned char l[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};
//0-9的字段码
unsigned char xx[8]={0,0,0,0,0,0,0,0};
unsigned char y[8]={0x80,0x40,0x20,0x10,0x8,0x4,0x2,0x1};
xx[0]=ddd%10;
xx[2]=ddd/10%10;
xx[1]=ddd/100%10;
xx[3]=ddd/1000%10;
xx[4]=ddd/10000%10;
xx[6]=ddd/100000%10;
xx[5]=ddd/1000000%10;
xx[7]=ddd/10000000;//求出八位数,分别放在八个变量中
for(q=0;q<8;) //循环扫描
{
q++;
r++;
if(r==8)r=0;
P1=y[r];
P21=1;
delay882us();
P21=0;
P20=1;
P1=l[xx[r]];
delay882us();
P1=0xff;
P20=0;
}
}
/*******************************延时882us*************************/
void delay882us(void)
{
unsigned char i;
for(i=0;i<255;i++)
{
_nop_();
}
}
/*****************************主程序******************************/
void main(void)
{
unsigned long a=0;
RCAP2H =0x10; //赋T2的预置值0x1000,溢出30次就是1秒钟
RCAP2L =0x00;
TR2=1; //启动定时器
ET2=1; //打开定时器2中断
EA=1; //打开总中断
while(1)
{
if(f)//发现标记进入处理
{
f=0;//清除标记
a++;
if(a>99999999)a=0;
}
x8led(a);//将a的值送到数码管显示
}
}
⑹ 单片机定时器中断问题(c语言)
我把你现在给出的这个程序的分析和调试了一下,并且我在里面加入了一些代码使能能够通过串口输出来观察数据,,一开始是进入到xian1()中的,,就是你的显示为0的这个函数中的,然后当nDataToDisplay<200这个条件不满足的时候,程序就开始进入xian()中,也就是你的显示为9999的函数中,,,,然后又循环到一开始的状态。
就函数已经在你指定的地方调用了,,,,如果有问题,,就要检查你的显示函数和相应硬件连接了。
⑺ 单片机c语言中的中断问题
1.void(中断函数返回类型(空型)) Time1 (中断函数名)(void(参数类型) interrupt 3 (中断号)
2: 中断条件发生时执行中断,比如void Time1(void) interrupt 3 是定时器1定时时间到发生中断,中断函数放在那里无所谓
3:void PxInt0(void) interrupt 0 中断名为PxInt0的0号中断
void PxInt1(void) interrupt 2 中断名为PxInt1的2号中断
void time0_int(void) interrupt 1 中断名为time0_int的1号中断
void time1_int(void) interrupt 3 中断名为time1_int的3号中断
4:中断的代码是你想中断执行的工作,中断的代码是根据任务,需要你自己写的
⑻ 51单片机c语言编程中产生中断的条件是什么
三个:
1.总中断使能位EA=1
2.相应中断使能 (ET0、EX0……) 打开
3.中断源:外部中断引脚的电平触发、定时器溢出……
oid PxInt0(void) interrupt 0 //定义外部中断0
void PxInt1(void) interrupt 2 //定义外部中断1
void time0_int(void) interrupt 1 //定义定时器0
void time1_int(void) interrupt 3 //定义定时器1
这里为什么是 0 1 2 3的顺序呢~?其实是单片机内部默认的,顺序依次是:
0 外部中断0
1 定时/计数器0
2 外部中断1
3 定时/计数器1
4 串行口中断
这个是没有什么理由的,记住就行,以后要定义一个中断的时候,定义的是哪一个,就在后面加上它的序号就行了,比如void PxInt0(void) interrupt 0 表示外部中断0,就在后面加上interrupt 0.
逐词解释的话。。。如:void PxInt0(void) interrupt 0
void的意思是没有返回值,Pxint0(void)是你定义的函数名,interrupt表示你定义的是中断函数,0表示你定义的是外部中断0
后面的依此类推。
另外,中断函数不需要在main函数前声明,当单片机检测到中断所需的信号时,它会自动立即停止正在进行的工作进入中断函数。