当前位置:   article > 正文

基于51单片机的出租车计价器(霍尔测速)_单片机计价器功能测试

单片机计价器功能测试

目录

具体实现功能

设计介绍

51单片机简介

设计思路

设计内容

原理图(AD19)

程序(Keil5)

仿真实现(protues8.7)

全部资料


具体实现功能

系统由AT89C52单片机+霍尔传感器模块+LCD1602液晶屏+DS1302时钟模块+AT24C02掉电存储模块+直流电机+按键模块+电源构成。

具体功能:

1、无乘客模式:显示当前时间;

2、切换到乘客模式:可以显示起步价(三公里内)、单价(三公里后)、总价(元)、里程和乘车时间,可以按照里程或计时两种模式收费;

3、里程模式收费:在高速情况下,按照起步价和里程单价收费

4、计时收费模式:在低速情况下,按照计时时间和时间单价收费

5、按清零键,计价器可清除计价。

6、可以设置白天和夜晚的起步价、单价,可以设置计时模式的单价;

7、根据当前时间,白天和夜晚的收费不同。

液晶显示的字母:

D------白天起步价

P------里程单价

PT-----时间单价

N-----夜晚起步价

按键:设置键、增加键、减小键、切换键(切换时间/乘客模式)

设计介绍

51单片机简介

51单片是一种低功耗、高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

51系列单片机具有以下标准功能:

8k字节Flash,512字节RAM,

32位I/O口线,看门狗定时器,

内置4KB EEPROM,

MAX810复位电路,

三个16位定时器/计数器,

一个6向量2级中断结构,

全双工串行口。

另外, 51系列在空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机停止工作,直到下一个中断或硬件复位为止。本设计所使用的芯片可兼容以下所有的51系列单片机(包括AT系列和STC系列)。

设计思路

文献研究法:搜集整理相关研究资料,阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体实验等方法,发现相关存在问题和解决办法;

比较分析法:比较不同设计的具体原理,以及同一类传感器性能的区别,分析系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现硬件,最后测试各项功能是否满足要求。

设计内容

