单片机课程设计(论文)电子时钟

上传人:1666****666 文档编号:39976521 上传时间:2021-11-13 格式:DOC 页数:50 大小:714.51KB
收藏 版权申诉 举报 下载
单片机课程设计(论文)电子时钟_第1页
第1页 / 共50页
单片机课程设计(论文)电子时钟_第2页
第2页 / 共50页
单片机课程设计(论文)电子时钟_第3页
第3页 / 共50页
资源描述:

《单片机课程设计(论文)电子时钟》由会员分享,可在线阅读,更多相关《单片机课程设计(论文)电子时钟(50页珍藏版)》请在装配图网上搜索。

1、1广西民族大学广西民族大学 第二次课程设计第二次课程设计 论文题目:论文题目: 学院(系)学院(系): 物理与电子工程学院物理与电子工程学院 专专 业业 : 通信工程通信工程 年级班级年级班级 : 20072007 级级 学学 号号 : 学生姓名学生姓名 : 指导教师指导教师 : 电子时钟电子时钟2摘要摘要:基于 STC12C5A32S2 单片机设计编程实现走时基本功能,并加于 ad 采样、测温、串口通信、24c02 掉电保护等功能。使用单片机的 ad 口采样光敏电阻和滑动电阻器两端的电压,测温度传感器 18b20 的数据采集。能够在 lcd1602 实现时钟、日期、闹钟、亮度、温度的显示。可

2、以利用按键进行调时、调日期和调节闹钟。关键词:关键词:STC12C5A32S2 lcd1602 ad 采样采样 18b20 24c02 Abstract: STC12C5A32S2 single chip design the basic functions of travel time programming, and increase in ad sampling, temperature measurement, serial communication, 24c02 power-down protection. I use the SCM sample ad photosensitiv

3、e resistor and the voltage across the sliding resistor, temperature sensor 18b20 measured data into the microcontroller. Can be achieved in lcd1602 clock, date, alarm clock, light, temperature display. Can use the button to transfer, the transfer date and the regulation clock.Key words: STC12C5A32S2

4、 lcd1602 ad sample 18b20 24c023目录目录1 1 设计任务与要求设计任务与要求.51.1 设计任务.51.2 功能分析.52硬件设计硬件设计2.1 芯片资料.62.1.1 芯片介绍.62.1.2 芯片管脚图.72.2 原理图.82.3 PCB 图.92.4 按键.102.5 LCD显示模块.102.6 24C02 掉电保护.112.7 外围模块.122.7.1 AD采样.122.7.2 温度传感器 18B20.123 3 软件设计软件设计.133.1 主程序.13 3.1.1 流程图.133.1.2 源程序.143.2 显示模块.14 3.2.1 显示位置分布.14

5、3.2.2 LCD1602 流程图.153.2.3 显示子程序.153.3 按键控制.16 3.3.1 各功能键设定.16 3.3.2 按键扫描程序.163.3.3 源程序.173.4 外围模块软件设计.17 3.4.1 AD采样模块 .183.4.2 温度传感器 18B20.193.5 掉电保护.193.6 串口通信.204 4系统测试系统测试 .22 4.1 系统硬件调试.2244.2 系统软件调试.235 5 参考文献参考文献.246 附录附录.251 设计任务与要求设计任务与要求 1.1、设计任务1、使用 1602 液晶模块作为显示器件;2、平时按 24 小时制显示当前时间,要求使用定

6、时中断完成,每日误差不得大于 1 秒;3、当前时间可调(只调时、分即可) ;4、系统意外断电时,当前时钟的时和分数应能保存,以便使系统下次上电时能从上次断电时间开始走时;(EEPROM 24C02 使用单片机内部资源)5、能设置 3 个定时闹铃点,每个点分别可调,并分别可以设置应否起作用;6、定时闹铃时间到且该闹铃点被设定为“起作用”时,应能发出持续约 1 分钟的闹铃声,而在发出闹铃的过程中,要求可以被按键终止;闹铃过程不得影响正常的走时;7、所有闹铃点数据应能断电保存;8、能分别根据串口收到的“获取当前时间”、 “获取当前电压值”和“获取当前光亮度值”命令,分别通过串口向外发送“当前时间”

7、、 “当前电压值”和“当前光亮度值”,以便使用串行设备观察这些参数;9、显示温度、光亮值10、显示合理、操作简单明了。1.2 功能分析1 电源提供方案为了使模块稳定工作,必须有可靠的电源。这里有两种电源方案方案一:采用独立的稳压电源。此方案的优点是稳定可靠,且有各种成熟电路可供选用,缺点是各模块采用独立的电源,会使系统复杂,且可能影响电路电平。方案二:采用单片机控制模块提供的电源,此方案的有点是系统简明,节约成本,缺点是输出功率不高;方案对比:方案一比较复杂,成本高,而方案二就能满足本次设计,因而采用了第二种方案。2 显示界面方案该系统要求完成即使,状态灯等功能,基于上述原因,考虑了二种方案:

