基于单片机的出租车计价器设计(附源程序)

本设计的是一个基于单片机 AT89S52 的出租车自动计费设计 ,附有复位电路 ,时钟电路,键盘电路等。 复位电路是单片机的初始化操作 ,除了正常的初始化外 ,为摆脱困境 ,通过复位电路可以重新开始。 时钟电路采用 12MHz 的晶振 ,作为系统的时钟源 ,具有较高的准确性。


在上电时字符型液晶 1602 显示最初的起步价, 里程收费,等待时间收费三种收费,通过按键可以调整起步价,里程收费,等待时间收费。通过按键模拟出租车的运行,暂停,停止。在 1602 液晶上可以显示运行的时间,运行时暂停的时间,通过计算可以得出总共的费用和总的路程。 在这里主要是以 AT89S52 单片机为核心控制器, P0 口接 1602液晶显示模块, P1 口接按键的,通过按键输入。


方案一:采用数字电子技术,利用 555 定时芯片构成多谐振荡器,或采用外围的晶振电路作为时钟脉冲信号, 采用计数芯片对脉冲尽心脉冲的计数和分频,最后通过译码电路对数据进行译码,将译码所得的数据送给数码管显示,一下是该方案的流程框图,方案一如图 1.1 所示:



案二:采用 EDA 技术,根据层次化设计理论,该设计问题自顶向下可分为分频模块,控制模块 计量模块、译码和动态扫描显示模块,其系统框图如图 1.2 所示:




方案三:采用 MCU 技术,通过单片机作为主控器,利用 1602 字符液晶作为显示电路,采用外部晶振作为时钟脉冲,通过按键可以方便调节,一下是方案三的系统流程图,本方案主要是必须对于数字电路比较熟悉,成本又高。方案图如图 1.3 所示:




方案总结:通过各个方案的比较本次采用方案三,不但控制简单,而且成本低廉,设计电路简单。


