单片机小白的秒表代码
作为一个单片机小白,这是我学习单片机的两周来打的第一个秒表程序。
这个程序是在看过另外一个大佬的明白后,才打出来,
我写出来主要是留下个记录,万一以后变动厉害了,也回忆一下,
在这同时如果能帮助到另外的同学我就非常高兴了。
因为是自学 里面可能会有很多错误还请大家赐教。
因为大家用的单片机的配置不太,相对应i/o的对应功能也是不同的。但是对应的原理都是相同的。因为我是初学者,所以的单片机结果就比较简单。
其中还会用到独立按键(作为启动/暂停,还有复位功能)
-
我觉得应该理解好定时器中断(我还没学的很好,所以原谅我,呜呜)
-
程序的主要框架弄好了以后然后用模版编程的思想一步一步凑
-
下面是我的代码段(有错或者不懂麻烦私信我哟)
#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;
}
}