原创 彬太郎51单片机开发板视频教程C语言版之定时器

2011-3-24 09:03 2381 8 8 分类: MCU/ 嵌入式

6a400be0-2144-41d9-8814-1f2e52fb804f.jpgattachment download


/***程序:定时器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

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /3 下一条