单片机秒表小白代码

单片机小白的秒表代码

作为一个单片机小白,这是我学习单片机的两周来打的第一个秒表程序。
这个程序是在看过另外一个大佬的明白后,才打出来,
我写出来主要是留下个记录,万一以后变动厉害了,也回忆一下,
在这同时如果能帮助到另外的同学我就非常高兴了。

因为是自学 里面可能会有很多错误还请大家赐教。

因为大家用的单片机的配置不太,相对应i/o的对应功能也是不同的。但是对应的原理都是相同的。因为我是初学者,所以的单片机结果就比较简单。这是我的数码管显示原理,这里用的是74hc138动态控制
其中还会用到独立按键(作为启动/暂停,还有复位功能)
这是我的独立按键结构,我编程用了K2,K3

  1. 我觉得应该理解好定时器中断(我还没学的很好,所以原谅我,呜呜)

  2. 程序的主要框架弄好了以后然后用模版编程的思想一步一步凑

  3. 下面是我的代码段(有错或者不懂麻烦私信我哟)

#include <reg51.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 flag=-1;
sbit start=P3^2;
sbit reset=P3^3;
sbit a0=P2^2;
sbit a1=P2^3;
sbit a2=P2^4;
u16 num=0,num1=0,minu=0;        //num为进入中断的次数 ,num1也是同样的功能用于表示秒的十分位
u16 counts=0,countm=0;  // 两个作为分,秒的总计数
u8 smgnum[]={ 0x3f  , 0x06 , 0x5b , 0x4f , 0x66 , 0x6d , 0x7d , 0x07 , 0x7f  , 0x6f , 0x77 , 0x7c,0x39 , 0x5e , 0x79 , 0x71}; //不带小数点的数码管显示
u8 smgnum2[]=(0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef)  ;//带小数点的数码管显示
void delay(u16 i)
{
   while(i--);

}
void initime0()
{
  TMOD=0x01;
  TH0=0xB1;
  TL0=0xE0;
  ET0=1;
  EA=1;
  TR0=0;
}
void display();	
u16 s0,s,s1,min1,min2;             //分别代表秒表的秒十分位,秒,秒十位,分,分十
void main()
{
   
	initime0();
	while(1)
	{
	  if(start==0)
	  {
	   delay(5000);
	   if(start==0)
	   {  flag=-flag;
		TR0=~TR0;
		while(!start);
	   } 
    }
	   if(reset==0)
	   {
		delay(5000);
		if(start==0)
		{
		  TR0=0;
		  num=0;
		  num1=0;
		  minu=0;
		  while(!reset);
		}
	   }
	  if(num1>=5)				//表示到100ms->0.1s
	  {
	      num1=0;
	       s0++;   //因为达到了0.1s
		 if(s0>=10)
		  s0=0;
	  }
	  if(num>=50)  //1000ms
	  {
	   num=0;
	   counts++;
	    if(counts>=60)  
		{
		 countm++;
		 counts=0;
		}
	  }
	  if(countm>=60)
	  {
	     countm=0;
		 counts=0;
		 num=0;
		 num1=0;
		 TR0=0;
	  }
	   s=counts%10;
	   s1=counts/10;
	   min1=countm%10;
	   min2=countm/10;
	   if(flag>0)
	   display();

	}

}
void breaktime0() interrupt 1        //定时器0的中断
{
      TH0=0xB1;
      TL0=0xE0;
	  num++;
	  num1++;
}
void display()
{
   { 
    a2=0,a1=0,a0=0;
	P0=smgnum[s0];
	delay(10000);
	P0=0x00;						     //显示秒的十分位
   }	
   {
   	a2=0,a1=0,a0=1;
	P0=smgnum[s];
	 delay(10000);			  //秒的分位,后面的类似
	P0=0x00;
   }
   {
   	a2=0,a1=1,a0=0;
	P0=smgnum[s1];				  //十位
	 delay(10000);
	P0=0x00;
   }
   {
   	a2=0,a1=1,a0=1;
	P0=smgnum2[min1];
	 delay(10000);			 //记得使用有op的数组
	P0=0x00;
   }
   {
   	a2=1,a1=0,a0=0;
	P0=smgnum[min2];
	 delay(10000);
	P0=0x00;
   }						
}
发布了1 篇原创文章 · 获赞 1 · 访问量 56

猜你喜欢

转载自blog.csdn.net/qq_46341900/article/details/105097218