📄 diometer.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 + -