目录
1、项目简介:采用51单片机的定时\计数器写一个每隔1s累加一次的计数器,源码可以计数0~9999s。
1、项目简介:采用51单片机的定时\计数器写一个每隔1s累加一次的计数器,源码可以计数0~9999s。
2、编译软件和源代码:采用Keil5+C51库。
基于C51写的利用定时\计数器实现的0~9999s累加计数器源代码如下:程序中不同的函数定义和变量都有详细注释。
/*----------------------------------------
time:2023.6.30
author:Zero One Electronics
function:Count
-------------------------------------------*/
#include<reg52.h> //导入52单片机头文件
#include<intrins.h> //导入intrins头文件
unsigned char code DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //8位共阴数码管的段码
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //8位共阴数码管的位码
unsigned char i=0;
unsigned int cnt=0;
unsigned int num,qian,bai,shi,ge=0;
void Init_Timer0(void) //定时器初始化
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256;
TL0=(65536-20000)%256;
EA=1;//总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1 //定时器中断0
{
TH0=(65536-20000)/256;//重新赋值 20ms
TL0=(65536-20000)%256;
i++;
if(i==50) //每隔1秒加1
{
i=0;
num++;
if(num==9999)
{
num=0;
}
}
}
void count_display(void) //计数器显示函数
{
qian=num/1000; //取num的千位数,本质计算是因为num/1000=包含num千位数的小数赋值给qian被强制转换为无符号整形
bai=num%1000/100;
shi=num%1000%100/10;
ge=num%1000%100%10;
switch(cnt)
{
case 0:P2=WeiMa[7-cnt];P0=DuanMa[ge];break;
case 1:
if(num>9)
{
P2=WeiMa[7-cnt];P0=DuanMa[shi];
}
else
{
P0=0x00;
}
break;
case 2:
if(num>99)
{
P2=WeiMa[7-cnt];P0=DuanMa[bai];
}
else
{
P0=0x00;
}
break;
case 3:
if(num>999)
{
P2=WeiMa[7-cnt];P0=DuanMa[qian];
}
else
{
P0=0x00;
}
break;
}
cnt++;
if(cnt>7)
{
cnt=0;
}
}
void main (void)
{
Init_Timer0();
P0=0xff;
while (1) //主循环
{
count_display();
}
}
3、仿真软件:采用Protues8.13。
仿真效果具体演示效果视频可以B站搜索零壹电子查看
4、Proteus中元器件查找:
本次仿真主要用到80C52单片机和8位共阴数码管以及排阻。Protues中找对应原件可以直接搜索,鼠标选择:元件模式——>P——>Keywords中直接搜索关键字:7SEG-MPX8-CC-BLUE(8位共阴数码管),7SEG-MPX8-CA-BLUE(8位共阳数码管),RESPACK-8(排阻)。