关于一中断服务程序,略有不懂,新手求教~!
时间:10-02
整理:3721RD
点击:
整个程序的框架、功能(实现不同按键控制不同的功能并且在数码管上显示功能号“0001~0004”)我都看懂了。但是对于中断服务程序1(红色部分)对整个系统来说有什么意义,我始终不明白。求大神指教~! PS :为了简化已经删去部分函数的内容,。
/*******头文件*********/
#include"reg51.h"
#include"absacc.h"
/*****数码管断码*******/
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
/*****全局变量*********/
int keyval;
/*****端口定义****/
sfr key=0XB0;
sbit S4=P3^5;
sbit S3=P3^4;
sbit S2=P3^3;
sbit S1=P3^2;
sbit SPEAKER =P2^4;
sbit RELAY=P2^6;
/************按键消抖延时******/
void delay(void)
{
}
/************数码管显示********/
void display(int k)
{
P0=tab[k/1000];
P2=0Xfe;
delay();
P0=tab[k%1000/100];
P2=0xfd;
delay();
P0=tab[k%100/10];
P2=0xfb;
delay();
P0=tab[k%10];
P2=0xf7;
delay();
P2=0xff;
}
/***********LED闪动延时********/
void leddelay()
{
}
/***********LED闪动*****/
void ledflash()
{
}
/*********led流水灯******/
void ledflow(void)
{
}
/*********继电器吸合**********/
void relayon(void)
{
}
/********主程序**************/
void main(void)
{
keyval=0;
key=0xff;
P2=0xff;
P0=0xff;
/*******定时器初始化*****/
EA=1;
ET0=1;
ET1=1;
TMOD=0X11;
TH0=-10000/256;
TL0=-10000%256;
TH1=-100/256;
TL1=-100%256;
TR0=1;
TR1=1;
while(1)
{
display(keyval);
if(keyval==1)
ledflash();
if(keyval==2)
ledflow();
if(keyval==3)
relayon();
if(keyval==4)
ledflash();
display(keyval);
}
}
/*********中断服务程序1**********/
void intsrv1(void) interrupt 1 using 1
{
TR0=0;
display(keyval);
TH0=-10000/256;
TL0=-10000%256;
TR0=1;
}
void intserv3(void) interrupt 3 using 3
{
TR1=0;
if((key&0x3c)!=0x3c)
delay();
if((key&0x3c)!=0x3c)
{
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
if(S3==0)
keyval=3;
if(S4==0)
keyval=4;
}
TH1=-100/256;
TL1=-100%256;
TR1=1;
}
/*******头文件*********/
#include"reg51.h"
#include"absacc.h"
/*****数码管断码*******/
unsigned char code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
/*****全局变量*********/
int keyval;
/*****端口定义****/
sfr key=0XB0;
sbit S4=P3^5;
sbit S3=P3^4;
sbit S2=P3^3;
sbit S1=P3^2;
sbit SPEAKER =P2^4;
sbit RELAY=P2^6;
/************按键消抖延时******/
void delay(void)
{
}
/************数码管显示********/
void display(int k)
{
P0=tab[k/1000];
P2=0Xfe;
delay();
P0=tab[k%1000/100];
P2=0xfd;
delay();
P0=tab[k%100/10];
P2=0xfb;
delay();
P0=tab[k%10];
P2=0xf7;
delay();
P2=0xff;
}
/***********LED闪动延时********/
void leddelay()
{
}
/***********LED闪动*****/
void ledflash()
{
}
/*********led流水灯******/
void ledflow(void)
{
}
/*********继电器吸合**********/
void relayon(void)
{
}
/********主程序**************/
void main(void)
{
keyval=0;
key=0xff;
P2=0xff;
P0=0xff;
/*******定时器初始化*****/
EA=1;
ET0=1;
ET1=1;
TMOD=0X11;
TH0=-10000/256;
TL0=-10000%256;
TH1=-100/256;
TL1=-100%256;
TR0=1;
TR1=1;
while(1)
{
display(keyval);
if(keyval==1)
ledflash();
if(keyval==2)
ledflow();
if(keyval==3)
relayon();
if(keyval==4)
ledflash();
display(keyval);
}
}
/*********中断服务程序1**********/
void intsrv1(void) interrupt 1 using 1
{
TR0=0;
display(keyval);
TH0=-10000/256;
TL0=-10000%256;
TR0=1;
}
void intserv3(void) interrupt 3 using 3
{
TR1=0;
if((key&0x3c)!=0x3c)
delay();
if((key&0x3c)!=0x3c)
{
if(S1==0)
keyval=1;
if(S2==0)
keyval=2;
if(S3==0)
keyval=3;
if(S4==0)
keyval=4;
}
TH1=-100/256;
TL1=-100%256;
TR1=1;
}
顶一下··希望有人帮忙··
稳定数码管显示
稳定数码管显示
void intsrv1(void) interrupt 1 using 1
{
TR0=0; //关定时计数
display(keyval); //调用显示函数
TH0=-10000/256;//重装初值
TL0=-10000%256;
TR0=1; //开定时计数
}
确实少了它以后 数码管显示就乱了。可是我不知道原理是什么?,为什么写在中断程序里面? 而写只写在外部中断里?
写谢谢你回答··· 这个每行的意思我都知道了。但是我不懂这整个中断函数对于整个系统来说的意义。以及工作原理··
你要好好复习下数码管动态扫描的原理
我感觉我看了很多遍书了· 都没讲到这个稳定数码管的问题·1~!~ 还请明示啊 ··
还没弄清楚
数码管要想一直显示,需要不停的扫描,你在主函数while(1)语句里,有好几个子函数,执行这些子函数时,对显示子函数display(),是不执行的,所以数码管显示不正常,在定时中断里加入显示子函数,可以让单片机在执行那些子函数时,对显示子函数也定时执行,数码管显示就正常了。
这回懂了· =。=
谢谢· 这回真懂了~!
学习啦
