
单片机发光二极管以200MS闪烁,数码管以0到59S循环计数
#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintsbitwela=P2^7;sbitdula...
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit led=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
{
num1=0;
led=~led;
}
}
void T1_time()interrupt 3 这个中断,我可以理解为 时间到1分钟时候,然后清零,再重新从0开始计数,是这样吗 ,谢谢 。请大家用通俗易懂的解释下,就这个中断的 服务程序,我看的有点不懂,谢谢
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)
{
num2=0
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
}
} 展开
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
sbit led=P1^0;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
void delayms(uint);
void display(uchar,uchar);
uchar num,num1,num2,shi,ge;
void main()
{
TMOD=0x11;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=1;
while(1)
{
display(shi,ge);
}
}
void display(uchar shi,uchar ge)
{
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delayms(5);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delayms(5);
}
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void T0_()interrupt 1
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num1++;
if(num1==4)
{
num1=0;
led=~led;
}
}
void T1_time()interrupt 3 这个中断,我可以理解为 时间到1分钟时候,然后清零,再重新从0开始计数,是这样吗 ,谢谢 。请大家用通俗易懂的解释下,就这个中断的 服务程序,我看的有点不懂,谢谢
{
TH1=(65536-45872)/256;
TL1=(65536-45872)%256;
num2++;
if(num2==20)
{
num2=0
num++;
if(num==60)
num=0;
shi=num/10;
ge=num%10;
}
} 展开
2个回答
展开全部
就是这个意思,时间到59s后就重新从0开始数。
中断的时间大约是50ms,num2=20表示来20次中断的时候1s时间到,然后要显示的数num就加一,当num加到60的时候变成0,又从0开始数。
用定时器做时钟本来就不准,这个45872应该是根据硬件微调得到的。只需要理解作者的意思就可以了,了解中断的用法就好了,不必深究。
中断的时间大约是50ms,num2=20表示来20次中断的时候1s时间到,然后要显示的数num就加一,当num加到60的时候变成0,又从0开始数。
用定时器做时钟本来就不准,这个45872应该是根据硬件微调得到的。只需要理解作者的意思就可以了,了解中断的用法就好了,不必深究。

2024-07-18 广告
稳频稳压电源哪家好?艾普斯电源(苏州)有限公司开始专业研发、制造及营销交流稳压电源,满足全球电子及信息业对电源设备日益蓬勃的市场需求。迄今为止,业已发展成为交流不间断电源、稳压电源、变频电源、中频航空- 军事专用电源、直流电源、逆变电源等产...
点击进入详情页
本回答由艾普斯提供
展开全部
void T1_time()interrupt 3 这个中断,我可以理解为 时间到1分钟时候,然后清零,再重新从0开始计数,是这样吗 ,谢谢 。请大家用通俗易懂的解释下,就这个中断的 服务程序,我看的有点不懂,谢谢
{
TH1=(65536-45872)/256 ; //装入定时器1高8位的初值
TL1=(65536-45872)%256; //装入低8位初值
num2++ ; //变量num2自加1
if(num2==20 ) // 如果变量num2等同于20,则
{
num2=0 // 初始化num2
num++; //num2自加1
if(num==60) //如果num等同于60
num=0; //初始化num
shi=num/10; //十位数等于num/10的整数值
ge=num%10; //个位数等于num/10的余数
}
}
{
TH1=(65536-45872)/256 ; //装入定时器1高8位的初值
TL1=(65536-45872)%256; //装入低8位初值
num2++ ; //变量num2自加1
if(num2==20 ) // 如果变量num2等同于20,则
{
num2=0 // 初始化num2
num++; //num2自加1
if(num==60) //如果num等同于60
num=0; //初始化num
shi=num/10; //十位数等于num/10的整数值
ge=num%10; //个位数等于num/10的余数
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询