找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4942|回复: 1
打印 上一主题 下一主题
收起左侧

单片机出租车计价器毕业设计论文下载

[复制链接]
跳转到指定楼层
楼主
该帖有一个WIFI模块资料,一个出租车计价毕业设计

所有资料下载:
网络模块.rar (2.82 MB, 下载次数: 53)
出租车计费器毕业设计.doc (337 KB, 下载次数: 64)

济南铁道职业技术学院

毕业设计报告摘要

本文介绍了以STC12C5A08AD单片机为核心的多功能出租车计价器的设计 ,阐述了系统软硬件设计过程及关键技术。经测试,本计价器具有计程、计价、计时、等待时间计价等多种计量功能,并且具有存储、查询、起步价、起步价里程和每公里价格的预置价格预置密码确认、车速显示、超速提醒、语音服务、清单打印和车内温度显示等多种功能。

关键词

出租车计价器  多功能  STC12C5A08AD  软硬件设计



目   录
1 引言  ………………………………………………………………………… 1
2 方案论证  …………………………………………………………………… Y
  2.1 主控芯片的选择  ……………………………………………………… Y
  2.2 键盘选择 ……………………………………………………………… Y
  2.3扫描方式的选择 ……………………………………………………… Y
  2.4显示驱动方式选择 ……………………………………………………… Y
3 系统整体 …………………………………………………………………… Y
  3.1系统整体框图………………………………………………………………Y
4各单元电路设计……………………………………………………………… Y
  4.1主控单元………………………………………………………………… Y
  4.2模拟出租车车速装置与里程检测单元……………………………………Y
  4.3键盘控制单元…………………………………………………………… Y
  4.4数码显示单元…………………………………………………………… Y
  4.5实时时钟与等待时间累加单元………………………………………… Y
  4.6语音播报与超速提醒单元……………………………………………… Y
  4.7票据打印单元…………………………………………………………… Y
  4.8车内实时温度显示单元………………………………………………… Y
5系统软件设计………………………………………………………………… Y
6测试方案与测试结果………………………………………………………… Y
  1  系统性能测试项目表………………………………………………… Y
  表2  按键模拟设置里程、单程/往返计价测试结果……………………… Y
  表3  预置转速后计价测试结果…………………………………………… Y
  表4  累计等待时间计价功能测试结果…………………………………… Y
  表5  起步价、起步里程与每公里价格预置功能测试结果………………… Y
  表6  白天/晚上计价标准测试结果  ……………………………………… Y
总结 …………………………………………………………………………… Y
致谢 …………………………………………………………………………… Y
参考文献…………………………………………………………………………Y
附录一主程序流程 …………………………………………………… Y
附录二 计价子程序流程 …………………………………………………… Y
附录三显示子程序 …………………………………………………… Y
附录四时钟子程序 …………………………………………………… Y
附录五 温度传感器子程序 …………………………………………………… Y



