单片机使用循环实现秒计时器
1.仿真电路(软件为Proteus)
使用三极管作为流控开关
2.程序(软件为keil)
#include <reg52.h> //52头文件
#define uchar unsigned char //定义方便后面使用
#define uint unsigned int
uchar code SegCode[] = //seg code;定义显示字形码
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar code BitCode[] = //bit code;
{0xfe,0xfd,0xfb,0xf7};
uchar DispBuf[4];
uint Count=0; //定义计时器变量
void DelayMs(uint n) //延时
{
uchar j;
while (n--) //11.0592MHz--113
{
for (j = 0; j < 113; j++);
}
}
void NumToBuf(void)
{
DispBuf[3] = Count/1000; // 显示Count的千位
DispBuf[2] = Count/100%10; // 显示Count的百位
DispBuf[1] = Count/10%10; // 显示Count的十位
DispBuf[0] = Count%10; // 显示Count的个位
}
void BufToSeg(void)
{
uchar i;
for(i = 0; i < 4; i++) //4个数码管数字动态显示
{
P2=0xFF; //P2设置初值
P2=BitCode[i]; //输出位码
P0=0xFF; //P0设置初值
P0=SegCode[DispBuf[i]]; //输出计时值
DelayMs(2); //延时
}
}
void main(void) //main代表主函数,程序执行的部分
{
uint k=0;
while(1) //代表循环
{
k++; //k值增1
if(k == 220) //如果k值等于220,执行以下程序
{
k = 0; //k置0
Count++;//计时器增1
if(Count==10000) Count=0;//判断循环是否超限
//如果Count值等于10000,则把Count值置0 ,修正计时器值
}
NumToBuf(); //调用函数
BufToSeg();
}
}
3.效果图
4.使用缓冲器74HC245作为开关
程序
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar code SegCode[] = //seg code;
{0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
uchar code BitCode[] = //bit code;
{0xf1,0xf2,0xf4,0xf8};
uchar DispBuf[4];
uint Count=0;
void DelayMs(uint n)
{
uchar j;
while (n--) //11.0592MHz--113
{
for (j = 0; j < 113; j++);
}
}
void NumToBuf(void)
{
DispBuf[3] = Count/1000;
DispBuf[2] = Count/100%10;
DispBuf[1] = Count/10%10;
DispBuf[0] = Count%10;
}
void BufToSeg(void)
{
uchar i;
for(i = 0; i < 4; i++)
{
P2=0xF0;
P2=BitCode[i];
P0=0xFF;
P0=SegCode[DispBuf[i]];
DelayMs(2);
}
}
void main(void)
{
uint k=0;
while(1)
{
k++;
if(k == 220)
{
k = 0;
Count++;
if(Count==10000) Count=0;
}
NumToBuf();
BufToSeg();
}
}
效果图1
效果图2