8、方案一:采用数码管显示。该方案只能显示有限的符号和数码字符,无法胜任题目要求方案二:采用点阵式 LCD 显示,这种方案实现比较复杂,需要完成大量的软件工作,但功能强大能方便的显示各种英文字符 ,图形等。5方案对比:方案二较形象,为了能完成题目的要求,采用了方案二实现系统的显示功能。3 输入方案题目要求系统能手动设灯亮的时间,紧急情况处理,我们也考虑了两种方案方案一:直接在 IO 口线上接上按键开关,此种方案设计精简和优化了电路,但是通过按键扫描的方式,判断按键,此种方案如果按键扫描次数少,会导致漏判断按键,使得按键使用不灵敏方案二:所剩余的口资源比较多,我们使用四个按键同过二极管接到 P3.2

9、,外部中断0 的口,五个按键 S0,S1,S2,S3,S4,S5 均采样外部中断接法。当一有按键按下 即能产生外部中断,及时处理按键。方案对比:按键均采用外部中断接法的目的是使按键反应灵敏,能够快速准确的控制。2 硬件设计硬件设计2.1 芯片资料芯片资料 2.1.1 STC12C5A32S2 芯片芯片1:STC12C5A32S2 芯片是宏晶科技生产的单时钟/机器周期(1T)的单片机,是高速/低功耗/超强抗干扰的新一代 8051 单片机,指令代码完全兼容传统的 8051,但速度快 812 倍内部集成 MAX810 专用复位电路,2 路 PWM,8 路告诉 10 位 A/D 转换(250K/s),

10、针对电机控制,强干扰场合。1.增强型 8051 CPU,1T,单时钟/机器周期,指令代码完全兼容 80512.工作电压:5.5V3.3V(5V 单片机)3.工作频率范围:035MHz,相当于普通 8051 的 0420MHz4.用户应用程序空间 8K/16K/20K/32K/40K/48K/52K/60K/62K 字节。 。 。 。 。5.片上集成 1280 字节 RAM6.通用 I/O 口(36/40/44 个)复位后为:准双向口/弱上拉(普通 8051 传统 I/O 口)可设置成四种模式:准双向口/弱上拉,推挽/强上拉,仅为输入/高阻,开漏每个I/O 口驱动能力均可达到 20mA,但整个芯

11、片最大不要超过 55Ma7.ISP(在系统可编程)/IAP(在应用可编程) ,无需专用编程器,无需专用仿真器可通过串口(P3.0/P3.1)直接下载用户程序,数秒即可完成一片8.看门狗9.内部集成 MAX810 专用复位电路(外部晶体 12M 以下时,复位脚可直接接 1K电阻到地)10. 外部掉电检测电路:在 P4.6 口有一个低压门槛比较器 5V 单片机为 1.32V 误差为+/-5%,3.3V 单片机为 1.30V 误差为+/-3%611. 时钟源:外部高精度晶体/时钟,内部 R/C 振荡器(温漂为+/-5%到+/-10%以内)用户在下载用户程序时,可选择是使用 R/C 振荡器还是外部晶体

12、/时钟常温下内部 R/C 振荡器频率为:5.0V 单片机为12. 共有 4 个 16 位定时器 两个与传统 8051 兼容的定时器/计数器,16 位定时器T0/T1,没有定时器 2,但有独立的波特率发生器做串行通讯的波特率发生器 再加上 2 路 PCA 模块可实现 2 个 16 位定时器13. 2 个时钟输出口,可由 T0 的溢出在 P3.4/T0 输出时钟,可有 T1 的溢出在 P3.5/T1输出时钟14. 外部中断 I/O 口 7 路,传统的下降沿中断或低电平触发中断,并新增支持上升沿中断 PCA 模块,POWER Down 模式可由外部中断唤醒 INT0/P3.2 INT1/P3.3 T

13、0/P3.4 T1/P3.5 RXD/P3.0 CCP0/P1.3(也通过寄存器设置到 P4.2),CCP1/P1.4(也可通过寄存器设置到 P4.3)15. PWM(2 路)/PCA(可编程计数器阵列,2 路)也可用来当 2 路 D/A 使用 也可用来再实现 2 个定时器也可用来再实习 2 个外部中断(上升沿中断/下降沿中断均可分别或同时支持16. A/D 转换,10 位精度 ADC,共 8 路,转换速度可达 250K/S(每秒钟 25 万次)17. 通用全双工异步串行口(UART) ,由于 STC12 系列是高速的 8051,可再用定时器或 PCA 软件实现串口18. STC12C5A60

14、S2 系列有双串口,后缀有 S2 标志的才有双串口,RXD2/P1.2(可通过寄存器设置到 P4.2),TXD2/P1.3(可通过寄存器设置到 p4.3)19. 工作温度范围:-40+85(工业级)/075(商业级)20. 封装:DIP-40,LQFP-44,LQFP-48 I/O 口不够时,可用 2 到 3 根普通 I/O 口线外接 74HC164/165/595(均可级联)来扩展 I/O 口 还可用 A/D 做按键扫描来节省 I/O,或者用双 CPU,三线通信,还多了串口。2.1.2 STC12C5A32S2 芯片管脚图芯片管脚图72.2 原理图原理图8P1.0/T21P1.1/T2EX2

15、P1.23P1.34P1.45P1.56P1.67P1.78RST9P3.0/RxD10P3.1/TxD11P3.2/INT012P3.3/INT113P3.4/T014P3.5/T115P3.6/WR16P3.7/RD17XTAL218XTAL119VSS20P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427P2.7/A1528PSEN29ALE30EA/VPP31P0.7/AD732P0.6/AD633P0.5/AD534P0.4/AD435P0.3/AD336P0.2/AD237P0.1/AD138P0

16、.0/AD039VCC40U1P89C52X2FN12Y1XTAL33pFC3Cap33pFC4CapS2S3S4S5S610uFC51KR510KR6VCC12345678JP412345678910111213141516JP1VCC10R2VCCE01E12E23GND4SDA5SCL6WC7VCC8U2M24C02BN610KR1210KR13VCCD1D2D3D4123JP5ds18b2010KR10VCC123456789P1Header 9LS1BellQ2pnp901518R11VCC1KR8VCCVCC1KR7K11234JP3usbDS13LED1S11KR310uFC1V

17、CC1KR11KR9Q1NPN90143kR4VCC12JP2Header 212345678P4Header 812345678P10Header 8VCC12345678P7Header 8123P8IRVCC12P5Header 212P3Header 20.1uFC2VCC123P2Header 312P612P912P1112P13Header 2123P12口口口123456789P20Header 91234P21Header 4DS1 DS2 DS3 DS4 DS5 DS6 DS7 DS8 DS9 DS10DS11DS121KR301KR311KR321KR331KR341KR

18、351KR361KR371KR381KR391KR401KR41123456789101112P22Header 12VCC123P30Header 32.3 PCB 图图92.4 按键按键所有按键都经过二极管接到单片机的 INT0 口,再分别接到各个 I/O 口,当按键一按下的时候便可产生中断,增加按键的灵敏度。各个按键所接的对应 I/O 口:K1-P3.4,K2-P3.5,K3-P3.6,K4_P3.72.5 LCD 液晶显示模块液晶显示模块引脚接口说明表第 1 脚:VSS 为地电源。第 2 脚:VDD 接 5V 正电源。第 3 脚:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接

19、地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个 10K 的电位器调整对比度。第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W共同为低电平时可以写入指令或者显示地址,当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数据。第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。第 714 脚:D0D7 为 8 位双向数据线。10第 15 脚:背光源正极。第 16 脚:背光源负极。液晶显

20、示硬件接线如下图所示2.6 24c02 的用法介绍的用法介绍AT24c02 是 ATMEL 公司生产的 AT24C 序列 E2PROM.它的存储容量为 256*8.采用此芯片可以解决断电保存问题,可对所储数据保存 100 年,并可多次擦写擦写次数可达 10 万次以上。在一些应用系统设计中,有时需要对数据进行掉电保护。若采用普通存储器,在掉电时需要用电池供电,并需要在硬件上增加掉电检测电路,但存在电池不可靠以及扩展存储芯片占用单片机过多口线的缺点。采用具有 I2C 总线接口的串行 E2PROM 器件可很好地解决掉电数据保存问题,且硬件电路简单。2.4.1 AT24c02 引脚配置各引脚的功能如下

21、:1,2,3(A0、 A1、 A2)可编程地址输入端。4(GND)电源第。5(SDA)串行数据输入输出端。6 (SCL) 串行时钟输入端。7(WP)写保护输入端,用于硬件数据保护。当其为低电平时,可以对整个存储器进行正常的读/写操作操作:当其为高电平时,存储器具有写保护功能,但是读操作不受影响。8(VCC)电源争端。1124c02 接线图:2.7 外围模块外围模块2.7.1 Ad 采样模块采样模块 采样到的值转换成电压值:U=ad 采样值*Ucc/10232.7.2 温度传感器温度传感器 18b20DS18B20 的使用方法: 由于 DS18B20 采用的是 1Wire 总线协议方式,即在一根

22、数据线实现数据的双向传输,而对 AT89S51 单片机来说,硬件上并不支持单总线协议,因此,我们必须采用软件的方法来模拟单总线的协议时序来完成对 DS18B20 芯片的访问。 由于 DS18B20 是在一根 I/O 线上读写数据,因此,对读写的数据位有着严格的时序要求。DS18B20 有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在

23、先。 DS18B20 的复位时序 DS18B20 的读时序 对于 DS18B20 的读时序分为读 0 时序和读 1 时序两个过程。 对于 DS18B20 的读时隙是从主机把单总线拉低之后,在 15 秒之内就得释放单总线,以让DS18B20 把数据传输到单总线上。DS18B20 在完成一个读时序过程,至少需要 60us 才能完成。 12 DS18B20 的写时序 对于 DS18B20 的写时序仍然分为写 0 时序和写 1 时序两个过程。 对于 DS18B20 写 0 时序和写 1 时序的要求不同,当要写 0 时序时,单总线要被拉低至少60us,保证 DS18B20 能够在 15us 到 45us

24、 之间能够正确地采样 IO 总线上的“0”电平,当要写 1 时序时,单总线被拉低之后,在 15us 之内就得释放单总线。硬件连接图:3 软件设计软件设计3.1 主程序主程序3.1.1流程图流程图13开始开始 初始化从 24c02 读出数据装载初值等待中断显示程序从 24c02 读出存进去的值按键扫描是否到 10s?是否产生中断?定时器 0 的中断服务程序End3.1.2源程序源程序参见附录时钟.c 文件3.2 显示模块显示模块3.2.1显示位置分布显示位置分布14时钟 时:分:秒 温度值日期:年/月/日闹钟 1 闹钟 2闹钟 3通道 0 采样值 转化值 通道 1 采样值 转化值 3.2.2Lc

25、d1602 流程图流程图定义变量Lcd 送显示数据函数显示位置返回Lcd 初始化子函数显示两位整数显示字符串显示 4 位整数显示浮点数源程序参见附录 lcd-1602.h3.2.3显示子程序显示子程序15 判断闹铃&响铃方式显示闹钟调节的显示程序显示时间和日期子程序源程序:参考附录 show-all.h 头文件3.3 按键控制按键控制3.3.1各按键功能设定各按键功能设定定义:K1=P3.4,K2=P3.5,K3=P3.6,K4=P3.7方案一、K1 功能键 设置闹钟(K1=13) 、提示是否停止定时器 0(K1=4) 、设置时钟(K1=5) 、设置日期(K1=6) ,开始走时并返回(

26、K1=0) K2 设置时钟下,分别选中时、分、秒 设置闹钟下,分别选中闹钟时、分、闹钟开关 K3 加(开) K4 减(关)方案二、K1 功能键 设置闹钟(K1=13) 、提示是否停止定时器 0(K1=4) 、设置时钟(K1=5) 、设置日期(K1=6) ,开始走时并返回(K1=0) K2 实现时加或是年加 K3 实现分加或是月加 K4 实现关掉闹钟或是日加在 k1 没有按下时,按下 k2,做显示界面的变换,按下 k4 可以随时停止在闹铃的闹钟。方案对比:方案 1 可以实现需改变值的加减,比较具有实用性,本来是首选,可是实现起来有两个问题:第一,光标显示困难;第二:程序本身较为复杂。方案二欠缺减

27、的功能,若是再加上一个按键 k5 亦可实现减的功能,且程序较为简单,不容易出错。因而,选用了方案二做此次项目的按键控制。3.3.2按键扫描流程图按键扫描流程图16延时 10,防抖改变标志位寄存器初始化是否有按键?检测是否有按键按下?检测按键是否释放?返回 按键扫描程序按键扫描程序 按键标志位:如果 k1 按下,keybit=1,kongzhi1+ 如果 k2 按下且 keybit=0,xianshi+ 如果 k2 按下且 keybit=1,flag=1 如果 k3 按下且 keybit=1,flag=2 如果 k4 按下且 keybit=1,flag=3 如果 k5 按下,可以做加减法的交替2

28、.2.3源程序源程序参考附录 key_work.h3.4 外围模块软件设计外围模块软件设计3.4.1Ad 采样模块采样模块17返回第 n 通道进行多次 ADC 采样后取平均值延时第 n 通道 ADC 采样函数显示位置和采样值换算24c02 通道初始化源程序参见附录 get_ad.h3.4.2温度传感器温度传感器 18b2018返回读出 1 位字节向 18b20 写指令读取寄存器中存储的温度数据显示指令读出 1 位函数向 18b20 写一个字节18b20 初始化源程序参见附录 1820.h3.5 掉电保护掉电保护24c023.5.1流程图流程图19开始信号返回应答信号写字节读字节写数据读数据停止

29、信号24c02 初始化3.5.2源程序源程序参见附录 1820.h3.6 串口通信串口通信3.6.1流程图流程图20返回启动 T1、TR1、ES串口中断服务程序装载初值 TH1,TL1确定串行口控制方式确定 T1 的工作方式Flag=1?3.6.2源程序源程序/=串口通信=void chuan_kou() ad_0=0; ad_1=0; ad_0=ADC_GET(0); ad_1=ADC_GET(1); if(flag_do=1) flag_do=0; ES=0; /关串口中断 TI=1; switch(flag_on)case 1:puts(黄萍生begainn);break;case 2:

30、printf(time:%d:%d:%dn,shi,fen,sec);break;/时间显示case 3:printf(data:%d/%d/%dn,year,month,day);break; /日期显示case 4:printf(Temp:%c%c%c%c.%c Cn,flagdat,disdata0,disdata1,disdata2,disdata3);break; /温度显示case 5:printf(bright:%f V;huabian:%f Vn,ad_1*4.59/1023,ad_0*4.59/1023);break; /显示光敏和滑变两端电压值21case 6:puts(e

31、rrorn); /显示错误 while(!TI); TI=0; /发送完毕,TI 手动清 0 ES=1; /开中断void ser() interrupt 4 /串口中断 RI=0; /串行中断收到数据后,RI 被置 1,需要清零以便能响应下次串行中断 a=SBUF; /取出数据 flag_do=1; /置标志位=1,告诉主函数有新数据到if(a=1) flag_on=1; else if(a=2) flag_on=2; else if(a=3) flag_on=3; else if(a=4) flag_on=4; else if(a=5) flag_on=5; else if(a=6) fl

32、ag_on=6; 4 系统软硬件的调试系统软硬件的调试4.1 系统硬件调试设计好电路PCB之后,经过打印、热转印、制板、焊接元件后就可以进行硬件的调试了。首先检查电路上有否漏焊、开路和短路的现象;然后给电路板供5V的直流电压,观察电路板上的电源指示灯是否正常之后,把单片机,液晶显示插入插槽中,下载线连接到电路板上,下载测试程序到单片机中,观察芯片工作是否正常,如果芯片正常工作则说明系统板正常,不正常则说明系统硬件有问题。下载线的作用是把编译好的单片机程序下载到目标单片机中以及提供电源。22我们用的下载程序软件,STC_ISP.exe 。如下图所示下载程序之前先选择第一步在 MUC Typ 空中

33、选择 STC12C5A32S2 芯片,第二步 在 打开文件前清 0 缓冲 打勾, 第三步 选择 COM 口 设置最高波特率为115200 第四步 选择软件的默认设置即可 第五步 先在每次下载前重新调入已打开缓冲区文件 前的小框框打勾。完成这些设置之后就可以把程序下载到我们的系统板中。4.2 系统软件调试本系统使用的软件开发环境是 keil。Keil C51 是美国 Keil Software 公司出品的51 系列兼容单片机 C 语言软件开发系统,与汇编相比, C 语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功

34、能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境( uVision)将这些部份组合在一起。在 keil 中,源代码的输入,编译通过之后就可以进行软件调试了。程序经过编译之后,编译产生的 hex 文件,下载到实物板中,通过观察 LCD 查看显示时间是否正确,检查灯亮的时间,灯的跳转顺序是否符合我们预想,按键是否起到相应的作用。 经调试,程序基本上能达到以上设计任务的要求,可以实现时间显示,温度显示,ad采样电压显示,闹钟功能,串行通信功能,并扩展了日期功能。时间,闹钟,日期可以通过按键实现修改,闹钟状态可以有按键控制,ad 采样得到的电压值与实际的值存在一定的23误差,温度传感器工作

35、正常,在串口助手可以实现发送和接受功能,日期可以区分大小月和闰平年。5 参考文献参考文献新概念 51 单片机 C 语言教程.入门、提高、开发-郭天祥著单片机原理及接口技术-李全利 迟荣强著单片机接口 c 语言开发技术-龚运新等著246 附录附录主程序:时钟主程序:时钟 4.c#include#include#include #includedefine.h#includelcd_1602.h#include24c02.h#include1820.h#includeget_ad.h#includeshow_all.h#includekey_work.hvoid main(void)lcd_int

36、(); /液晶初始化ADC_int(0); /ADC 通道 0 初始化ADC_int(1); /ADC 通道 1 初始化init_24c02(); /24c02 初始化 /24C02 初始化shi=read_add_24c02(2); fen=read_add_24c02(3); /读出 24c02 的单元地址 2-12 中保存的数据并赋给变量时间、闹钟nshi1=read_add_24c02(4);nfen1=read_add_24c02(5);alarm1=read_add_24c02(6);nshi2=read_add_24c02(7);nfen2=read_add_24c02(8);a

37、larm2=read_add_24c02(9);nshi3=read_add_24c02(10);nfen3=read_add_24c02(11);alarm3=read_add_24c02(12);if(shi=24|fen=60|nshi1=24|nfen1=60|nshi1=24|nfen1=60|nshi1=24|nfen1=60) /防止第一次读时还没写过数据进入 24C02 而乱码shi=0;fen=0;nshi1=0;nfen1=0;alarm1=0; nshi2=0;nfen2=0;alarm2=0;nshi3=0;nfen3=0;alarm3=0; 25TCON=0X02;

38、TMOD=0X21;TH0=(65536-50000)/256; /装载初始值,12MHZ 晶振 50ms 数为 50000TL0=(65536-50000)%256;TH1=0 xfd; /装载初始值,波特率是 9600TL1=0 xfd;IE=0X81;/打开总中断獠恐卸?ET0=1;TR0=1;TR1=1;SM0=0;/SCON 寄存器设置串行口工作方式 1:一帧 10 位、1 起始位 8 数据位 1 停止位SM1=1;ES=1;/打开串口中断REN=1;/允许串行接收位,若置 1,则只有接收到有效停止位时,RI 才置 1while(1) key_work1();alarm_out();

39、chuan_kou();wendu=read_temp();if(xianshi=0&keybit=0) /显示时间和亮度 showtime(); ds1820disp(wendu); if(xianshi=1&keybit=0)/显示闹钟 show_alarm();if(xianshi=2&keybit=0)/显示 ad 采样 ad_out();if(sec%10=0) /存储数据开始write_add_24c02(2,shi);delay_ms(20);write_add_24c02(3,fen);delay_ms(20);/存时间write_add_24c02(4

40、,nshi1);delay_ms(20);write_add_24c02(5,nfen1);delay_ms(20);write_add_24c02(6,alarm1); delay_ms(20);/存闹钟 1write_add_24c02(7,nshi2);delay_ms(20);write_add_24c02(8,nfen2);delay_ms(20);26write_add_24c02(9,alarm2); delay_ms(20);/存闹钟 2write_add_24c02(10,nshi3); delay_ms(20);write_add_24c02(11,nfen3); dela

41、y_ms(20);write_add_24c02(12,alarm3);delay_ms(20);/存闹钟 3void timer0() interrupt 1 /使用了中断 1 TH0=(65536-50000)/256; /装载初始值,11.0592MHZ 晶振一个机器周期为 1.085us TL0=(65536-50000)%256; / year3=year/4; year4=year/100; if(year3=0&year4=!0) flag_y=1; else flag_y=0; if(stopbit=0) num+; if(num=18) num=0; sec+; if

42、(sec=60) sec=0; fen+;alarm01=alarm02=alarm03=1;if(fen=60) fen=0; shi+; if(shi=24) shi=0; day+; if(month=1|month=3|month=5|month=7|month=8|month=10|month=12)&day=32) day=1;27 month+; else if(month=4|month=6|month=9|month=11)&day=31) day=1; month+; else if(month=2&flag_y=1&day=30) day=

