📄 car.c
字号:
#include <REGX51.H>
unsigned char string[]={"0123456789:.m /sc"};
unsigned char second; //秒
unsigned char min; //分
unsigned char hour; //时
unsigned char sec; //标志位
unsigned int count; //用于计数,计20次,即1S
unsigned int quan_l; //车轮转的圈数。根据测量得,车轮每转一圈为0。1米
unsigned int quan_h; //车轮转的圈数
unsigned char i; //变量,用于存放一些临时数据
unsigned int k; //变量,用于存放一些临时数据
static unsigned int c10; //用于记录1S内车轮所转的圈数
static unsigned int s; //用于存放速度
sbit rs=P2^5; //液晶数据,命令
sbit rw=P2^6; //液晶读写
sbit ep=P2^7; //液晶使能
sbit quan=P2^0; //前进
sbit hou=P2^1; //后退
sbit right=P2^2; //右转
sbit leght=P2^3; //左转
sbit sudu1=P1^0; //速度1
sbit sudu2=P1^1; //速度2
sbit dang=P3^0; //检测障碍物
void delay(unsigned int time) //带参数的延时函数
{
unsigned char k;
while(time--)
for(k=0;k<220;k++);
}
bit lcd_bz() //液晶测忙函数
{
bit result; //设置布尔型的返回值
rs=0; //rs=0指向液晶命令存署器,rs=1指向液晶数据存署器
rw=1; //rw=0写液晶命令,rw=1读液晶命令
ep=1; //液晶使能
result=(bit)(P0&0x80); //忙信号从P0。7口输出。等于1为忙,等于0为不忙
ep=0;
return result; //返回布尔型
}
lcd_word(unsigned char word) //液晶写命令
{
while(lcd_bz()); //测忙
rs=0; //rs=0指向液晶命令存署器
rw=0; //rw=0写液晶命令
ep=1; //液晶使能
P0=word; //命令从P0口写到液晶命令存署器
ep=0;
}
lcd_pos(unsigned char pos) //写数据要在液晶中显示的位置
{
lcd_word(pos|0x80); //写数据要在液晶中显示的位置时要与0相与
}
lcd_dat(unsigned char dat) //写要显示的数据
{
while(lcd_bz()); //测忙
rs=1; //rs=1指向液晶数据存署器
rw=0; //rw=0写液晶命令
ep=1; //液晶使能
P0=dat; //命令从P0口写到液晶数据存署器
ep=0;
}
lcd_init()
{
lcd_word(0x38); //显示模式设置。设置16X2显示,5X7点阵,8位数据接口
delay(1);
lcd_word(0x0c); //显示及光标设置。显示开,不显示光标
delay(1);
lcd_word(0x06); //设置当写一个字符时,地址指针及光标指针加1
delay(1);
lcd_word(0x01); //显示清屏。地址指针及光标指针清零
delay(1);
}
time0() interrupt 1 //T0中断程序,用于计算行程时间
{
TR0=0; //关T0。TR0为T0运行,停止位
TH0=-50000/256; //重装50MS初值
TL0=-50000%256;
count++; //计数
if(count>=23) //计23次中断为1秒
{
count=0; //计数清零
sec=1; //设标志位
second++; //秒加1
if(second>=60)
{
second=0; //秒清零
min++; //分加1
if(min>=60)
{
min=0; //分清零
hour++; //小时加1
if(hour>=24)
hour=0; //小时清零
}
}
if(sec)
{
s=c10*10; //速度。C10 x 10为1S内车所走的路程。(C10 X 10)/1S即为速度
c10=0; //1S内车轮所圈数清零
sec=0; //清标志位
lcd_init(); //液晶初始化
lcd_pos(0x03); //设置液晶第一行显示数据的位置
delay(1);
i=hour/10; //小时高位
lcd_dat(string[i]); //显示
delay(1);
i=hour%10; //小时低位
lcd_dat(string[i]);
delay(1); //延时
lcd_dat(string[10]); //显示 :
delay(1);
i=min/10; //分高位
lcd_dat(string[i]);
delay(1);
i=min%10; //分低位
lcd_dat(string[i]);
delay(1);
lcd_dat(string[10]); //显示 :
delay(1);
i=second/10; //秒高位
lcd_dat(string[i]);
delay(1);
i=second%10; //秒低位
lcd_dat(string[i]);
delay(1);
lcd_pos(0x40); //设置液晶第二行数据显示的位置
i=quan_h%10;
if(i) //如果里程高位为0则隐藏
lcd_dat(string[i]);
else
lcd_dat(string[13]);
delay(1);
i=quan_l/100;
if(quan_h%10==0) //如果里程高位为0,且次高位为零则隐藏
{
if(i)
lcd_dat(string[i]);
else
lcd_dat(string[13]);
}
else
lcd_dat(string[i]);
delay(1);
i=(quan_l%100)/10;
lcd_dat(string[i]);
delay(1);
lcd_dat(string[11]); //小数点
delay(1);
i=quan_l%10;
lcd_dat(string[i]);
delay(1);
lcd_dat(string[12]); // m
delay(1);
lcd_pos(0x49);
k=s/100; //速度高位
if(k) //如果里程高位为0则隐藏
lcd_dat(string[k]);
else
lcd_dat(string[13]);
delay(1);
k=(s%100)/10; //速度次高位
if(s/100==0) //如果里程高位为0,且次高位为零则隐藏
{
if(k)
lcd_dat(string[k]);
else
lcd_dat(string[13]);
}
else
lcd_dat(string[k]);
delay(1);
k=s%10; //速度低位
lcd_dat(string[k]);
delay(1);
lcd_dat(string[16]); // c
delay(1);
lcd_dat(string[12]); // m
delay(1);
lcd_dat(string[14]); // /
delay(1);
lcd_dat(string[15]); // s
delay(1);
}
}
if(second>=30)
{
EA=0; //30秒到时,关所有中断
}
TR0=1; //开T0,TR0为T0运行,停止位
}
EX_0() interrupt 0 //外中断0中断程序,用于计算车轮圈数
{
EX0=0; //关外中断0
quan_l++; //车轮低位圈数加1
c10++;
if(quan_l>=1000)
{
quan_l=0; //车轮低位圈数清零
quan_h++; //车轮高位圈数加1
if(quan_h>=9)
quan_h=0;
}
lcd_pos(0x40); //设置液晶第二行数据显示的位置
i=quan_h%10;
if(i) //如果里程高位为0则隐藏
lcd_dat(string[i]);
else
lcd_dat(string[13]);
delay(1);
i=quan_l/100;
if(quan_h%10==0) //如果里程高位为0,且次高位为零则隐藏
{
if(i)
lcd_dat(string[i]);
else
lcd_dat(string[13]);
}
else
lcd_dat(string[i]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -