/***程序:定时器0***/
/***作者:爱因斯尼@SCUT***/
/***时间:2010.07.23***/
/***必要的头文件和宏定义***/
#include<reg52.h>//51单片机的头文件
#define uint unsigned int//两个常用的宏定义
#define uchar unsigned char
sbit duan=P1^5;//定义段选端
sbit wei=P1^6;//定义位选端
sbit lie=P1^7;//定义点阵的列扫描
uint time_value=9;//全局变量,倒计时初值
uchar beishu=0;//全局变量,通过软件来达到定时的长度
/***数码管字模,放在程序的代码区***/
uchar code SMG[]={
0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xf6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E,0x01};//C,d,E,F,小数点"."
/*********带形参的延时子函数***************/
void delay_ms(uint ms)//毫秒级别
{uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<141;j++);
}
/*********带形参的延时子函数***************/
void delay(uint m)
{uint i,j;
for(i=0;i<m;i++)
for(j=0;j<1148;j++); }
/*********数码管的初始化函数***************/
void Init_smg()
{
P0=0x00;
duan=1;
P0=0x00;//关段选端
duan=0;
P0=0xff;
wei=1;
P0=0xff;//关位选端
wei=0;
lie=1;
P0=0xff;//点阵全灭
lie=0;
}
/****带两个形参的数码管显示子函数****/
void show_smg(uchar num,uchar awei)
{
uchar A=0x80;//这个主要是为了后面的循环移位
P0=0x00;
duan=1; //开段选端
P0=SMG[num];//送段选
duan=0; //关段选端
P0=0xff;
wei=1; //开位选端
P0=~(A>>awei);//送位选
wei=0; //关位选端
delay_ms(1); //稍微延时一下,防止残影
}
/***定时器0的中断函数***/
void time0_int() interrupt 1 using 0
{TH0=0x3c;
TL0=0xb0;
if(beishu==20) //50ms*20=1S
{
if(time_value==0)
{time_value=9;}
else time_value--;
beishu=0;
}
else beishu++;
}
/*****主函数******/
void main()
{TMOD=0x01;//设置定时器0的工作方式
TH0=0x3c;//对定时器0赋初值
TL0=0xb0;
ET0=1;//允许定时器0的中断
EA=1;//允许总中断
TR0=1;//启动定时器0
Init_smg();//数码管的初始化
while(1)//主函数不停在这里检测time_value的值并在数码管上显示
{
show_smg(time_value,7); //在第一个数码管上10S倒计时
}
}
/*******************************************************************************************************/
/***程序:用定时器0做一个简单的秒表***/
/***作者:爱因斯尼@SCUT***/
/***时间:2010.07.23***/
/***必要的头文件和宏定义***/
#include<reg52.h>//51单片机的头文件
#define uint unsigned int//两个常用的宏定义
sbit duan=P1^5;//定义段选端
sbit wei=P1^6;//定义位选端
sbit lie=P1^7;//定义点阵的列扫描
unsigned long int time_value=0;
uchar beishu=0;
/***数码管字模,放在程序的代码区***/
uchar code SMG[]={
0xfc,0x60,0xda,0xf2,//0,1,2,3,
0x66,0xb6,0xbe,0xe0, //4,5,6,7,
0xfe,0xf6,0xee,0x3e, //8,9,A,b,
0x9c,0x7a,0x9e,0x8E,0x02};//C,d,E,F,"-"
/*********带形参的延时子函数***************/
void delay_ms(uint ms)//毫秒级别
{uint i,j;
for(i=0;i<ms;i++)
for(j=0;j<141;j++);
}
/*********带形参的延时子函数***************/
void delay(uint m)
{uint i,j;
for(i=0;i<m;i++)
for(j=0;j<1148;j++); }
/*********数码管的初始化函数***************/
void Init_smg()
{
P0=0x00;
duan=1;
P0=0x00;//关段选端
duan=0;
P0=0xff;
wei=1;
P0=0xff;//关位选端
wei=0;
lie=1;
P0=0xff;//点阵全灭
lie=0;
}
/****带两个形参的数码管显示子函数****/
void show_smg(uchar num,uchar awei)
{
uchar A=0x80;//这个主要是为了后面的循环移位
P0=0x00;
duan=1; //开段选端
P0=SMG[num];//送段选
duan=0; //关段选端
P0=0xff;
wei=1; //开位选端
P0=~(A>>awei);//送位选
wei=0; //关位选端
delay_ms(1); //稍微延时一下,防止残影
}
/***定时器0的中断函数***/
void time0_int() interrupt 1 using 0
{TH0=0x3c;
TL0=0xb0;
if(beishu==20) //50ms*20=1S
{
time_value++;
beishu=0;
}
else beishu++;
}
/***时间显示函数***/
void display_time()
{
uint shi,fen,miao;
shi=time_value/3600;
fen=time_value/60%60;
miao=time_value%60;
show_smg(shi/10,0);
show_smg(shi%10,1);
show_smg(16,2);//在中间显示-
show_smg(fen/10,3);
show_smg(fen%10,4);
show_smg(16,5);//在中间显示-
show_smg(miao/10,6);
show_smg(miao%10,7);
}
/*****主函数******/
void main()
{TMOD=0x01;//设置定时器0的工作方式
TH0=0x3c;//对定时器0赋初值
TL0=0xb0;
ET0=1;//允许定时器0的中断
EA=1;//允许总中断
TR0=1;//启动定时器0
Init_smg();//数码管的初始化
while(1)//主函数不停在这里检测time_value的值并在数码管上显示
{
display_time();
}
}
欢迎光临我们的淘宝网:http://item.taobao.com/auction/item_detail.htm?item_num_id=9447334857
文章评论(0条评论)
登录后参与讨论