⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 diometer.c

📁 自行车里程计 实时显示时间 里程 速度
💻 C
字号:
//
//数码管采用共阴
//P2作为数码管的段选输入
//p1作为数码管的位选,采用低四位
//
//采用11.0592mhz的晶振
//时钟采用计时器0
//初始值为19465,也就是20次溢出为1秒
//
//红外对管低电平有效
//采用边沿触发
//触发后延时4ms检测若有则说明成功
//
//红外采用外部中断0
//按键采用外部中断1
//
#include <reg52.h>

int distance=0;
char hour=0;
char minute=0;
char second=0;
//char sec=0;
char timenumber = 0;
//
//共阴七段数码管的显示参数
//
//code char Ascii[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x7, 0x7f, 0x6f};
code char Ascii[10]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
//
//显示的控制位
//0表示distance
//1表示time
//
char mod=0;
//
//秒钟的辅助进位
//
char count=0;

//
//延时的子程序
//
void delay(unsigned char a)
{
	while(a--)
	{
	}
}

void delay_2(int m)   //延时程序,延时m*0.5毫秒 
{ 
   unsigned int i; 
   unsigned int j; 
   for (i = 0; i < m; i++) 
   { 
     for (j = 0; j < 500; j++){} 
   } 
}

//
//
//
void ShowSpeed()
{
	int speed=distance*2/(second+minute*60+hour*24);
	
	P1=0xff;
    P2 = 0x00; 
	P2=Ascii[speed / 1000]& 0x7f;
	P1=0xfe;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	speed=speed % 1000;
	P2=Ascii[speed / 100];
	P1=0xfd;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	speed=speed % 100;
	//
	//显示闪烁
	//
	P2=Ascii[speed /10] ;
	P1=0xfb;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	speed=speed%10;
	P2=Ascii[speed];
	P1=0xf7;
	delay_2(1);
	P1=0xff;
}

//
//显示里程
//
void ShowDistance()
{
	
	int tmp=distance*2%10000;

	P1=0xff;
    P2 = 0x00; 
	P2=Ascii[tmp / 1000];
	P1=0xfe;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	tmp=tmp % 1000;
	P2=Ascii[tmp / 100]& 0x7f;
	P1=0xfd;
	delay_2(1);
	P1=0xff;

    P2 = 0xff; 
	tmp=tmp % 100;
	//
	//显示闪烁
	//
	P2=Ascii[tmp /10] ;
	P1=0xfb;
	delay_2(1);
	P1=0xff;

    P2 = 0xff; 
	tmp=tmp%10;
	P2=Ascii[tmp];
	P1=0xf7;
	delay_2(1);
	P1=0xff;
}

//
//显示时间
//
void ShowTime()
{	
	P1=0xff;
    P2 = 0x00; 
	P2=Ascii[hour / 10];
	P1=0xfe;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	P2=Ascii[hour % 10];
	P1=0xfd;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	P2=Ascii[minute / 10] & 0x7f;
	P1=0xfb;
	delay_2(1);
	P1=0xff;
	//
	//显示闪烁
	//

    P2 = 0x00; 
	P2=Ascii[minute % 10] ;
	P1=0xf7;
	delay_2(1);
	P1=0xff;
}

//
//显示秒钟
//
void ShowSecond()
{
	P1=0xff;
    P2 = 0x00; 
	P2=Ascii[minute / 10];
	P1=0xfe;
	delay_2(1);
	P1=0xff;

	//
	//显示闪烁
	//
    P2 = 0x00; 
	P2=Ascii[minute % 10];
	P1=0xfd;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	P2=Ascii[second / 10];
	P1=0xfb;
	delay_2(1);
	P1=0xff;

    P2 = 0x00; 
	P2=Ascii[second % 10] & 0x7f;
	P1=0xf7;
	delay_2(1);
	P1=0xff;
}
//
//定时器0的中断服务器
//
void Timer0() interrupt 1
{
	EA=0;
	TH0=0x4c;
	TL0=0x09;				        //tmp->timenumber
	if(timenumber==19)
	{
		timenumber=0;
		if(second==59)
		{
			second=0;
			if(minute==59)
			{
				minute=0;
				if(hour==99)
				{
					hour=0;
				}
				else
				{
					hour++;
				}
			}
			else
			{
				minute++;
			}
		}
		else
		{
			second++;
		}
		//sec++;
	}
	else
	{
		timenumber++;
	}
	EA=1;
}

//
//外部中断0的中断服务程序
//该中断来源于一个按钮
//用以控制显示的切换
//
void Int1() interrupt 2
{
	EX1=0;
	EA=0;
	TR1=1;
	if(mod==3)
	{
		mod=0;
	}
	else
	{
		mod++;
	}
	P1=0xff;
	delay_2(50);
	EA=1;
}

//
//外部中断1的中断服务程序
//用来检测红外对管
//
void Int0() interrupt 0
{
	unsigned char tmp=15;
	EA=0;
	//
	//延时4ms
	//
	while(tmp--)
	{
		delay(255);
	}	
	if(!(P3 & 0x04))
	{
		distance++;
	}
	EA=1;
}

//
//计时器1用来按键防抖
//重设时钟,开放按键中断
//
void Timer1() interrupt 3
{
	EA=0;
	TR1=0;
	TH1=0xdb;
	TL1=0x9f;
	EX1=1;
	EA=1;
}

main()
{
	//						 x
	//初始化部分
	//
	//采用16位定时器模式
	//中断为边沿触发
	//
//	P1=0xff;
//	P2=0x00;
	TMOD=0x11;
	TCON=0x15;
	TH0=0x4c;
	TL0=0x09;
	TH1=0xdb;
	TL1=0x9f;
	TR1=0;
	//
	//开放定时器0和外部中断0和1的中断
	//
	IE=0x8f;
	//
	//主程序部分
	//主要是显示模块
	//
	while(1)
	{
		switch(mod)
		{
			case 0:
				ShowSecond();
				break;
			case 1:
				ShowTime();
				break;
			case 2:
				ShowDistance();
				break ;
			case 3:
				ShowSpeed();
				break;;
			default:
				ShowDistance();
				break;
		}
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -