📄 main.c
字号:
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define juli 1
//------------------- 定义1602液晶控制管脚-------------------------------------------------
sbit RS=P2^0;
sbit RIW=P2^1;
sbit E=P2^2;
sbit int0=P3^2;
sbit int1=P3^3;
sbit kuan=P3^4;
uchar i;
uint timecount=0;
uchar biaozhi=0; //第一个开关
float jishi1=0;
float jishi2=0;
float speed;
float length;
//-------------------------定义数组----------------------------------------------------------
uchar tab[16]=" ";
void delay(uint xms) //按键扫描延时子程序
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//---------------------1602写指令时序开始------------------------------------------------------
void wi(uchar com)
{
uint i=200;
RS=1;
RIW=1;
RS=0;
RIW=0;
E=0;
E=1;
P0=com;
while(i--);
E=0;
}
//---------------------1602写指令时序结束---------------------------------------------------
//---------------------1602写数据时序开始--------------------------------------------------
void wd(uchar dat)
{
uint i=200;
RS=0;
RIW=1;
RS=1;
RIW=0;
E=0;
E=1;
P0=dat;
while(i--);
E=0;
}
//---------------------1602写数据时序结束------------------------------------------------
void chushi() //1602初始化程序
{
wi(0x01); //清屏
wi(0x06); //设置输入方式 AC自动加1,显示不发生移位
wi(0x0F); //显示开关控制 开显示 开光标 闪烁
wi(0x38); //功能设置 双行显示 5*8点阵 八位数据
}
void xianshi_speed(void)
{
unsigned long zancun=speed/1000;
tab[6]=zancun%10+0x30;
zancun=zancun/10;
tab[5]=zancun%10+0x30;
zancun=zancun/10;
tab[3]='.';
tab[4]=zancun%10+0x30;
zancun=zancun/10;
tab[2]=zancun%10+0x30;
zancun=zancun/10;
tab[1]=zancun%10+0x30;
zancun=zancun/10;
tab[0]=zancun%10+0x30;
wi(0x89);
for(i=0;i<16;i++)
{wd(tab[i]);} //显示数组
}
void xianshi_length(void)
{
unsigned long zancun=length/100;
tab[6]=zancun%10+0x30;
zancun=zancun/10;
tab[5]=zancun%10+0x30;
zancun=zancun/10;
tab[4]='.';
tab[3]=zancun%10+0x30;
zancun=zancun/10;
tab[2]=zancun%10+0x30;
zancun=zancun/10;
tab[1]=zancun%10+0x30;
zancun=zancun/10;
tab[0]=zancun%10+0x30;
wi(0xc9);
for(i=0;i<16;i++)
{wd(tab[i]);} //显示数组
}
void main()
{
IT0=1;
EX0=1;
IT1=1;
EX1=1;
PT1=1;
TMOD=0x11; //T0工作为16位计数器(方式1),T1工作方式为16位定时器
TH0=0; //计数为65536
TL0=0; //
TH1=0; //定时器采用定时4ms. 初值为4000
TL1=0;
//TR1=1; //TR1=1,控制开关闭合,计数脉冲进入T1计数器,启动定时
//TR0=1; //TR0=1,控制开关闭合,计数脉冲进入T1计数器,启动计数
ET0=1; //定时器0开中断
ET1=1; //定时器1开中断
EA=1;
chushi(); //初始化
wi(0x80);
wd('s');
wd('p');
wd('d');
wd('(');
wd('m');
wd('/');
wd('s');
wd(')');
wd('=');
wi(0xc0);
wd('l');
wd('e');
wd('n');
wd('(');
wd('c');
wd('m');
wd(')');
wd(' ');
wd('=');
while(1)
{
speed=41000/jishi1*1000000;
length=speed*jishi2/1000000;
if(speed>41000000000&&biaozhi==0)
{
speed=0;
length=0;
biaozhi=0;
EX0=0;
EX1=1;
}
xianshi_speed();
xianshi_length();
if(kuan==0)
{
wi(0xc7);
wd(0xff);
}
else if(kuan==1)
{
wi(0xc7);
wd(' ');
}
}
}
void INT0_interrupt() interrupt 0 using 1
{
//delay(30);
//int0=1;
delay(10);
if(int0==0)
{
switch(biaozhi)
{
case 1:
{
jishi1=timecount*65536+TH1*256+TL1;
EX0=0;
EX1=1;
biaozhi=2;
}break;
case 3:
{
biaozhi=0;
EX0=0;
EX1=1;
}break;
default :break;
}
}
}
void INT1_interrupt() interrupt 2 using 1
{
//delay(30);
//int1=1;
delay(10);
if(int1==0)
{
if(biaozhi==0) //开始计数
{
biaozhi=1;
TR1=1;
EX1=0;
EX0=1;
}
else if(biaozhi==2)
{
jishi2=timecount*65536+TH1*256+TL1;
biaozhi=3;
TR1=0; //停止计时
TH1=0; //计数初值重装载
TL1=0;
timecount=0;
EX1=0;
EX0=1;
}
}
}
void t1(void) interrupt 3 using 0 //T1中断服务
{
TH1=0; //计数初值重装载
TL1=0;
timecount++;
if(timecount==65535)
{
timecount=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -