基于51单片机的出租车计价器设计【程序+proteus仿真+参考论文+AD原理图】

 一、项目功能简介

 整个设计系统由STC89C52单片机+DS1302时钟模块+LCD1602显示模块+DS18B20温度模块+24C02存储模块+L298电机驱动模块里+按键模块+蜂鸣器模块组成。

具体功能:

1、LCD1602显示日期时间、温度,计费开始显示起步价、里程价、总路程和总费用。

2、可设置时间、白天夜晚模式、白天起步价、白天里程价、夜晚起步价、夜晚里程价、电机的转速。

3、白天夜晚模式的起步价、里程价存储在24C02里面。

4、电机模拟霍尔传感器输出脉冲,计算总路程。

5、电机速度可调。

二、系统构成图


三、仿真

本次项目采用proteus8.11软件实现仿真设计。由于proteus软件版本原因,不能确保proteus其他版本软件能够正常运行,请安装好对应软件版本(版本一致或者高于这个版本都可以)

四、程序

void main()
{
  LCD_Init();            //LCD的初始化
  DS1302_Init();          //时间模块的初始化
  Timer0_Init();          //定时器0的初始化  
  Timer1_Init();          //定时器1的初始化  
  IT_init();            //外部中断初始化
  Motor_init();          //电机初始化  
//  DS1302_SetTime();        //用于DS1302第一次启动,写入时间
  DS1302_ReadTime();        //读取时间
  Temp_Buffer = Get_temp();      //读取DS18B20的值
  Delay_ms(500);          //等待1s等待DS18B20数据稳定。否则可能会出现85℃。
  LCD_ShowString(1,1,"  -  -  ");  //LCD先显示时间日期的标号
  LCD_ShowString(2,1,"  :  :  ");  
  AT24C02_Read(0,Price_num,6);  //从24C02读取单价数据
  BUZZ_F();            //初始化完成,蜂鸣器响一下
  while(1)
  {
//    Delay_ms(5);              //延时
    KeyNumber = Key();            //检测哪个按键被按下
    ShowSet();                //进入设置
    if(KeyNumber == 1 && SET_flag == 0 )  //按键1被按下 ,未进入其他界面
    {
      MODE++;                //显示界面++
      LCD_WriteCommand(0x01);        //清理LCD显示屏幕
      if(MODE > 2)            //只有三个显示界面,0-1-2  普通界面-时间设置界面-单价设置界面
      {
        MODE = 0 ;
      }
      if(MODE == 0 )            //退出设置模式,显示时间日期,运行模式,先显示时间
      {
        LCD_ShowString(1,1,"  -  -  ");  
        LCD_ShowString(2,1,"  :  :  ");
      }
      if(MODE == 1 )            //设置模式1 ,进入时间设置和速度设置
      {
        LCD_ShowString(1,1,"  -  -  ");  //LCD先显示时间日期的标号
        LCD_ShowString(2,1,"  :  :  ");
      }
      if(MODE == 2 )            //设置模式2 ,进入单价设置,白天和晚上
      {
        LCD_ShowString(1,1,"  R/ Km  R/Km D");
        LCD_ShowString(2,1,"  R/ Km  R/Km N");
      }
    }
    switch(MODE)              //显示选择模式
    {
      case 0: TimeShow();break;      //时间日期
      case 1: TimeSETShow();break;    //时间设置
      case 2: Price_SETShow();break;    //单价设置
      case 3: BD_Show();break;      //计费开始
    }
  }
}

五、原理图

本原理图利用AD17软件设计。

六、参考论文

总共有12k字的论文,都是自己收集资料纯手打的。

论文仅限于参考,内容跟项目对应。

七、全部资料


八、资料获取

关注公众号,后台回复:51出租车

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是c51串行通信汇编语言的示例程序,包括了51单片机双机串行通信的汇编语言程序Proteus仿真: 首先,需要定义串行通信协议参数: ``` baudrate EQU 34H ; 波特率设置 RXD EQU 0 ; 串行接收引脚 TXD EQU 1 ; 串行发送引脚 ``` 然后,需要初始化串行口和中断: ``` ; 初始化串行口 INIT_SERIAL: MOV SCON,#50H ; 串行口工作在模式1 MOV TMOD,#20H ; 定时器1工作在模式2,用于波特率发生器 MOV TH1,#baudrate ; 波特率发生器的初始值 SETB TR1 ; 启动波特率发生器 SETB ES ; 打开串行口中断 RET ``` 接着,需要编写发送数据和接收数据的代码: ``` ; 发送数据 SEND_DATA: MOV A,#data ; 要发送的数据 MOV SBUF,A ; 将数据存入发送缓冲区 JNB TI,$ ; 等待发送完成 CLR TI ; 清除发送完成标志 RET ; 接收数据 RECEIVE_DATA: JNB RI,$ ; 等待接收数据 MOV data,SBUF ; 将接收到的数据存入data中 CLR RI ; 清除接收中断标志 RET ``` 最后,需要在中断服务程序中编写发送和接收数据的代码: ``` ; 中断服务程序 SERIAL_ISR: JNB TI,SEND_ISR ; 如果没有发送中断,跳转到接收中断 CLR TI ; 清除发送中断标志 RETI ; 返回中断 SEND_ISR: JNB RI,$ ; 等待接收中断 MOV A,SBUF ; 将接收到的数据存入A中 MOV SBUF,A ; 将A中的数据发送出去 CLR RI ; 清除接收中断标志 RETI ; 返回中断 ``` 在主程序中,可以调用发送数据和接收数据的函数: ``` MAIN: CALL INIT_SERIAL ; 初始化串行口和中断 CALL SEND_DATA ; 发送数据 CALL RECEIVE_DATA ; 接收数据 SJMP MAIN ; 循环执行 ``` 以上是一个简单的51单片机双机串行通信的汇编语言程序示例,可以用Proteus进行仿真测试。需要注意的是,在Proteus中需要添加一个串行口模块,并将其连接到51单片机的串行引脚上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值