仿真示意图:
单片机程序:
#include <REG51.H>
#include <intrins.h>
#include <math.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^6;
sbit E=P2^7;
sbit key0=P2^0;
sbit key1=P2^3;
sbit pluse=P3^2;
float data_ad;
float time_0;
float distance=1000;
float speed=0;
unsigned char count; //定义变量统计中断累计次数
float s,m,h; //定义变量储存秒、分钟和小时
uchar FirstFlag;
void shuchu(void);
void _delay_ms(uchar z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void wr_commamd_lcd1602( uchar data_lcd1602)
{
E=0;
RS=0;
P0=data_lcd1602;
E=1;
E=0;
_delay_ms(15);
}
void wr_data_lcd1602( uchar data_lcd1602)
{
E=0;
RS=1;
P0=data_lcd1602;
E=1;
E=0;
_delay_ms(10);
}
void lcd1602_init( )
{
wr_commamd_lcd1602(0x01);
wr_commamd_lcd1602(0x02);
wr_commamd_lcd1602(0x06);
wr_commamd_lcd1602(0x0F);
wr_commamd_lcd1602(0x14);
wr_commamd_lcd1602(0x3c);
wr_commamd_lcd1602(0xc0);
}
void init_timer()
{
TMOD=0x01; //使用定时器T0的模式1
TH0=0XFC; //定时器T0的高8位设置初值
TL0=0X18; //定时器T0的低8位设置初值
EA=1; //开总中断
ET0=1; //定时器T0中断允许
TR0=1; //启动定时器T0
EX0=1;
count=0; //中断次数初始化为0
s=0; //秒初始化为0
m=0; //分钟初始化为0
h=0; //小时初始化为0
}
void main( )
{
uchar data_test=123;
uint flag1;
flag1=0;
key0=0;
key1=0;
init_timer();
lcd1602_init( );//液晶初始化
while(1)
{
}
}
void shuchu()
{
uint i,j;
time_0=m+s/1000;
speed=(distance/time_0);
wr_commamd_lcd1602(0xc0);//设定光标位置
wr_data_lcd1602('T');//D
wr_data_lcd1602('=');//=
i=time_0/1;
wr_data_lcd1602(0x30+i);//整数 1.234
wr_data_lcd1602('.');//小数点
i=time_0*10;
i=i%10;
wr_data_lcd1602(0x30+i);//0.1
i=time_0*100;
i=i%10;
wr_data_lcd1602(0x30+i);//0.01
i=speed*1000;
i=i%10;
wr_data_lcd1602(0x30+i);//0.001
// wr_data_lcd1602(0x00);//空格
//wr_data_lcd1602(0x00);//空格
wr_data_lcd1602('v');//v
wr_data_lcd1602('=');//=
j=(int)speed/1000;
wr_data_lcd1602(0x30+j);//整数 1.234
i=((int)speed/100)%10;
wr_data_lcd1602(0x30+i);//整数 1.234
i=((int)speed/10)%10;
wr_data_lcd1602(0x30+i);//整数 1.234
i=((int)speed%10);
wr_data_lcd1602(0x30+i);//整数 1.234
wr_data_lcd1602('.');//小数点
i=speed*10;
i=i%10;
wr_data_lcd1602(0x30+i);//0.1
i=speed*100;
i=i%10;
wr_data_lcd1602(0x30+i);//0.01
// i=speed*1000;
// i=i%10;
// wr_data_lcd1602(0x30+i);//0.001
}
void T() interrupt 0
{
FirstFlag++;
while(pluse==0);
if(FirstFlag >= 2)
{
FirstFlag = 0;
shuchu();
}
}
/*******************************************************
函数功能:定时器T0的中断服务函数
********************************************************/
void Time0(void ) interrupt 1 using 1 //定时器T0的中断编号为1,使用第1组工作寄存器
{
if(FirstFlag == 1)
{
s++; //秒加1
if(s==1000) //如果计满60秒
{
s=0; //秒清0
m++; //分钟加1
}
if(m==60) //如果计满60分
{
m=0; //分钟清0
// h++; //小时加1
}
// if(h==99) //如果计满24小时
// {
// h=0; //小时清0
// }
TH0=0XFC; //定时器T0高8位重新赋初值
TL0=0X18; //定时器T0低8位重新赋初值
}
}
想要源文件请到资料中下载(名称定时器仿真)