程序:
  1. #include
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rw=P2^1;// 读或写
  5. sbit rs=P2^0;//
  6. sbit en=P2^2;//读写时能控制端
  7. sbit b=P0^7;//液晶判断忙标志位
  8. void lcd_init();//
  9. void wr_com(uchar command);// 液晶写命令
  10. void wr_data(uchar data0);//写数据
  11. void lcd_clear();// 液晶清屏
  12. void lcd_set();// 设置液晶的起始位置
  13. void busy();// 液晶判忙函数
  14. void display();// 显示
  15. void printstring(uchar *s);// 直接写字符
  16. void display1();
  17. void key1();
  18. sbit K=P1^0;
  19. sbit K1=P1^1;
  20. sbit K2=P1^2;
  21. sbit K3=P1^3;
  22. sbit K4=P1^4;
  23. sbit g=P2^7;
  24. sbit aa=P2^3;
  25. sbit bb=P2^4;
  26. sbit cc=P2^5;
  27. sbit led_run=P3^0;
  28. sbit led_await=P3^1;
  29. sbit led_stop=P3^2;
  30. bit f_start;// 开始标志位
  31. bit jump_in;// 跳入开始标志位
  32. bit jump_out;// 跳出标志位
  33. void key();
  34. uchar code table[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x70};// 字符 1,
  35. 2,3,,,,,0
  36. uchar dispbuf[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  37. uchar dispbuf1[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  38. uchar v,v1;//按键次数累加变量
  39. uchar i;
  40. void init();//
  41. void chuli();//
  42. void chuli1();//
  43. void delay(uchar t);//
  44. void clear();//
  45. void set(uchar x);//
  46. void set1(uchar y);//
  47. uchar command;//
  48. uchar count,count1;//
  49. uchar second,minite,second1,minite1;//
  50. unsigned int tt,tt1;//
  51. unsigned char value1=50,value2=25,value3=15;//起始价,运行价,等待价
  52. unsigned int money;//金额变量
  53. //*******************************************
  54. void main()
  55. {
  56. init();
  57. lcd_init();
  58. while(1)
  59. {
  60. key1();
  61. chuli();
  62. display();
  63. if(jump_in==1)
  64. {
  65. jump_in=0;
  66. lcd_init();
  67. while(1)
  68. {
  69. key();
  70. chuli1();
  71. display1();
  72. if(jump_out==1)
  73. {
  74. lcd_init();
  75. jump_out=0;
  76. clear();
  77. break;
  78. }
  79. }
  80. }
  81. }
  82. }
  83. //*******************************************
  84. void clear()// 跳出下一次
  85. {
  86. TR0=0;
  87. TR1=0;
  88. money=0;
  89. second=0;
  90. second1=0;
  91. minite=0;
  92. minite1=0;
  93. value1=50;
  94. value2=25;
  95. value3=15;
  96. led_run=1;
  97. led_await=1;
  98. led_stop=1;
  99. v=0;
  100. v1=0;
  101. for(i=0;i<15;i++)
  102. {
  103. dispbuf[i]=0;
  104. dispbuf1[i]=0;
  105. }
  106. }
  107. //*******************************************
  108. void init()// 定时器初始化
  109. {
  110. TMOD=0x11;
  111. TH0=(65536-50000)/256;
  112. TL0=(65536-50000)%256;
  113. TH1=(65536-50000)/256;
  114. TL1=(65536-50000)%256;
  115. ET0=1;
  116. ET1=1;
  117. EA=1;
  118. TR0=0;
  119. TR1=0;
  120. }
  121. //*******************************************
  122. void t0_(void) interrupt 1 using 0// 定时器 0 中断
  123. {
  124. count++;
  125. if(count==20)
  126. {
  127. count=0;
  128. second++;
  129. if(second==60)
  130. {
  131. second=0;
  132. minite++;
  133. if(minite==99)
  134. {
  135. minite=0;
  136. }
  137. }
  138. }
  139. TH0=(65536-50000)/256;
  140. TL0=(65536-50000)%256;
  141. dispbuf1[0]=minite/10;
  142. dispbuf1[1]=minite%10;
  143. dispbuf1[2]=second/10;
  144. dispbuf1[3]=second%10;
  145. }
  146. //*******************************************
  147. void t1_(void) interrupt 3 using 3// 定时器 1 中断
  148. {
  149. count1++;
  150. if(count1==20)
  151. {
  152. count1=0;
  153. second1++;
  154. if(second1==60)
  155. {
  156. second1=0;
  157. minite1++;
  158. if(minite1==99)
  159. {
  160. minite1=0;
  161. }
  162. }
  163. }
  164. TH1=(65536-50000)/256;
  165. TL1=(65536-50000)%256;
  166. dispbuf1[4]=minite1/10;
  167. dispbuf1[5]=minite1%10;
  168. dispbuf1[6]=second1/10;
  169. dispbuf1[7]=second1%10;
  170. }
  171. //*******************************************
  172. void lcd_init()// 液晶初始化
  173. {
  174. wr_com(0x3c);
  175. wr_com(0x06);
  176. wr_com(0x0c);
  177. wr_com(0x01);
  178. }
  179. //*******************************************
  180. void wr_com(uchar command)// 液晶写命令
  181. {
  182. busy();
  183. rs=0;
  184. rw=0;
  185. P0=command;
  186. en=1;
  187. en=0;
  188. }
  189. //*******************************************
  190. void wr_data(uchar data0)//液晶写数据
  191. {
  192. busy();
  193. rs=1;
  194. rw=0;
  195. P0=data0;
  196. en=1;
  197. en=0;
  198. }
  199. //*******************************************
  200. void busy()//液晶判忙
  201. {
  202. while(1)
  203. {
  204. en=0;
  205. rs=0;
  206. rw=1;
  207. P0=0xff;
  208. en=1;
  209. if(b!=1)break;
  210. }
  211. en=0;
  212. }
  213. //*******************************************
  214. void chuli()// 数值处理
  215. {
  216. dispbuf[0]=value1/100%10;
  217. dispbuf[1]=value1/10%10;
  218. dispbuf[2]=value1%10;
  219. dispbuf[3]=value2/100%10;
  220. dispbuf[4]=value2/10%10;
  221. dispbuf[5]=value2%10;
  222. dispbuf[6]=value3/100%10;
  223. dispbuf[7]=value3/10%10;
  224. dispbuf[8]=value3%10;
  225. }
  226. //*******************************************
  227. void display()
  228. {
  229. set(0);
  230. printstring("step :");
  231. wr_data(table[dispbuf[0]]);
  232. wr_data(table[dispbuf[1]]);
  233. printstring(".");
  234. wr_data(table[dispbuf[2]]);
  235. set(16);
  236. printstring("mileage :");
  237. wr_data(table[dispbuf[3]]);
  238. wr_data(table[dispbuf[4]]);
  239. printstring(".");
  240. wr_data(table[dispbuf[5]]);
  241. set1(0);
  242. printstring("await :");
  243. wr_data(table[dispbuf[6]]);
  244. wr_data(table[dispbuf[7]]);
  245. printstring(".");
  246. wr_data(table[dispbuf[8]]);
  247. /*
  248. set1(16);
  249. printstring("run : ");
  250. wr_data(table[dispbuf1[0]]);
  251. wr_data(table[dispbuf1[1]]);
  252. printstring(":");
  253. wr_data(table[dispbuf1[2]]);
  254. wr_data(table[dispbuf1[3]]);
  255. */
  256. }
  257. //*******************************************
  258. void chuli1()
  259. {
  260. if(f_start==1)
  261. {
  262. tt=minite*60+second;// 总时间
  263. tt1=minite1;// 等待时间
  264. money=value1+value2*0.1*tt+value3*tt1;// 起始价 +每公里价 * 时间 *速度 +等待价 *等待
  265. 时间
  266. }
  267. else if(f_start==0)
  268. {
  269. money=0;
  270. }
  271. dispbuf1[8]=money/100%10;//
  272. dispbuf1[9]=money/10%10;//
  273. dispbuf1[10]=money%10;//
  274. }
  275. //*******************************************
  276. void display1()
  277. {
  278. set(0);
  279. printstring("run: ");
  280. wr_data(table[dispbuf1[0]]);
  281. wr_data(table[dispbuf1[1]]);
  282. printstring(":");
  283. wr_data(table[dispbuf1[2]]);
  284. wr_data(table[dispbuf1[3]]);
  285. set(14);
  286. printstring("await:");
  287. wr_data(table[dispbuf1[4]]);
  288. wr_data(table[dispbuf1[5]]);
  289. printstring(":");
  290. wr_data(table[dispbuf1[6]]);
  291. wr_data(table[dispbuf1[7]]);
  292. set1(0);
  293. printstring("sum is: ");
  294. wr_data(table[dispbuf1[8]]);
  295. wr_data(table[dispbuf1[9]]);
  296. printstring(".");
  297. wr_data(table[dispbuf1[10]]);
  298. }
  299. //*******************************************
  300. void printstring(uchar *s)// 行字符函数
  301. {
  302. while(*s)
  303. wr_data(*s++);
  304. }
  305. //*******************************************
  306. void key()
  307. {
  308. if(K3==0)
  309. {
  310. delay(50);
  311. if(K3==0)
  312. {
  313. while(K3==0);
  314. v1++;
  315. if(v1==4) v1=0;
  316. }
  317. }
  318. switch(v1)
  319. {
  320. case
  321. 1:f_start=1;TR0=1;TR1=0;led_run=0;led_await=1;led_stop=1;aa=1;bb=0;cc=1;break;
  322. case 2:TR0=0;TR1=1;led_run=1;led_await=0;led_stop=1;aa=0;cc=0;break;
  323. case 3:TR0=0;TR1=0;led_run=1;led_await=1;led_stop=0;break;
  324. }
  325. if(K4==0)
  326. {
  327. delay(50);
  328. if(K4==0)
  329. {
  330. while(K4==0);
  331. jump_out=1;
  332. }
  333. }
  334. }
  335. //*******************************************
  336. void delay(uchar t)
  337. {
  338. while(--t);
  339. }
  340. //*******************************************
  341. void set(uchar x)
  342. {
  343. command=0x80+x;
  344. wr_com(command);
  345. }
  346. //*******************************************
  347. void set1(uchar y)
  348. {
  349. command=0xc0+y;
  350. wr_com(command);
  351. }
  352. //*******************************************
  353. void key1()
  354. {
  355. if(K==0)
  356. {
  357. delay(100);
  358. if(K==0)
  359. {
  360. while(K==0);
  361. v++;
  362. if(v==4) v=0;
  363. }
  364. }
  365. switch(v)
  366. {
  367. case 0:break;
  368. case 1:if(K1==0){while(K1==0);value1=value1+10;}break;// 起步价加 10
  369. case 2:if(K1==0){while(K1==0);value2=value2+5;}break;// 单价加 5
  370. case 3:if(K1==0){while(K1==0);value3=value3+5;}break;// 停止加 5
  371. }
  372. if(K2==0)
  373. {
  374. delay(50);
  375. if(K2==0)
  376. {
  377. while(K2==0);
  378. jump_in=1;//
  379. }
  380. }
  381. }
复制代码




文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-210619-1-1.html

你可能感兴趣的:(基于单片机的出租车计价器设计(附源程序))