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

📄 chengxu.c

📁 采用51单片机集合1602LCD控制器,可以有效的模拟出汽车的运行状态,包括速度,里程的相关信息!是绝对正确的源码,请大家放心使用和参考
💻 C
字号:
#include<reg52.h>
#include<head.h>

/************************************************************/
void main()
{
  init(); //系统初始化
  settime();//设置时间
  TR0=1;//开定时器中断
  for(;;)
  {
   time_update();//时间更新
   x=key_board();//扫描键盘
   function_key(x);//判断键值
   lucheng_update();//里程更新
   full_day_info();//显示总共里程以及停车次数
   space_update();//速度更新
  }
}
/************************************************************/
 void	chushihua(void)	//1602初始化
{ date = 0;
  xiem(0x38,0);
  delay(20); 
 xiem(0x38,0);
  delay(20); 
 xiem(0x38,0);
  delay(20)	;
  xiem(0x38,1);  
 xiem(0x08,1);  
  xiem(0x01,1); 
  xiem(0x06,1);  
  xiem(0x0C,1);  
}
  /************************************************************/
 void init(void) //系统初始化
{ 
  chushihua();
  dingshichushihua();
  xiestring(10,0,time_chushihua);
   xiechar(0,0,codee[12]);
   xiechar(1,0,codee[10]);
   xiechar(4,0,codee[0]);
   xiechar(5,0,codee[10]);
   xiechar(6,0,codee[0]);  //显示速度
  /***********************************/
   xiechar(0,1,codee[14]);
   xiechar(1,1,codee[12]);
   xiechar(2,1,codee[13]);
   xiechar(6,1,codee[(uint)((xiao_lucheng-(uint)xiao_lucheng)*10)]);
   xiechar(5,1,codee[10]);
   xiechar(4,1,codee[(uint)(xiao_lucheng)%10]);
   if((uint)(xiao_lucheng)/10!=0)
   xiechar(3,1,codee[(uint)(xiao_lucheng)/10]);//显示当前低于1公里的路程
}
   /************************************************************/
   void settime(void)
  { 
    uchar i=0,j=0;
    uchar time[4]={10,11,13,14};
   for(;;)
      {RXD=0;for(;;)
        { x=key_board();
	       if((x!=3)&&(x!=7)&&(x!=11)&&(x!=12)&&(x!=14)&&(x!=15))//注意\\和&&之间的区别
	      { 
	        function_key(x);
	        if(key==10)break;
		    xiechar(time[i++],0,codee[key]);delay(100);
			if(i==1)hour+=key*10;
            if(i==2)hour+=key;
			if(i==3)minute+=key*10;
			if(i==4)minute+=key;
            if(i==4)i=0;
           }
		   if(x==12)
		   {
		   xiestring(10,0,time_chushihua);
		   i=0;hour=0;minute=0;
		   }
		   if(x==15)break;
	     }
		 if(x==15)break;
	   }
	} 
   /************************************************************/
   void  xies(uint pp0)
 {duz();rs=1;rw=0;date=pp0;e=0;e=0;e=1;}
/************************************************************/
void  xiechar(uint x,uint y,uchar zifu)
{y&=0x01;x&=0x1f;

  if (y) x |= 0x40; 
  x |= 0x80; 
  xiem(x,0);xies(zifu) ;
 }
   /************************************************************/
void xiem(uint pp0,uint busy)reentrant
  {
  if(busy) duz();date=pp0;
   rs=0;rw=0;
   e=0;e=0;e=1;
  }
    /************************************************************/
	 uint duz(void)
{
 uint st;
 date=0;rs=0;rw=1;e=0;delay(20);e=1;
st=((date)&(0x80));while (st);return date;
 }
 /************************************************************/
 void  xiestring(unsigned int x,unsigned int y,unsigned char *string) //向1602写字符串
 {	 unsigned char len;
 len = 0;
  y &= 0x1;
  x &= 0xF;
while (string[len]!='\0') 
        {
           if (x <0xF) 
              {
                xiechar(x, y, string[len]);
               len++;
                x++;
               }
			else {y=1;x=0;}
         }
}
/************************************************************/
  void delay(uint i)  //延时程序
{uint j;
 for(;i>0;i--)
 for(j=300;j>0;j--);}
/************************************************************/
void dingshichushihua()	 //中断初始化
 {
 EA=1;IT0=1;
 ET0=1;
 TH0=(65535-10000)/256;
 TL0=(65535-10000)%256;	//产生50ms
 TMOD=0X01;
 }