43、1; month+; else if(month=2&flag_y=0&day=29) day=1; month+; if(month=12) month=1; year+; /=串口通信=void chuan_kou() ad_0=0; ad_1=0; ad_0=ADC_GET(0); ad_1=ADC_GET(1); if(flag_do=1) flag_do=0; ES=0; /关串口中断28 TI=1; switch(flag_on)case 1:puts(huangpingsheng begainn);break;case 2:printf(time:%d:%d:%d

44、n,shi,fen,sec);break;/时间显示case 3:printf(data:%d/%d/%dn,year,month,day);break; /日期显示case 4:printf(Temp:%c%c%c%c.%c Cn,flagdat,disdata0,disdata1,disdata2,disdata3);break; /温度显示case 5:printf(bright:%f V;huabian:%f Vn,ad_1*4.59/1023,ad_0*4.59/1023);break; /显示光敏和滑变两端电压值case 6:puts(errorn); /显示错误 while(!T

45、I); TI=0; /发送完毕,TI 手动清 0 ES=1; /开中断void ser() interrupt 4 /串口中断 RI=0; /串行中断收到数据后,RI 被置 1,需要清零以便能响应下次串行中断 a=SBUF; /取出数据 flag_do=1; /置标志位=1,告诉主函数有新数据到if(a=1) flag_on=1; else if(a=2) flag_on=2; else if(a=3) flag_on=3; else if(a=4) flag_on=4; else if(a=5) flag_on=5; else if(a=6) flag_on=6; 定义头文件:定义头文件:d