引   言
出租车计价器是出租车营运收费的专用智能化仪表 ,随着电子技术的发展 ,出租车计价器技术也在不断进步和提高。国内出租车计价器已经经历了4 个阶段的发展。从传统的全部由机械元器件组成的机械式,到半电子式即用电子线路代替部分机械元器件的出租车计价器;再从集成电路式到目前的单片机系统设计的出租车计价器。出租车计价器计费是否准确、出租车司机是否超速才是乘客最关心的问题,而计价器营运数据的管理是否方便又是出租车司机最关注的。因此设计出一种既能有效防止司机作弊和超速又能方便司机的计价器尤为重要。因此,本文以单片机STC12C5A08AD为核心设计一款多功能出租车计价器,该计价器能实现里程计价与显示、数据存储与查询、时钟显示、超速提醒、语音播报和票据打印等功能。它比市场上的一些计价器使用更方便 ,功能更全,还具有有效防止司机作弊和系统稳定性好的优点。其中的超速提醒功能可以提醒司机和乘客 ,以告诫司机不要超速行驶,以避免交通事故的发生。
方案论证
1、主控芯片选择
方案一: 用普通的51系列单片机,可以满足设计要求,但从成本、功耗、运行速度方面不及STC系列单片机。
方案二: 采用增强型STC系列单片机,STC系列单片机具有高速、低功耗高可靠、强抗干扰,强抗静电、超低价等优点,因此本设计采用STC12C5A08AD作为系统主控芯片。
2、键盘选择
方案一:采用独立式键盘,由于本设计需要设有单程、往返、暂停、清除、键盘预置、价格预置密码确认等功能键,如果采用独立式键盘,编程复杂,对使用者来说,操作十分不方便。
方案二:采用矩阵式键盘,编程简单,无论是按键控制还是密码输入都很方便,容易被使用者接受和使用。本设计采用此方案。
3、扫描方式选择
方案一:采用动态扫描显示,由于本设计需要显示的内容较多,采用的数码管位数多。如果采用动态显示,需要将16 个数码管分组驱动,占用I/O多,在轮流显示过程中,每位数码管的点亮时间为1~2ms,扫描速度跟不上,各位数码管并非同时点亮,显示亮度不够。
方案二:采用静态显示,静态驱动的优点是不存在扫描速度及闪烁问题,因此编程简单;数码管位选通由各自独立74HC595驱动控制显示稳定且亮度高。本设计采用此方案。
4、显示驱动方式选择
方案一: 采用74HC164做驱动,成本低,接线少,但驱动能力弱,没有锁存,数码管显示不稳定。
方案二:采用74HC595做驱动,驱动能力强,有锁存端,数码管显示稳定,因此本设计采用此方案。
系统整体方案
  • 系统整体框图

图 1 系统整体框图
整体方案设计方框图如图 1 所示,整个系统由单片机STC12C5A08AD控制,整个系统由光电传感器速度采集部分, DS1302 时钟电路、ISD2560语音播报电路、票据打印电路、温度采集、模拟车速装置、超速提醒和价格预置等组成,采用 4×4矩阵式键盘控制、显示电路采用74HC595驱动。
各单元电路设计
1、主控单元
本设计采用STC系列单片机STC12C5A08AD控制,利用单片机采集按键及车速模拟传感器信息完成各种控制,并利用其内部存储器,当通过按键设定一次数据完毕后(如:昼夜单价、等候时间、起租里程、起租金额等),系统就自动调用存储程序,将数据信息保存在芯片内;当系统重新上电时,自动调用读存储器程序,将存储器内的数据信息,读到缓存单元中,供主程序使用。由于保存在单片机中的数据是不能随意进行改动,因此它具有防作弊功能。此外出租车营运过程中的一些营运数据,如:单次出租的营运额和营运里程、一段时间内的营运总额和总路程等,也存储在单片机中,以便出租车公司及司机查询,使出租车司机与出租公司更便于管理营运数据。
2、模拟出租车车速装置与里程检测单元
本单元控制部分采用一片STC系列单片机STC12C5A08AD控制,通过改变单片机送给步进电机驱动模块的脉冲信号频率,控制步进电机的转速。步进电机带动转盘转动,用光电传感器同步检测转盘的转速信号,送主控单元单片机处理,转换成实时车速显示。本单元设有三个按键,一个为转速预置控制键,另外两个是预设转速加减键,预设转速可以在本单元同步显示。模拟出租车车速装置与里程测量单元电路原理如图3所示。

图2 主控单元电路图
3、键盘控制单元
  根据题目要求,需要设置的键盘较多,故本设计采用4×4矩阵式键盘,键盘功能如图4所示。按单程/往返按键一次,进行单程计价,连续按单程/往返按键两次,进行往返计价;到达目的地后,按“暂停”键,计价器可暂停计价;反复按“查询”键,计价器能依次显示总等待时间,里程数和金额数;按“清除”键,能将记录的数据(里程、等待时间与价格等)清0;按价格预置/时间调整键一次,进入起步价、起步价里程和每公里价格的预置状态,输入4位密码后,开始预置起步价,预置完后按价格预置/时间调整键确认,再预置起步价里程每公里价格,每预置完一项,按价格预置/时间调整键一次,进行确认;连续按价格预置/时间调整键两次,进入时间调整程序,通过数字键输入时间即可。按下“按键模拟“键,进入按键模拟状态,每按一次,行车里程加0.1公里。

