栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

采用两个按键和一位数码显示的51单片机秒表设计

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

采用两个按键和一位数码显示的51单片机秒表设计

目录

一、要求

1.引脚定义与程序设计

2.数码管封装(共阳) 

 3.流程图

二、设计思路

 1.数码管显示译码

 2.最小系统板与控制电路

3.proteus仿真 

三、代码

1.附加资料


一、要求

1.引脚定义与程序设计

2.数码管封装(共阳) 

 3.流程图

二、设计思路

 1.数码管显示译码
数码管各管段
数码管显示显示数字需要的管段decdp fgab十六进制译码
0a b c d e f000101000x14
1b c110111100xde
2a b g e d001110000x38
3a b g c d010110000x58
4f g b c110100100xd2
5a f g c d010100000x51
6a f e d c g000100010x11
7a b c110111000xdc
8a b c d e f g 000100000x10
9g f a b c d010100000x50

 

 2.最小系统板与控制电路

3.proteus仿真 

三、代码
#include 

#define uchar unsigned char
#define uint unsigned int
sbit KA=P1^0;
sbit KB=P1^1;
uchar code table[]={0x14,0xde,0x38,0x58,0xd2,0x51,0x11,0xdc,0x10,0x50,0xfd};//自己改  {0123456789-}
uint count=0;
uchar num[5]={0};

void delay(uint c)		    //延时程序
{
	uchar a,b;
	for(;c>0;c--)
		for(b=142;b>0;b--)
			for(a=2;a>0;a--);
}

void time0_init()
{
	TMOD|=0x01;
	TH0=0xfc;//(65536-1000)/256; 1ms
	TL0=0x66;//(65536-1000)%256;
	EA=1;
	ET0=1;//允许定时器中断
}

void transfer()//位数的转换
{
	uchar t=0;      //count:  0 0 0 0 0
	while(count!=0)
	{

		num[t]=count%10;
		count=count/10;
		t++;
	}               //num[x]  x x x x x
	t=0;
	count=0;
}

void display()   //显示到数码管
{
	uchar i=4;
	uchar	t=5;		//显示5位数
	while(t--)
	{
		P0=table[num[i--]];
		delay(300);					//延时慢慢调,差不多就行了
		P0=0xff;							//关闭数码管
		delay(80);		
	}
}

void KEY_passing()				//KA按下开始计时,KB按下结束,然后数码管显示
{  
	while(1)
	{
		if (KA==0)
		{
			P0=0xff;
			TR0=1;//开启定时器					//计时效果需要好的,开启定时就放这,至于为什么,自己慢慢体会!!!!
			delay(5);//软件消抖
			if (KA==0)
			{ 
//				TR0=1;//开启定时器   		//另个方案就是开启定时放这
				break;//结束while
			}
		}	
	}
	while(1)
	{	
		if (KB==0)
		{
			delay(5);//软件消抖
			if (KB==0)
			{ 
				while(!KB);	//是否松开
				TR0=0;			//关闭定时器				
				break;			//结束while
			}
		}
	}
	transfer();
	display();
}

void main()
{
	time0_init();
	P0=table[10];//a段亮	
	while(1)
	{
		KEY_passing();
		P0=table[10];//a段亮
	}
}

void time0() interrupt 1
{
	TH0=0xfc;//(65536-1000)/256;   1ms
	TL0=0x66;//(65536-1000)%256;
	count++;
}

现实计时效果差多0.2s左右吧

仿真计时就应该是多0.5s那样子的

个人建议:如果要十分精确就手动加计时补偿吧,因人而异。

至于为什么存在误差,软件与硬件都存在一定的影响,手动测量的话,无疑人为因素导致的误差更大。

1.附加资料

嘉立创原理图(json)和仿真工程(Proteus 8 Professional)

前往下载

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1001684.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号