46、efine.h#ifndef _define_H_#define _define_H_/=lcd1602 相关定义=#define uint unsigned int#define uchar unsigned char#define lcd_data_port P029sbit lcd_rs=P24; /定义与 1602LCD 的 RS(第 5 脚)连接的口线sbit lcd_en=P25; /定义与 1602LCD 的 EN(第 4 脚)连接的口线,第 5 脚R/W 端直接接地/sbit lcd_rw=P24;/=18b20 相关定义=sbit DQ=P21; /温度传感器信号线uint

47、t,t1,t2;uint tvalue;/温度值uchar tflag;/温度正负标志uchar flagdat;int wendu;uchar xdata disdata5;/=24c02 相关定义=sbit sda_24c02= P27; /上拉有红色发光二极管,低电平亮sbit scl_24c02=P26; /上拉有黄色发光二极管,低电平亮/-与 STC12C5A32S2 单片机 ADC 相关的寄存器声明-sfr P1ASF =0 x9d; /P1 口模数转换功能控制寄存器sfr ADC_CONTR =0 xbc; /AD 转换控制寄存器sfr ADC_RES =0 xbd; /AD 转

48、换结果寄存器高sfr ADC_RESL =0 xbe; /AD 转换结果寄存器低sfr AURX1 =0 xa2; /AD 转换结果存储方式控制位/P1ASF 寄存器:8 位,对应 P1 口 8 根口线,用于指定哪根口线用作 ADC 功能#define ADC_POWER 0 x80 /ADC 电源开#define ADC_SPEED 0 x60 /设为 90 个时钟周期 ADC 一次#define ADC_START 0 x08 /ADC 启动控制位设为开#define ADC_FLAG 0 x10 /ADC 结束标志位unsigned long ad_0=0,ad_1=0,ad_n=0;

