基于C51实现计数器和计时器的功能

本文中编写程序的软件是keil uvision4,拷入软件是stc-isp,这两个软件的具体使用见上一篇文章,

关于计数器和计时器

在生活中我们经常会涉及到计时或者计数的情况,那么是否可以用51单片机来实现这个功能呢,不论计时还是计数功能,我们都是基于单片机自身可以为我们所利用的计时功能,大概实现方法是依据单片机的晶振频率来计算出1ms的时间,我们如若想要更多时间则在其基础上进行操作即可,

使用C51单片机实现该功能

1、给出数码管的原理图
在这里插入图片描述
在上一篇文章中我们已经给出了数码管显示数组的列取方法,可根据该图辅助我们这次的理解。需要注意的是我的数码管是有4个片选的,所以可以显示的最大数值是9999,下面的代码例程也是最高显示到9999的。
现在我们给出可以显示从1-9999计时的代码例程:

#include<reg51.h>				
#define uint  unsigned int
#define uchar unsigned char //define 后方无分号;
uchar code PX[]={0XFE,0XFD,0XFB,0XF7};//片选
uchar code DX[]=
{
0XC0,0XF9,0XA4,0XB0,
0X99,0X92,0X82,0XF8,
0X80,0X90,0X88,0X83,
0XC6,0XA1,0X86,0X8E
};	//段选  
void delay_1ms(uint n)//1ms的延迟函数 
{
	uint i,j;
	for(i=n;i>0;i--)
	{
		for(j=400;j>0;j--);//调整1ms,400与单片机的固有频率有关
	}	

}
void display_1()
{
	uint i,j,k,n,m,l,q;
	n = 50;//表示帧	 1000/n
	m = 1000; //内容切换时间,1000表示1s
	for(i=0;i<10000;i++)
	{
	if(i>=0&&i<=9)
	{
	P2 = PX[0];
	P0 = DX[i];
	delay_1ms(m);

	}
	else if(i>=10&&i<=99)
	{
	for(j=0;j<(m/n);j++)
	{
	for(k=0;k<2;k++)
	{
	P2 = PX[k];
	 switch(k)
	 {
	 case 0:P0 = DX[i%10]; break; //显示个位
	 case 1:P0 = DX[i/10]; break; //显示十位
	 }
	delay_1ms(n/2);
	}
	}
	}
	else if(i>=100&&i<=999)
	{	
	   for(j=0;j<(m/n);j++)
	{
	for(k=0;k<3;k++)
	{
	P2 = PX[k];
	 switch(k)
	 {
	 case 0:P0 = DX[i%10]; break; //显示个位
	 case 1:P0 = DX[(i/10)%10]; break; //显示十位
	 case 2:P0 = DX [i/100]; break;	 //显示百位
	 }
	delay_1ms(n/3);
	}
	}
	}
		else if(i>=1000&&i<=9999)
	{
	   for(j=0;j<(m/n);j++)
	{
	for(k=0;k<4;k++)
	{
	P2 = PX[k];
	 switch(k)
	 {
	 case 0:P0 = DX[i%10]; break; //显示个位
	 case 1:P0 = DX[(i/10)%10]; break; //显示十位
	 case 2:P0 = DX [(i/100)%10]; break;	 //显示百位
	 case 3:P0 = DX[(i/1000)]; break;
	 }
	delay_1ms(n/4);
	}
	}
	}
}	
	
}


void main()
{
while(1)
{
	display_1();

}

}
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值