原理图(AD19

本系统原理图设计采用Altium Designer19,具体如图。

程序(Keil5)

本设计利用KEIL5软件实现程序设计,主函数如下:

  1. //主函数
  2. void main()
  3. {
  4. //初始化
  5. Ds1302_Init();
  6. Init_LCD();
  7. initeeprom();
  8. //SETS();
  9. //读取初始参数
  10. READS();
  11. //定时器初始化
  12. InitTimer0();
  13. //循环
  14. while(1)
  15. {
  16. //时钟模式
  17. if(Mode==0)
  18. {
  19. //读时间
  20. if(Wei==0)
  21. {
  22. Ds1302_Read_Time();
  23. //显示时间
  24. display_NYR(time_buf1,Wei,0);
  25. }
  26. }
  27. else if(Mode==1)
  28. {
  29. if(time_buf1[4]>=23||time_buf1[4]<7)
  30. DN=1;
  31. else
  32. DN=0;
  33. //显示计价器信息
  34. display_S(Day,Night,DanJia,ZJ,GL/10,Time,GT,DN);
  35. }
  36. if(K4==0)
  37. {
  38. delay(100);
  39. //调时
  40. if(Mode==0)
  41. {
  42. Wei++;
  43. if(Wei==1)
  44. {
  45. SS=1;
  46. }
  47. //闪烁
  48. display_NYR(time_buf1,Wei,SS);
  49. if(Wei==7)
  50. {
  51. Wei=0;
  52. //保存时间
  53. Ds1302_Write_Time();
  54. Init_LCD();
  55. }
  56. }
  57. else if(Mode==1)
  58. {
  59. JGWei++;
  60. if(JGWei==1)
  61. {
  62. Mode=2;
  63. //显示计价器价格
  64. Init_LCD_JGTZ();
  65. display_D(Day,Night,DanJia,JGWei,DJ_min);
  66. }
  67. }
  68. else if(Mode==2)
  69. {
  70. JGWei++;
  71. display_D(Day,Night,DanJia,JGWei,DJ_min);
  72. if(JGWei==5)
  73. {
  74. Mode=1;
  75. JGWei=0;
  76. //参数初始化
  77. //保存
  78. SETS();
  79. //读初值
  80. READS();
  81. ZJ=0;
  82. GL=0;
  83. Time=0;
  84. //开启定时器
  85. TR0=1;
  86. //显示计价器
  87. Init_LCD_JJQ();
  88. }
  89. }
  90. while(K4==0);
  91. }
  92. //+
  93. if(K3==0)
  94. {
  95. delay(100);
  96. //调时
  97. if(Mode==0)
  98. {
  99. //
  100. if(Wei==1)
  101. {
  102. time_buf1[1]++;
  103. if(time_buf1[1]>=100)
  104. time_buf1[1]=0;
  105. }
  106. //
  107. else if(Wei==2)
  108. {
  109. time_buf1[2]++;
  110. if(time_buf1[2]>=13)
  111. time_buf1[2]=1;
  112. }
  113. //
  114. else if(Wei==3)
  115. {
  116. time_buf1[3]++;
  117. if(time_buf1[3]>=YDay(time_buf1[1],time_buf1[2])+1)
  118. time_buf1[3]=1;
  119. }
  120. //
  121. else if(Wei==4)
  122. {
  123. time_buf1[4]++;
  124. if(time_buf1[4]>=24)
  125. time_buf1[4]=0;
  126. }
  127. //
  128. else if(Wei==5)
  129. {
  130. time_buf1[5]++;
  131. if(time_buf1[5]>=60)
  132. time_buf1[5]=0;
  133. }
  134. //
  135. else if(Wei==6)
  136. {
  137. time_buf1[6]++;
  138. if(time_buf1[6]>=60)
  139. time_buf1[6]=0;
  140. }
  141. //显示
  142. if(Wei!=0)
  143. display_NYR(time_buf1,Wei,SS);
  144. }
  145. //调价
  146. else if(Mode==2)
  147. {
  148. //单价
  149. if(JGWei==1)
  150. {
  151. DanJia++;
  152. if(DanJia>999)
  153. {
  154. DanJia=1;
  155. }
  156. }
  157. //等待时间单价
  158. else if(JGWei==2)
  159. {
  160. DJ_min++;
  161. if(DJ_min>999)
  162. {
  163. DJ_min=1;
  164. }
  165. }
  166. //夜间
  167. else if(JGWei==3)
  168. {
  169. Night++;
  170. if(Night>999)
  171. {
  172. Night=1;
  173. }
  174. }
  175. //白天
  176. else if(JGWei==4)
  177. {
  178. Day++;
  179. if(Day>999)
  180. {
  181. Day=1;
  182. }
  183. }
  184. display_D(Day,Night,DanJia,JGWei,DJ_min);
  185. }
  186. while(K3==0);
  187. }
  188. //-
  189. if(K2==0)
  190. {
  191. delay(100);
  192. //调时
  193. if(Mode==0)
  194. {
  195. //
  196. if(Wei==1)
  197. {
  198. time_buf1[1]--;
  199. if(time_buf1[1]<0)
  200. time_buf1[1]=99;
  201. }
  202. //
  203. else if(Wei==2)
  204. {
  205. time_buf1[2]--;
  206. if(time_buf1[2]<=0)
  207. time_buf1[2]=12;
  208. }
  209. //
  210. else if(Wei==3)
  211. {
  212. time_buf1[3]--;
  213. if(time_buf1[3]<=0)
  214. time_buf1[3]=YDay(time_buf1[1],time_buf1[2]);
  215. }
  216. //
  217. else if(Wei==4)
  218. {
  219. time_buf1[4]--;
  220. if(time_buf1[4]<0)
  221. time_buf1[4]=23;
  222. }
  223. //
  224. else if(Wei==5)
  225. {
  226. time_buf1[5]--;
  227. if(time_buf1[5]<0)
  228. time_buf1[5]=59;
  229. }
  230. //
  231. else if(Wei==6)
  232. {
  233. time_buf1[6]--;
  234. if(time_buf1[6]<0)
  235. time_buf1[6]=59;
  236. }
  237. //显示
  238. if(Wei!=0)
  239. display_NYR(time_buf1,Wei,SS);
  240. }
  241. //调价
  242. else if(Mode==2)
  243. {
  244. //单价
  245. if(JGWei==1)
  246. {
  247. DanJia--;
  248. if(DanJia==0)
  249. {
  250. DanJia=999;
  251. }
  252. }
  253. //等待时间单价
  254. else if(JGWei==2)
  255. {
  256. DJ_min--;
  257. if(DJ_min==0)
  258. {
  259. DJ_min=999;
  260. }
  261. }
  262. //夜间
  263. else if(JGWei==3)
  264. {
  265. Night--;
  266. if(Night==0)
  267. {
  268. Night=999;
  269. }
  270. }
  271. //白天
  272. else if(JGWei==4)
  273. {
  274. Day--;
  275. if(Day==0)
  276. {
  277. Day=999;
  278. }
  279. }
  280. display_D(Day,Night,DanJia,JGWei,DJ_min);
  281. }
  282. while(K2==0);
  283. }
  284. //切换
  285. if(K1==0)
  286. {
  287. delay(100);
  288. //计价器模式
  289. if(Mode==1)
  290. {
  291. Mode=0;
  292. ZJ=0;
  293. GL=0;
  294. Time=0;
  295. //开启定时器
  296. TR0=0;
  297. EX0=0;
  298. //显示计价器
  299. Init_LCD();
  300. }
  301. else if(Mode==0)
  302. {
  303. Mode=1;
  304. //参数初始化
  305. //读初值
  306. READS();
  307. ZJ=0;
  308. GL=0;
  309. Time=0;
  310. //开启定时器
  311. m=0;
  312. TR0=1;
  313. EX0=1;
  314. //显示计价器
  315. Init_LCD_JJQ();
  316. }
  317. while(K1==0);
  318. }
  319. }
  320. }

代码运行截图:

仿真实现(protues8.7)

本设计利用protues8.7软件实现仿真设计。

全部资料

全部资料包括程序(注释)、AD原理图、protues仿真、参考论文、程序讲解、仿真讲解、仿真视频、原理图讲解、资料使用介绍等,全网最全!!!

资料获取:
https://docs.qq.com/doc/DSWVmZVBOUGlkT01i

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/385654
推荐阅读
相关标签
  

闽ICP备14008679号