49、/=时钟闹钟的相关定义=sbit beep=P23; /定义蜂鸣器端char num=0,sec=0,fen=0,shi=0,day=29,month=5,year1,year2,nshi1=0,nfen1=0,nshi2=0,nfen2=0,nshi3=0,nfen3=0,year3,year4;30bit stopbit=0;int year=2010;bit flag_y;bit alarm1=0,alarm2=0,alarm3=0; /闹钟控制位bit alarm01=1,alarm02=1,alarm03=1;/闹钟即时停止控制位,不影响闹钟 on的状态uchar code alar

50、m_1=(Y);uchar code alarm_2=(N);uchar code lcd1=return now? ;uchar code lcd2=press k4-y/n! ;void alarm_open();/响铃方式-void showtime();/显示时间和日期子程序void lcd_alarm(bit alarm_b);/显示闹钟子程序void alarm_out();/判断闹铃void lcd_alarm(bit alarm_b);/=按键扫描相关定义=sbit k2=P34;sbit k3=P35;sbit k4=P36;sbit k5=P37;uchar xianshi

51、=0;kongzhi1=0,flag=0,keybit=0;bit kongzhi2=0;void adjust_alarm(char x,char y,bit alarm_a);/=串口相关定义=char xdata a,flag_do,flag_on;void chuan_kou();#endifLcd_1602.h#ifndef _lcd_1602_H_#define _lcd_1602_H_void delay_ms(uint xms) /ms 级延时子程序 uint x,y; for(x=xms;x0;x-) for(y=110;y0;y-);31/-void lcd_write_c