图3 模拟出租车车速装置与里程测量单元

图4  4×4矩阵式键盘
4、数码显示单元
本设计采用16位的高亮度LED数码管分别显示行车里程数(4 位),金额数(4 位),实时车速(4 位),另外4位轮流显示车内实时温度(红)、实时时钟(黄)和累计等待时间(绿),显示内容分别用红黄绿指示灯示意。当为空车时,为了节电,只显示实时时间和车内实时温度 ,为供司机查看时间提供方便;当司机要查询以往的营运数据时,按查询键时,计价器依次显示总等待时间、里程数和金额数;有乘客时显示营运的实时车速、程数、金额数,轮流显示车内实时温度(红)、实时时钟(黄)和累计等待时间(绿)。显示驱动器采用16片串入并出8位移位寄存器74HC595级联。显示电路如图5所示。

图5  数码显示单元
5、实时时间与等待时间单元
时间计时采用美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片DS1302计价器在出租车空车行驶时显示实时时钟;有乘客时,轮流显示实时时间和累计等待时间。
累计等待时间的确定方法是:当单片机检测车速低于5公里/小时时,启动内部定时器开始计时,车速高于5公里/小时时,停止计时,单片机将各次等待时间累加,作为总等待时间。等待时间显示与实时时间显示轮流进行。
利用DS1302的实时时钟作为白天/晚上单价自动转换的一个基准 ,通过 DS1302 获取时间信息分辨白天/晚上 ,然后调用内部程序存储器信息,获取白天/晚上的单价及起始价 ,便开始计价并显示时间、里程和金额等信息;当实时时间在21:00至次日5:00时,执行晚上收费标准。DS1302STC12C5A08AD的连接图如图6所示。
6、语音播报与超速提醒单元
为使计价器更加微型化、智能化、人性化,我们设计了语音播报与超速提醒功能。语音芯片采用集成度较高ISD2560芯片,其最大特点是采用E2PROM进行模拟信息直接存取而不必经过A/D和D/ A转换。它内部带有话筒放大器、自动增益控制时钟、扬声器驱动电路等,采用+ 5V电源供电。语音模块与单片机的接口如图7所示。设计过程中 ,先将固定语音部分(上、下车、超速提醒用语)信息存储到ISD2560内部的不同起点地址中。营运过程中根据上、下车与超速的不同营运状态来实现不同语音功能播放。在语音芯片工作时,系统首先主程序调用放音处理程序,根据发音地址寻找ISD2560中的发音单元 ,然后将信号送到扬声器发出声音。
当空车灯掰下乘客上车时:ISD2560语音播报电路进行语音播报1(欢迎乘客乘坐本出租车…);当空车灯打上,乘客下车时:进行播报2(谢谢再次乘坐本出租车,请交金额…);当单片机检测到超速信息时,进行播报3(车辆超速、请减速

图7 语音播报与超速提醒单元电路
7、票据打印单元
本系统设有票据打印功能,当出租车到达指定地点,司机翻起空车牌,便产生一个信号通知单片机,单片机启动打印服务,将行车的中途等待时间、营运里程、单价、金额、日期及上下车时间等数据打印成出租车专用发票。微型打印机接口电路如图7所示。该电路采用接口插板方式与单片机相连,这一特点使得计价器的票据打印在功能上与主系统一体化,而在检查、维修时又可单独进行。本设计中所用微打是RD系列微型打印机,微型打印机与单片机通过串行接口相连,当所需要打印的数据出现在打印机串行输入口时,STB只要从高电平转到低电平,再从低电平转到高电平,就可把数据送入打印机。这时打印机将 BUSY 线置为忙(高电平),禁止新数据输入;当打印机取走数据并处理完毕后,BUSY线被置为闲(低电平),同时送出回答脉冲ACK通知系统,可以再次输入数据。
8、车内实时温度显示单元
本设计增加了车内实时温度检测功能,我们采用温度芯片DS18B20。DS18B20是DALLAS公司生产的一线式数字温度传感器,具有3引脚TO-92小体积封装形式。测温分辨率可达0.0625℃,被测温度用符号扩展的16位数字量方式串行输出。CPU只需一根端口线就能与诸多DS18B20通信,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
系统软件设计
在主程序模块中,需要完成对各芯片的初始化,各中断的初始化(外部中断 0、外部中断1、T0的初始化),另外,在主程序模块中还需要设置启动/清除标志寄存器、里程寄存器和金额寄存器,并对它们进行初始化。然后,主程序将根据各标志寄存器的内容,分别完成车速检测、显示、累计等待时间、计程和计价等不同的操作。主程序流程图如图8所示。
单片机采集并判断空车灯信号及路程检测传感器信号,当出租车启动时 ,单片机检测到光电传感器的脉冲信号并进行里程计算。当无乘客时,单片机调用实时时间芯片DS1302 程序和串口显示驱动程序,用4只LED进行时钟显示;当空车灯掰下乘客上车时: ISD2560 语音播报电路进行语音播报1 (欢迎乘客乘坐本出租车 …),通过DS1302 获取时间信息分辨白天/晚上,然后调用内部程序存储器信息,获取白天/晚上的单价及起始价,便开始计价并显示时间、里程和金额等信息;当空车灯打上,乘客下车时:进行播报 2 (谢谢再次乘坐本出租车 ,请交金额 …) ,并打印好票据 ,单片机将营运数据信息存储到内部存储器中 ;等出租车再次启动后,本次金额与里程等信息清零复位 ,就此完成一次计价。当单片机检测到超速信息时,进行播报3(车辆超速,请减速


测试方案与测试结果
表1  系统性能测试项目表            
题目要求
测试项目与方法
测试结果
结果
描述




1、按单程/往返键,利用按键模拟设置里程,观察数码管显示信息;
测试数据见表2
本设计很好的完成了题目基本要求的各项内容
2、按单程/往返键,然后用按键模拟,连续调整里程,观察数码管显示信息;
按单程键后,用按键模拟,行程按0.1公里步距递进,动态显示公里与金额数
3、按暂停键,观察计价器的信息;
在正常计价状态下按下暂停键,停止计价
4、按清除键,观察数码管的显示状态;
除实时时间显示正常外,其他各数码管均显示零
5、反复按查询键,观察显示内容。

按查询键,显示里程数,再按查询键,显示金额数




利用键盘预置转速,利用数字钟计时,测试5分钟,观察车速、里程、金额各项显示
测试数据见表3所示
本系统能很好的完成题目发挥部分的各项要求
等待时间计价功能:通过不断改变转速设置值,各测试5分钟,观察等待时间、里程和价格显示情况
测试数据见表4所示
起步价、起步价里程与每公里价格预置功能测试,按价格预置键一次,输入4位密码后,预置起步价,起步价里程每公里价格,设置转盘转速,测试5分钟,观察显示信息
测试数据见表5所示




语音播报功能测试:接通和断开模拟空车灯开关,检测播报情况;设置车速100公里/小时,检测超速提示情况
按设置内容正常播报

打印功能测试:按暂停键后,启动打印机打印里程与金额,观察打印结果
打印结果与显示相符
白天/晚上计价标准测试:调整DS1302时间2100至次日500时中任意时间,设置车速,测试5分钟,观察里程和金额等信息
测试数据见表6所示
温度显示
能轮流显示实时温度

表2  按键模拟设置里程,单程/往返计价测试结果
金额(元)            里程(公里
单程金额
往返金额
误差
理论值
显示值
理论值
显示值
10.0
22.0
22.0
18.5
18.5
0
15.0
32.0
32.0
26.0
26.0
0
25.0
52.0
52.0
41.0
41.0
0
40.0
82.0
82.0
63.5
63.5
0
60.0
122.0
122.0
93.5
93.5
0
表3  预置转速后计价测试结果

预设转速R/min
实时车速显示
(公里/时)
里程(公里)
价格 /
误差
单程
往返
观测5分钟
10
10.0
50.0
102.0
78.5
0
15
15.0
75.0
152.0
116.0
0
25
25.0
125.0
252.0
191.0
0
40
40.0
200.0
402.0
303.5
0
55
55.0
275.0
552.0
416.0
0
表4  累计等待时间计价功能测试结果

转速/min
等待时间
里程
(公里)
金额(元)
误差
单程
往返
0
各观测5分钟
3
5
15.0
34.0
27.5
0
5
5
25.0
54.0
42.5
0
10
0
50.0
102.0
78.5
0
20
0
100.0
202.0
153.5
0
40
0
200.0
402.0
303.5
0
总计

10
390.0
794.0
605.5
0

表5  起步价、起步价里程与每公里价格预置功能测试结果
起步价(元)
起步里程(公里)
每里价格(元)
测试
转速R/min
里程
(公里)
价格/
单程
往返
单程
往返
6.0
4.0
2.0
1.5
观测
5分钟
10
50.0
98.0
75.0
8.0
3.0
2.0
1.0
25
125.0
252.0
130.0
5.0
2.0
3.0
2.0
30
150.0
449.0
301.0
10.0
5.0
2.0
1.0
50
250.0
500.0
255.0
时间段/
起步价
(元)
起步里程(公里)
每公里价格/
公里
(公里)
价格/
单程
往返
单程
往返
8---10
8.0
3.0
2.0
1.5
10.0
22.0
18.5
12---16
8.0
3.0
2.0
1.5
20.0
42.0
33.5
22---24
8.0
3.0
2.5
2.0
10.0
25.5
22.0
3---5
8.0
3.0
2.5
2.0
20.0
50.5
42.0
6  白天/晚上计价标准测试结果



总  结

在本次设计的过程中,我遇到了各种困难和许多没有预想到情况,但通过自己的努力老师的协作以及同学的帮助,我终于克服了困难,顺利完成了本次的设计任务,达到了预期的目的。脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助在这次毕业设计中也使我们的同学关系更进一步了,同学之间互相帮助,有什么不懂的大家在一起商量,听听不同的看法对我们更好的理解知识,所以在这里非常感谢帮助我的同学。在此更要感谢我的导师和专业老师,是你们的细心指导和关怀,使我能够顺利的完成毕业论文。在我的学业和论文的研究工作中无不倾注着老师们辛勤的汗水和心血。老师的严谨治学态度、渊博的知识、无私的奉献精神使我深受启迪。从尊敬的导师身上,我不仅学到了扎实、宽广的专业知识,也学到了做人的道理。在此我要向我的导师致以最衷心的感谢和深深的敬意。
所设计的多功能出租车计价器不仅功能齐全,而且经过测试,各项测试指标均达到了要求。通过这次设计活动,我在硬件设计、软件编程方面的能力得到了极大的提高。为以后走向工作岗位积累了不可多得的经验。这种体验为我们走好今后的人生路增添了极大的信心。



参考文献

[1 ] 何立民.单片机应用技术选编[M] .北京:北京航空航天大学出版社 ,1999.
[2 ] 求实科技.单片机典型模块设计实例导航[M] . 北京:人民邮电出版社 ,2004.
[3 ] 陈小忠.单片机接口技术实用子程序[M] . 北京:人民邮电出版社 ,2005.
[4 ] 赵晶主.电路设计与制版 Protel99 高级应用[M] . 北京:人民邮电出版社 ,2000.
[5 ] 全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品精选[M] .北京:北京理工大学出版社 ,2000.
[6 ] 杨恢先 ,黄辉先.单片机原理及应用[M] .长沙:国防科技大学出版社 ,2003.




附录一
主程序流程

图8  系统的主程序流程框图


附录二
计价子程序流程:

图9 计价子程序流程图


附录三
显示子程序:
  1. //静态显示

  2. #include

  3. #include



  4. //定义定形码表,共阳极

  5. unsigned char code dispTab[]={

  6. //0   1    2    3    4     5    6    7    8   9    0X03,0X9F,0X25,0X0D,0X99,0X49,0X41,0X1F,0X01,0X09,0XFD,0xff              };

  7. #define uint unsigned int

  8. #define uchar unsigned char

  9. sbit ST_CP              =P2^1;                            //74HC595(12)-ST_CP 上升沿--移位寄存器的数据进入数据存储寄存器 输出锁存器的时钟信号端口

  10. sbit MR               =P2^0;                             //74HC595(10)-MR 为0将移位寄存器的数据清0

  11. sbit oe     =P2^2;

  12.   }



  13. void sendData(unsigned char sendDat)              //传送一个字节的数据数据

  14. {              unsigned char i;

  15.               for(i=0;i<8;i++)

  16.               {              if((sendDat&0x01)==0) SDAT=0;

  17.                             else  SDAT=1;

  18.                             _nop_();                            SHCP=0;                            _nop_();

  19.                      SHCP=1

  20.                             sendDat=sendDat>>1;

  21.               }

  22. }

  23. //-----------------------------------------

  24. //静态显示函数,模拟串口+74LS595

  25. //参数:*dispBuf显示缓冲区

  26. //      n显示位数

  27. void disp(unsigned char data *dispBuf,unsigned char n)

  28. {              unsigned char c, i;

  29.                             for(i=0;i<n;i++)

  30.               {              c=dispBuf[i];                                          //取出待显示字符

  31.                             sendData(dispTab[c]);              //送出字形码数据

  32.                             delayn(2000);

  33.               }                  STCP=0;

  34.                             STCP=1;                                                                                    //输出                                                                                   

  35. }

  36. void xs(void)

  37. {



  38.     disp(dispBuf,sizeof(dispBuf));

  39.               oldTime=a*100;

  40.                                           }

  41.             dispBuf[3] = oldTime/1000;

  42.             dispBuf[2] = oldTime%1000/100;

  43.             dispBuf[1] = oldTime%100/10;

  44.             dispBuf[0] = oldTime0%10;

  45.             disp(dispBuf,sizeof(dispBuf));

  46.                       }

  47.     }








  48. 附录四
  49.    时钟子程序:
  50. include

  51. /*****定义DS1302接口*****/

  52. sbit clock_clk = P3 ^ 6;              //ds1302_clk(时钟线)

  53. sbit clock_dat = P3 ^ 5;              //ds1302_dat(数据线)

  54. sbit clock_Rst = P3 ^ 4;              //ds1302_Rst(复位线)



  55. /*****定义累加器A中的各位*****/

  56. sbit a0   = ACC ^ 0;

  57. sbit a1   = ACC ^ 1;

  58. sbit a2   = ACC ^ 2;

  59. sbit a3   = ACC ^ 3;

  60. sbit a4   = ACC ^ 4;

  61. sbit a5   = ACC ^ 5;

  62. sbit a6   = ACC ^ 6;

  63. sbit a7   = ACC ^ 7;



  64. /*****DS1302驱动程序(底层协议)*****/

  65. void clock_out(unsigned char dd)

  66. {

  67.               ACC=dd;

  68.               clock_dat=a0; clock_clk=1; clock_clk=0;

  69.               clock_dat=a1; clock_clk=1; clock_clk=0;

  70.               clock_dat=a2; clock_clk=1; clock_clk=0;

  71.               clock_dat=a3; clock_clk=1; clock_clk=0;

  72.               clock_dat=a4; clock_clk=1; clock_clk=0;

  73.               clock_dat=a5; clock_clk=1; clock_clk=0;

  74.               clock_dat=a6; clock_clk=1; clock_clk=0;

  75.               clock_dat=a7; clock_clk=1; clock_clk=0;

  76. }



  77. /*****DS1302写数据(底层协议)*****/

  78. void write_clock(unsigned char ord, unsigned char dd)

  79. {

  80.               clock_clk=0;

  81.               clock_Rst=0;

  82.               clock_Rst=1;

  83.               clock_out(ord);

  84.               clock_out(dd);

  85.               clock_Rst=0;

  86.               clock_clk=1;

  87. }



  88. /*****DS1302写入字节(底层协议)*****/

  89. unsigned char clock_in(void)

  90. {

  91.               clock_dat=1;

  92.               a0=clock_dat;

  93.               clock_clk=1; clock_clk=0; a1=clock_dat;

  94.               clock_clk=1; clock_clk=0; a2=clock_dat;

  95.               clock_clk=1; clock_clk=0; a3=clock_dat;

  96.               clock_clk=1; clock_clk=0; a4=clock_dat;

  97.               clock_clk=1; clock_clk=0; a5=clock_dat;

  98.               clock_clk=1; clock_clk=0; a6=clock_dat;

  99.               clock_clk=1; clock_clk=0; a7=clock_dat;

  100.               return(ACC);

  101. }



  102. /*****DS1302读数据(底层协议)*****/

  103. unsigned char read_clock(unsigned char ord)

  104. {

  105.               unsigned char dd=0;

  106.               clock_clk=0;

  107.               clock_Rst=0;

  108.               clock_Rst=1;

  109.               clock_out(ord);

  110.               dd=clock_in();

  111.               clock_Rst=0;

  112.               clock_clk=1;

  113.               return(dd);

  114. }

  115. /*****END*****/
复制代码

附录五

     温度传感器子程序:

  1. #define  DQ  P3_7                                            //定义DS18B20总线I/O

  2. /*****延时子程序*****/

  3. void Delay_DS18B20(int num)

  4. {

  5.               while(num--) ;

  6. }



  7. /*****初始化DS18B20*****/

  8. void Init_DS18B20(void)

  9. {

  10.               unsigned char x=0;

  11.               DQ = 1;                                                //DQ复位

  12.               Delay_DS18B20(8);                 //稍做延时

  13.               DQ = 0;                                                //单片机将DQ拉低

  14.               Delay_DS18B20(80);                //精确延时,大于480us

  15.               DQ = 1;                                                //拉高总线

  16.               Delay_DS18B20(14);

  17.               x = DQ;                                                  //稍做延时后,如果x=0则初始化成功,x=1则初始化失败

  18.               Delay_DS18B20(20);

  19. }



  20. /*****读一个字节*****/

  21. unsigned char ReadOneChar(void)

  22. {

  23.               unsigned char i=0;

  24.               unsigned char dat = 0;

  25.               for (i=8;i>0;i--)

  26.               {

  27.                               DQ = 0;                                            // 给脉冲信号

  28.                               dat>>=1;

  29.                               DQ = 1;                                            // 给脉冲信号

  30.                               if(DQ)

  31.                               dat|=0x80;

  32.                               Delay_DS18B20(4);

  33.               }

  34.               return(dat);

  35. }



  36. /*****写一个字节*****/

  37. void WriteOneChar(unsigned char dat)

  38. {

  39.               unsigned char i=0;

  40.               for (i=8; i>0; i--)

  41.               {

  42.                               DQ = 0;

  43.                               DQ = dat&0x01;

  44.                               Delay_DS18B20(5);

  45.                               DQ = 1;

  46.                               dat>>=1;

  47.               }

  48. }

  49. /*****读取温度*****/

  50. unsigned int ReadTemperature(void)

  51. {

  52.               unsigned char a=0;

  53.               unsigned char b=0;

  54.               unsigned int t=0;

  55.               float tt=0;

  56.               Init_DS18B20();

  57.               WriteOneChar(0xCC);               //跳过读序号列号的操作

  58.               WriteOneChar(0x44);               //启动温度转换

  59.               Init_DS18B20();

  60.               WriteOneChar(0xCC);               //跳过读序号列号的操作

  61.               WriteOneChar(0xBE);               //读取温度寄存器

  62.               a=ReadOneChar();                               //读低8位

  63.               b=ReadOneChar();                              //读高8位

  64.               t=b;

  65.               t<<=8;

  66.               t=t|a;

  67.               tt=t*0.0625;

  68.               t= tt*10+0.5;                               //放大10倍输出并四舍五入

  69.               return(t);

  70. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:204543 发表于 2017-5-24 23:16 | 只看该作者
这个有pcb原理图  和porteus 仿真吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表