AT89C52定时器/计数器的使用及源代码

 

 

#include <REGX52.H>
#define uint unsigned int
#define uchar unsigned char
sbit DU =P2^6;//段选
sbit WE =P2^7;//位选
//共阴极数码管0-9
uchar  code tabel[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//void delay(uint z)  //延迟函数
//{
//	uint x,y;
//	for(x = z; x > 0; x--)
//		for(y = 114; y > 0 ; y--); 		
//} 
void delay(uint x)		//@12.000MHz  延迟函数1毫秒   和上述的函数一样
{
	unsigned char i, j;
	while(x--)
	{
		i = 2;
		j = 239;
		do
		{
			while (--j);
		} while (--i);
	}
}

void display(uchar i)    //数码管显示函数
	
{
	uchar bai, shi, ge;
	bai = i / 100; //236 / 100  = 2
	shi = i % 100 / 10;	//236 % 100 / 10 = 3
	ge  = i % 10;//236 % 10 =6
	
	  		
	P0 = 0XFF;//清除断码
	WE = 1;   //位选打开
	P0 = 0XFE;//第一个数码管显示,共阴极1111 1110 
	WE = 0;   //关闭位选寄存器

	
	DU = 1;   //段选寄存器打开
	P0 = tabel[bai]; //百位数字
	DU = 0;   //段选寄存器关闭
	delay(2); //延迟5秒

	
	P0 = 0XFF;
	WE = 1;
	P0 = 0XFD; //二个数码管
	WE = 0;
	
	DU = 1;
	P0 = tabel[shi];
	DU = 0;
	delay(2);

	P0 = 0XFF;
	WE = 1;
	P0 = 0XFB; 
	WE = 0;
	
	DU = 1;
	P0 = tabel[ge];
	DU = 0;
	delay(2);
}

void timer0Init()
{
	TR0 =1;          //TCON中的打开定时器
	TMOD =0x01;      //TMOD不能位寻址 0000 0001中 0 01表示定时器模式  16位定时
	TH0 =0x4b;       //(65535-46082)/256;     //定时器 50ms   65536-50000/1.085/256   高8位
	TL0 =0xfd;       //(65535-46082)%256;     //低8位
}
void main()
{
	uchar ms_50,s;    //记录50ms的个数  20个为1s
	timer0Init();
	while(1)
	{
		if(TF0==1)      //TCON中的TF0等到定时器计到65565溢出后硬件置1
		{
			TF0 =0;       //软件置零
			TH0 =0x4b;    //初始化
			TL0 =0xfd;    //初始化
			ms_50++;      //次数累加   
			if(ms_50 ==20)//当20个为一秒  20*50=1000ms
			{
				s++;        //秒位自加
				ms_50=0;    //归零
			}
			display(s);
		}		
	}
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值