52、om(uchar lcd_com) /LCD 送命令子函数 lcd_rs=0; lcd_data_port=lcd_com; delay_ms(5); lcd_en=1; delay_ms(5); lcd_en=0;/-void lcd_write_data(uchar lcd_data) /LCD 送显示数据子函数 lcd_rs=1; lcd_data_port=lcd_data; delay_ms(5); lcd_en=1; delay_ms(5); lcd_en=0;/-void lcd_int() /LCD 初始化子函数 lcd_rw=0;lcd_en=0;lcd_write_com(

53、0 x38); /设置 LCD 工作于 16x2、5x7 点阵、8 位数据接口模式lcd_write_com(0 x0c); /开显示,不显示光标lcd_write_com(0 x06); /写一个字符后地址指针自动加 1lcd_write_com(0 x01); /清屏/-void lcd_locate(uchar x,uchar y) uchar aa; if (x=1) aa=0 x80; if (x=2) aa=0 x80+0 x40; lcd_write_com(aa+y-1); void write_sfm(uchar date)/写时分秒函数uchar shi,ge;32shi=

54、date/10; /分解一个 2 位数的十位和个位ge=date%10;lcd_write_data(0 x30+shi);/送去液晶显示十位lcd_write_data(0 x30+ge); /送去液晶显示个位void LCD_disp(uchar *dat) /显示字符串 while(*dat!=0) lcd_write_data(*dat); dat+; /-一个 2 位的整数处理-void lcd_2_char(unsigned int data_2_char) /在 1602LCD 上显示一个 2位的整数 unsigned char lcd_table2; lcd_table1=da

55、ta_2_char/10; /获得十位的数字 lcd_table2=data_2_char%10; /获得个位的数字 lcd_write_data(lcd_table1+0 x30); /显示十位 lcd_write_data(lcd_table2+0 x30); /显示个位/-一个 4 位的整数处理-void lcd_4_char(unsigned int data_4_char) /在 1602LCD 上显示一个 4 位的整数 unsigned char lcd_table4; lcd_table1=data_4_char/1000; /获得千位的数字 lcd_table2=data_4_

56、char%1000/100; /获得百位的数字 lcd_table3=data_4_char%100/10; /获得十位的数字 lcd_table4=data_4_char%10; /获得个位的数字 lcd_write_data(lcd_table1+0 x30); /显示千位 lcd_write_data(lcd_table2+0 x30); /显示百位 lcd_write_data(lcd_table3+0 x30); /显示十位 lcd_write_data(lcd_table4+0 x30); /显示个位/-小于 100、保留 3 位小数的浮点数处理-void lcd_float(fl

57、oat f_data) /在 1602LCD 上显示一个小于 100、保留 3 位小数的浮点数 unsigned char lcd_table4;33 unsigned long aa; aa=f_data*1000; /保留 3 位小数 lcd_table0= aa/10000 ; /分别获取各位上的数 lcd_table1= aa%10000/1000 ; lcd_table2= aa%1000/100 ; lcd_table3= aa%100/10 ; lcd_table4= aa%10 ; if (lcd_table0=0) lcd_write_data( ); /如果整数部分的十位数

