注:文章内容来源于网络,真实性有待确认,请自行甄别。
一个简单的单片机程序问题函数功能:用LED灯数码管显示计数器对T
发表于:2024-10-24 00:00:00浏览:6次
问题描述:功能:用LED灯数码管显示计数器对T0的计数值。
#include<reg52.h>
unsigned char x;
unsigned char s[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P34=P3^4;
delay1ms(int i) //1秒基准延时函数
{
int j;
while(i--)
{for(j=0;j<115;j++);}
}
void display(unsigned char x)
功能:用LED灯数码管显示计数器对T0的计数值。
#include<reg52.h>
unsigned char x;
unsigned char s[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
sbit P34=P3^4;
delay1ms(int i) //1秒基准延时函数
{
int j;
while(i--)
{for(j=0;j<115;j++);}
}
void display(unsigned char x)
{
P2=0xef;
P0=s[x/1000];
delay1ms(5);
P2=0xdf;
P0=s[x%1000/100];
delay1ms(5);
P2=0xbf;
P0=s[x%1000%100/10];
delay1ms(5);
P2=0x7f;
P0=s[x%1000%100%10];
delay1ms(5);
}
void main(void)
{
TMOD=0x06;//TMOD=000 0110B
EA=1; //开放总中断
ET0=1; //允许定时器T0的中断
EX0=1;//允许外中断INT0
IT0=1;//INT0为下负脉冲触发方式(TCON的,处理外部中断)
TR0=1;//启动T0(TCON的处理定时器工作的)
TH0=TL0=256-1;//计数器T0高8位赋初值25566
while(1)
{
//x=TL0;
display(x);
}
}
//INT0终端函数(中断服务函数)
void clear() interrupt 0
{
x=0;
}
//T0 计数器中断 ()
void Key_counter() interrupt 1
{
if(P34==0)
{
delay1ms(20);
if(P34==0)
{
x=(x+1)%10000; //因为是4位数码管显示 所以要把计的数控制在10000以内(000~999)
}
}
}
有几个小问题:
1.这个程序执行的流程可以大致说一下吗?
2.在主函数的while里面,为什么要把x=TL0注释掉?
3.void clear() interrupt 0里面的x=0;可以理解为对x赋初值吗?
谢谢!
1 大致分为3 个模块,显示函数,中断,主函数,流程如下:首先进入主函数,打开计数器开关和外部中断开关,然后进入中断服务函数,开始计数.
2,在while(),只需显示就可以了,因为在中断中已经对x计数赋值了,所以不需要了
3.可以那样理解,不过最好说成清零,因为在keil c 中默认初值为0,如果你不对其进行赋值的话.
不知道是你自己写的程序不?主函数里面最好不要放中断设置,放到初始化函数中,这样就显得有条理了.我也是学单片机的,大家共同交流
栏目分类全部>