/************************************************************/
void	time(void)interrupt	1//定时中断子函数
{u++;
time_for++;
if(u==1200){u=0;minute++;}//1分钟到
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;	
}
/************************************************************/
uchar key_board(void)//非常完善的键盘程序,可以满足现在键盘的所有要求!!!
{  
   uchar a,b,c,d,m,i=0,keyb,tab[4]={0x7f,0xbf,0xdf,0xef};
   uint j;a=0x7f;
   if(tt==1)
   {
    P2=P2&0x0f;
    if(P2!=0x0f)goto tiaochu;
	}
	tt=0;
	for(;;)
  {
  P2=a;a=P2;b=a;c=a;
  b=b&0x0f;c=c&0x0f;
  if(b==0x0f)
   {for(j=0;j<500;j++)
     { P2=a;a=P2;d=a;d=d&0x0f;
	 if( d!=0x0f)
	  { if(d==0x0e)m=0;if(d==0x0d)m=4;if(d==0x0b)m=8;if(d==0x07)m=12;tt=1;
		goto lable;
	  }
		i++;a=tab[i];if(i==4){i=0;a=0x7f; }
	  }
	  tiaochu:keyb=17;return(keyb);break;
	}
	     else
   {if(c==0x0e)m=0;if(c==0x0d)m=4;if(c==0x0b)m=8;if(c==0x07)m=12;tt=1;
	lable:keyb=m+3-i;return(keyb);
	break;
   }
  }
}
/************************************************************/
void function_key(uchar m)
{
  switch(m)
  {
   case 0:key=7;break;
   case 1:key=8;break;
   case 2:key=9;break;
   case 3:get_bus();break;//开车
   case 4:key=4;break;
   case 5:key=5;break;
   case 6:key=6;break;
   case 7:out_bus();break;//停车
   case 8:key=1;break;
   case 9:key=2;break;
   case 10:key=3;break;
   case 11:break;
   case 12:break;
   case 13:key=0;break;
   case 15:break;
   case 17:key=10;break;
   default:break;
   }
}
/************************************************************/

/************************************************************/
 void time_update(void)//时间更新
{
if(minute==60){hour++;minute=0;}
if(hour==24){hour=0;minute=0;}
xiechar(14,0,codee[minute%10]);
xiechar(13,0,codee[minute/10]);
xiechar(11,0,codee[hour%10]);
xiechar(10,0,codee[hour/10]);
}
/************************************************************/
void get_bus(void) //开车
{ 
  EX0=1;//开外部中断开始计路程
  waibu_cishu=0;
}
/************************************************************/
void out_bus(void)//停车
{
  int m_s,n_s;
  EX0=0; //关外部中断停止计路程
  m_s=(uint)xiao_lucheng;
  n_s=(uint)((xiao_lucheng-m_s)*10);
  tingche_cishu++;//停车次数自动加一
}
/************************************************************/
 void	waibu1(void)interrupt	0  //外部中断子函数
  {
   TR0=0;
   waibu_cishu++;
   sk=1;
   xiao_lucheng+=((double)1/10);
   if(xiao_lucheng==10)
   {xiao_lucheng=0.0;full_lucheng++;}
   TR0=1;
  }
/************************************************************/
  void lucheng_update(void)//10以下路程
{
  int m_s,n_s;
  m_s=(uint)xiao_lucheng;//取整数部分
  n_s=(uint)((xiao_lucheng-m_s)*10);//取小数部分
   xiechar(6,1,codee[n_s]);
   xiechar(4,1,codee[m_s%10]);
   if(m_s/10!=0)
   xiechar(3,1,codee[m_s/10]);
}
/************************************************************/
void full_day_info(void)  //整个路程和停车次数的信息
{
 if(full_lucheng/1000!=0)
 xiechar(8,1,codee[full_lucheng/1000]);
 if(full_lucheng/100%10!=0)
 xiechar(9,1,codee[full_lucheng/100%10]);
 if(full_lucheng%100/10!=0)
 xiechar(10,1,codee[full_lucheng%100/10]);

 xiechar(11,1,codee[full_lucheng%10]);
 if(tingche_cishu/10!=0)
 xiechar(13,1,codee[tingche_cishu/10]);

 xiechar(14,1,codee[tingche_cishu%10]);
 }


 /************************************************************/
 void space_update(void)  //速度更新
 { 
   if(sk==1)
   {zheng_space=36*20/time_for;//计算速度的整数部分
   float_space=((36*20%time_for)*10)/time_for;//计算速度的小数部分
   xiechar(6,0,codee[float_space]);
   xiechar(2,0,codee[zheng_space/100]);
   xiechar(3,0,codee[zheng_space/10%10]);
   xiechar(4,0,codee[zheng_space%10]); 
    sk=0;time_for=0; }
	

  }


   



⌨️ 快捷键说明

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