58、是 0 则不显示(显示空格) else lcd_write_data(lcd_table0+0 x30); /显示整数部分的十位数,加上 0 x30 以便直接得到相应的 ASCII 码去显示 lcd_write_data(lcd_table1+0 x30); /显示整数部分的个位数 lcd_write_data(.); /显示小数点. lcd_write_data(lcd_table2+0 x30); /显示小数部分的十分位 lcd_write_data(lcd_table3+0 x30); /显示小数部分的百分位 lcd_write_data(lcd_table4+0 x30); /显示小数

59、部分的千分位 #endif24c02.h#ifndef _24c02_H_#define _24c02_H_void delay();/-与 24C02 相关的设置和子函数-void start_24c02() /24c02 开始信号 sda_24c02=1; delay(); scl_24c02=1; delay(); sda_24c02=0; delay();34void stop_24c02() /24c02 停止 sda_24c02=0; delay(); scl_24c02=1; delay(); sda_24c02=1; delay();void respons_24c02() /

60、24c02 应答 uchar i; scl_24c02=1; delay(); while(sda_24c02=1)&(i250)i+; scl_24c02=0; delay(); void init_24c02() /24c02 初始化 sda_24c02=1; delay(); scl_24c02=1; delay();void write_byte_24c02(uchar date) /写 8 个 uchar i,temp; temp=date; for(i=0;i8;i+) temp=temp1; scl_24c02=0; delay(); sda_24c02=CY; dela

61、y(); scl_24c02=1; delay(); scl_24c02=0; delay();35 sda_24c02=1; delay(); uchar read_byte_24c02() uchar i,k; scl_24c02=0; delay(); sda_24c02=1; delay(); for(i=0;i8;i+) scl_24c02=1; delay(); k=(k1)|sda_24c02; scl_24c02=0; delay(); return k; void write_add_24c02(uchar address,uchar date)/将某数据写入 24C02 某

62、个单元中 start_24c02(); write_byte_24c02(0 xa0); /24c02 的写地址(1010 0000) respons_24c02(); write_byte_24c02(address); respons_24c02(); write_byte_24c02(date); respons_24c02(); stop_24c02(); uchar read_add_24c02(uchar address)/读出 24c02 某个单元数据到变量中 uchar date; start_24c02(); write_byte_24c02(0 xa0); /24c02 的

63、读地址(1010 0001) respons_24c02(); write_byte_24c02(address); respons_24c02(); start_24c02(); write_byte_24c02(0 xa1); respons_24c02();36 date=read_byte_24c02(); stop_24c02(); return date;/-与 24C02 相关的设置和子函数 结束-#endif1820.h/*ds18b20 程序*/#ifndef _1820_H_#define _1820_H_bit ds1820rst(void)/*ds1820 复位*/ b

64、it flg;DQ = 1; /DQ 复位for(t=0;t16;t+); /延时DQ = 0; /DQ 拉低for(t=0;t800;t+); /精确延时大于 480usDQ = 1; /拉高for(t=0;t80;t+);flg=DQ;for(t=0;t0;i-) DQ = 1; /先将数据拉高_nop_();/等待一个机器周期_nop_();37_nop_();DQ=0;/启动读时序_nop_();_nop_();_nop_();DQ = 1; /人为拉高for(t=0;t=1;if(DQ=1)dat|=0 x80;else dat|=0 x00; for(t=0;t0; i-) DQ

65、= 1;_nop_();_nop_();_nop_();DQ=0; DQ = wdata&0 x01; for(t=0;t80;t+); DQ = 1; for(t=0;t=1; for(t=0;t30;t+);int read_temp()/*读取温度值并转换*/uchar a,b;ds1820rst(); ds1820wr(0 xcc);/*跳过读序列号*/ds1820wr(0 x44);/*启动温度转换*/delay_ms(200);ds1820rst(); ds1820wr(0 xcc);/*跳过读序列号*/38ds1820wr(0 xbe);/*读取温度*/a=ds1820r

66、d();b=ds1820rd();tvalue=b; tvalue=8; tvalue=tvalue|a; if(tvalue0 x0fff) tflag=0; else tvalue=tvalue+1; tflag=1; tvalue=tvalue*(0.625);/温度值扩大 10 倍,精确到 1 位小数 return(tvalue);/*/void ds1820disp(uint x)/温度值显示 disdata0=x/1000+0 x30;/百位数 disdata1=x%1000/100+0 x30;/十位数 disdata2=x%100/10+0 x30;/个位数 disdata3=x%10+0 x30;/小数位 if(tflag=0) flagdat=0 x20;/正温度不显示符号 else flagdat=0 x2d;/负温度显示负号:- if(disdata0=0 x30) disdata0=0 x20;/如果百位为 0,不显示 if(disdata1=0 x30) disdata1=0 x20;/如果十位为 0,也不显示 lcd_locate(1,9); lcd_write_data(flagdat);/显示符号位 lcd_write_data(disdata0);/显

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!