电工优优今天要和大家分享的单片机相关信息,接下来我将从89C52来做定时记数器程序,51定时程序这个方面来介绍。
使用89C52来做定时记数器/***************************************************************功能:实现单片机定时记数器
***************************************************************/#include "reg51.h"sbit DsDat=0x94; /*定义数据位输入给74ALS164数据位就是从P14出去的*/sbit DsClk=0x95; /*定义脉冲信号给164,脉冲信号是从P15出去的*/sbit Gw=0x90; /*定义个位定形P10*/sbit Sw=0x91; /*定义十位P11*/sbit Bw=0x92; /*定义百位P12*/sbit Qw=0x93; /*定义千位P13*/sbit sw1=P3^2; //启动计时器按钮sbit sw2=P3^3; //结束按钮sbit sw3=P3^4; //查看按钮总分钟按钮
/*------------------------------------------------功能:对应0--9显示码.-------------------------------------------------*/unsigned char code Led_Show[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80};//{0x50,0xf5,0x68,0x4a,0x47,0xc2,0xc0,0x5b,0x40,0x42,0x41,0xc4,0xf0,0x4c,0xe0,0xe1,0xff};unsigned int ms=0;//1000MS为1S作为中间变量unsigned char ss=0;//作为秒的中间变量static unsigned int nn=0;//分的中间变量static unsigned int all_nn=0;//总的时间分钟unsigned int ms1=0;//定时器1 MS的中间变量unsigned int ss1=0;//定时器1 秒的中间变量static unsigned char alltime_show=0;//显示总分钟的标示static unsigned char time_shong=0;///*-------------------------------------------------功能:1MS延时子程序-------------------------------------------------*/void Delay_xMs(unsigned int x){unsigned int i,j;for( i =0;i < x;i++ ){for( j =0;j<500;j++ );}}
/*-------------------------------------------------功能:数码管显示子程序-------------------------------------------------*/void Hc164(unsigned chartemp ){//temp是要显示的定符unsigned char i,temp1;temp1 = Led_Show[temp];for(i = 0;i < 8;i++ ){// DsClk = 0;/*先不给脉冲给164*/if( temp1 & 0x80 )DsDat = 1;/*数据不传输*/elseDsDat= 0;/*一个位的数据传输*/DsClk = 1;/*给脉冲给164*/DsClk = 0;/*先不给脉冲给164*/temp1 <<=1;}}/*to BCD控制 个十百千 位*/void toBCD(unsigned int y1){unsigned char x1,x2,x3,x4,y2,y3,y4;x1=y1/1000;/*显示千位*/if(y1<1000){}else{Hc164(x1);Qw=0;Delay_xMs(1);Qw=1;}y2=y1%1000;x2=y2/100;if (y1<100){}else{Hc164(x2);/*显示百位*/Bw=0;Delay_xMs(1);Bw=1;}
y3=y2%100;x3=y3/10;if(y1<10){}else{Hc164(x3);/*显示十位*/Sw=0;Delay_xMs(1);Sw=1;}
y4=y3%10;x4=y4;Hc164(x4);/*显示个位*/Gw=0;Delay_xMs(1);Gw=1;
}
/*------------------------------------------------定时器0的初始化工作设为1MS中断一次-------------------------------------------------*/void T0_first(void){TMOD=0x01;//定时器0工作方式1TH0=0xFC;TL0=0x66;EA=1;//CPU启动ET0=1;//T/C0开中断TR0=1;//启动记数}/*------------------------------------------------定时器T0关中断--------------------------------------------------*/void T0_out(void){EA=0;//CPU关中断ET0=0;//T/C0关中断TR0=0;//关记数器}/*------------------------------------------------中断函数1MS中断一次--------------------------------------------------*/void timer0(void)interrupt 1 using 1{TH0=0xFC;TL0=0x66;ms=ms+1;if (ms==1000)//够了1S{ms=0;ss=ss+1;if (ss==60)//够了1分了,{ss=0;nn=nn+1;//分钟加1all_nn=all_nn+1;//总的时间分钟加1if(nn==9999)nn=0;if (all_nn==9999)all_nn=0;}}}
///////////////////////////////////////////////////////*------------------------------------------------定时器1的初始化工作设为1MS中断一次-------------------------------------------------*/
void T1_first(void){TMOD=0x10;//定时器1工作方式1TH1=0xFC;TL1=0x66;EA=1;//CPU启动ET1=1;//T/C1开中断TR1=1;//启动记数}
/*------------------------------------------------定时器T1关中断--------------------------------------------------*/
void T1_out(void){EA=0;//CPU关中断ET1=0;//T/C1关中断TR1=0;//关记数器}
/*------------------------------------------------中断函数1MS中断一次--------------------------------------------------*/
void timer1(void)interrupt 3 using 3{TH1=0xFC;//重裁定时器1TL1=0x66;ms1=ms1+1;if (ms1==1000)//够了1S{ms1=0;ss1=ss1+1;if(ss1>=4){//if (time_shong==1)//这说明先前已经有启动按钮按下alltime_show=time_shong;T1_out();//停此定时器1//EA=1;//CPU开中?if (alltime_show==1)T0_first();//重切缕?}}}
/*-------------------------------------------------主程序功能:在数码管上在数码管上显示出启动的总时间,以分钟为单位,如果要查总运行时间请按第三个按钮,如果要停止当前运行状态,请按第二个按钮,如果要启动,请按第一个按钮
-------------------------------------------------*/void main(){while(1){
if (sw1==0){alltime_show=1;ms=0;//中间变量MS清零ss=0;//中间变量ss清零nn=1;//中间变量分清零T0_first();//初始化定时器0}if(sw2==0){alltime_show=2;ms=0;//中间变量MS清零ss=0;//中间变量ss清零nn=0;//中间变量分清零}
if(sw3==0){if (alltime_show!=3)//如果在查看总分钟以前开始按钮被按下时,time_shong=alltime_show;//先保存下来以后有用,alltime_show=3;T1_first();//启动定时器1}switch(alltime_show){case 1://启动记时器{toBCD(nn);//在数码管上显示break;}case 2:{T0_out();//关闭T/C0定时器中断toBCD(nn);//在数码管上显示break;}case 3:{toBCD(all_nn);//显示出总分break;}}if (alltime_show==0)//if (time_go==0&&time_out==0&&alltime_show==0)toBCD(0);//一开始就显示0;}}