|
#include "reg52.h"
#include "intrins.h"
/****************************************效果:利用定时器和数码管实现:数码管前三位显示7、6、5,后三位显示从432按秒递减到398,然后停止***********************************************/
typedef unsigned char u8;
typedef unsigned char u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u16 temp,t0,t1,bai,shi,ge;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
u8 shu=432;
void init()
{
temp=0xfe;
P2=temp;
shu=432;
TMOD=0x11; //俩定时器同时设置
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET1=1;
ET0=1;
TR0=1;
TR1=1;
}
void delay(u8 z)
{
u8 x,y;
for(x=z; x>0; x--)
{
for(y=70; y>0; y--);//用于动态数码管延时
}
}
void display(u16 aa,u16 bb,u16 cc,u16 bai,u16 shi,u16 ge) //显示函数
{
while(1)
{
LSA=1; LSB=1; LSC=1;
P0=smgduan[aa];
delay(10);
LSA=0; LSB=1; LSC=1;
P0=smgduan[bb];
delay(10);
LSA=1; LSB=0; LSC=1;
P0=smgduan[cc];
delay(10);
LSA=0; LSB=0; LSC=1;
P0=smgduan[bai];
delay(10);
LSA=1; LSB=1; LSC=0;
P0=smgduan[shi];
delay(10);
LSA=0; LSB=1; LSC=0;
P0=smgduan[ge];
delay(10);
P0=0x00;
}
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
t0++;
if(t0==10)
{
t0=0;
temp=_crol_(temp,1);
}
}
void timer1() interrupt 3
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;
bai=shu/100; //拆分各位
shi=shu%100/10;
ge=shu-100*bai-10*shi;
if(shu==398)
{
TR0=0;
TR1=0; //停掉定时器
}
}
}
void main()
{
init();
while(1)
{
display(7,6,5,bai,shi,ge);
}
}
/**************************************************************************************分割线******************************************************************************************/
#include "reg52.h"
/*********************************************效果:利用定时器和数码管实现0到100秒的计时器*********************************************************/
typedef unsigned char u8;
typedef unsigned char u16;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
u16 temp,bai,shi,ge,aa;
u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //段选字码,存在数组中
void delay(u8 z)
{
u8 x,y;
for(x=z; x>0; x--)
{
for(y=70; y>0; y--);//用于动态数码管延时
}
}
void Display(u16 bai,u16 shi,u16 ge) //显示函数
{
while(1)
{
LSA=1; LSB=1; LSC=1;
P0=smgduan[bai];
delay(10);
P0=0x00;
LSA=0; LSB=1; LSC=1;
P0=smgduan[shi];
delay(10);
P0=0x00;
LSA=1; LSB=0; LSC=1;
P0=smgduan[ge];
delay(10);
P0=0x00;
}
}
void time0() //一毫秒,定时器初始化函数
{
temp=0;
TMOD=0x01; //设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
}
void main() //主函数
{
time0();
while(1){
if(aa==20) //定时1秒(一次计时5ms,重复20次开中断
{
aa=0;
temp++;
if(temp==101)
{temp=0;}
bai=temp/100; //拆分各位
shi=temp%100/10;
ge=temp-100*bai-10*shi;
}
Display(bai,shi,ge);
}
}
void timer0() interrupt 1//定时器中断
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
}
两个程序都是一样的问题,数码管该变化的地方始终保持000不变
|
|