一、案例要求
设计一个显示00~59的2位秒表。用单片机控制2个LED静态显示。
二、案例分析
单片机有4个并行I/O口P0~P3,每个I/O口包括8条I/O口线。采用P1口、P2口来控制2个共阳极LED的段码,公共端com接在+5V上。P1口控制的LED显示十位数,P2口控制的LED显示个位数,从0开始显示。显示到59后,重新从0开始显示。
三、案例仿真电路
三、案例代码
//功能:静态LED显示2位秒表
#include<reg51.h>
//函数名:time50ms
//函数功能:T0工作方式1定时50ms
void time50ms(unsigned char i)
{
unsigned char k;
for(k=0;k<i;k++) //循环i次
{
TH0=(65536-50000)/256; //定时初值高8位
TL0=(65536-50000)%256; //定时初值低8位
TR0=1; //启动T0
while(!TF0); //查询是否到50ms
TF0=0; //50ms定时时间到,将标志位清零
}
}
void main()
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//共阳极数码管从0-9的字形码
unsigned char i;
TMOD=0X01; //T0工作方式1,定时功能
P1=0XFF; //熄灭数码管的十位
P2=0XFF; //熄灭数码管的个位
while(1)
{
for(i=0;i<60;i++)
{
P1=led[i/10]; //显示十位
P2=led[i%10]; //显示个位
time50ms(20); //定时1秒
}
}
}
四、案例延伸
将上述代码修改一下便可以实现10-1的倒计时秒表:
#include<reg51.h>
void time50ms(unsigned char i)
{
unsigned char k;
for(k=0;k<i;k++)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
}
void main()
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char i;
TMOD=0X01;
P1=0XFF;
P2=0XFF;
while(1)
{
for(i=10;i>=1;i--)//从10倒数到1,1秒数一次
{
P1=led[i/10];
P2=led[i%10];
time50ms(20);
}
}
}