当前位置:   article > 正文

单片机LCD1602显示电子时钟设计,含汇编程序、仿真、论文

单片机LCD1602显示电子时钟设计,含汇编程序、仿真、论文

目录

1、摘要

2 系统方案

2.1 系统整体方案的论证

3 硬件设计与实现

3.1单片机最小系统  

3.2振荡电路的工作原理

3.2时钟电路的工作原理

 3.3单片机最小系统电路图

3.4 时钟芯片

3.5 液晶显示电路

4 实物调试及测试

4.1 实物图

4.2仿真结果图如下所示 

5、单片机源程序

资料下载地址:单片机LCD1602显示电子时钟设计,含汇编程序、仿真、论文

1、摘要

        本次设计的多功能时钟系统采用STC89C52单片机为核心器件,利用其定时器/计数器定时和记数的原理,结合液晶显示电路、时钟芯片DS1302电路、电源电路以及按键电路来设计计时器。将软硬件有机地结合起来,使得系统能够实现液晶显示,显示有年、月、日、时、分、秒以及星期,还可以设置闹钟和整点报时。其中软件系统采用单片机汇编语言编写程序,包括显示程序、闹钟程序、中断、延时程序,按键消抖程序等,并在keil中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。

系统方案

2.1 系统整体方案的论证

        电路原理设计是基于小系统板包括电源电路、复位电路、按键电路、DS1302时钟电路、液晶显示驱动电路、输出控制电路。电源部分是用电池来提供的3v-5v,晶体振荡器采用的是12MHz的石英晶体振荡器。

        整个系统用单片机为中央控制器,由单片机执行采集时钟芯片的时间信号并通过显示模块来输出信号及相关的控制功能。时钟芯片产生时钟信号,利用单片机的I/O口传给单片机;并通过I/O口实现LCD的显示。系统设有4个独立式按键可以对时间年、月、日和星期进行调整,还可以设置闹钟。

3 硬件设计与实现

3.1单片机最小系统  

        STC89C52是一款非常适合单片机初学者学习的单片机,它完全兼容传统的8051,8031的指令系统,他的运行速度要比8051快最高支持达33MHz的晶体震荡器,在此系统中使用12MHz的晶振。

        AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。使用Atmel公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。STC89C52具有以下标准功能:8k字节Flash,256字节RAM,32 位I/O 口线,看门狗定时器,2 个数据指针,三个16位定时器/计数器。一个6向量2级中断结构,全双工串行口及时钟电路。另外,STC89C52 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。

3.2振荡电路的工作原理

        STC89C52单片机内部有一个高增益反相放大器,用于构成振荡器,但要形成时钟,外部还需附加电路。XTAL1引脚为反相放大器和时钟发生电路的输入端,XTAL2引脚为反相放大器的输出端。振荡电路如图3.1所示:

3.2时钟电路的工作原理

        片内时钟发生器实质是个2分频的触发其输入来自振荡器的fosc,输出为2相时钟信号,即节拍信号P1、P2,器频率为fosc\2。2个节拍为1个状态时钟S。状态时钟再3分频后为ALE信号,其频率为fosc\6,状态时钟6分频后为机器周期信号,器频率为fosc\12。特殊功能寄存器PCON的PD位可以控制振荡器的工作,当PD=0时,振荡器停止工作,单片机进入低功耗工作状态,复位后,PD=0,振荡器正常工作。时钟电路如图3.2所示:

 3.3单片机最小系统电路图

3.4 时钟芯片

   (1)DS1302是一种可编程的实时时钟芯片,具有计算2100年前的时间的能力,包括时钟/日历寄存器和31字节(8位)的数据暂存寄存器,数据通信权通过一条串行输出口。时钟/日历提供包括秒、分、时、日期、月份和年份信息。闰年可自行调整,以串行方式向单片机传送单字节或多字节的秒、分、时、日、月、年等实时时间数据;只通过三根线进行数据的控制和传递:RST、I/O、SCLK;其在电路的功能是还具有在出现主电源断电时备用电源可继续保持时钟的连续运行。时钟引脚图如图3.4所示:

        如果单片机要对DS1302内部寄存器进行读写操作,必须先将与寄存器对应的位操作地址传送给DS1302,然后再进行读写数据的操作。控制寄存器是用来决定能否对DS1302进行读写操作,当控制字的最高位WP=0时,允许进行读写操作;当WP=1时,禁止读写操作。所以单片机对DS1302进行读写操作时,必须先将控制字00H写入到DS1302的控制寄存器中。

3.5 液晶显示电路

        LCD显示器能显示数码管不能显示的其他字符、文字和图形,是十分重要的显示终端,LCD1602是字符点阵液晶显示模块。利用LCD1602,所用的时间年、月、日、星期可同时可见,一目了然,采用双行显示,让电子钟能够更直观的显示。其实图如图3.5、显示电路图如图3.6、引脚功能如表3-2所示:

        

4 实物调试及测试

4.1 实物图

4.2仿真结果图如下所示 

5、单片机源程序

  1. ;初始化
  2. P_Lcd equ P0 ;液晶lcd数据总线
  3. pq equ p1 ;按键接口
  4. pf bit p2.0 ;蜂鸣器接口
  5. led bit p2.1 ;led灯指示接口
  6. lcdrs bit p2.5 ;lcdrs=1选择数据寄存器,lcdrs=0选择指令寄存器
  7. lcdrw bit p2.6 ;lcdrw=1进行读操作,lcdrw=0进行写操作
  8. lcde bit p2.7 ;lcdep由1-->0 时,液晶模块执行命令
  9. sclk bit p3.5 ;时钟芯片时钟线引脚
  10. io bit p3.6 ;时钟芯片数据传输线引脚
  11. rst bit p3.7 ;时钟芯片复位线引脚
  12. IsSheZhi bit 30h ;设置状态标示位
  13. BJ bit 31h ;比较标示位
  14. QH bit 32h ;切换标示位
  15. bs bit 33h ;报时功能标示位
  16. cxbs bit 34h ;执行报时标志位
  17. sec equ 50h
  18. min equ 51h
  19. hour equ 52h
  20. day equ 53h
  21. week equ 54h
  22. month equ 55h
  23. year equ 56h
  24. KeyCode equ 57h ;按键1功能子程序序号存储地址
  25. jiepai equ 58h ;存放报时声音的节拍常数
  26. chuzhi equ 59h ;报时开始秒时间常数
  27. shengshu equ 5ah ;存放报时声数
  28. DspBuf equ 60h ;当前时间拆字后存储首地址
  29. dspba equ 70h ;闹钟时间首地址
  30. org 0h
  31. ljmp main
  32. org 00bh
  33. ljmp sub1
  34. org 01bh
  35. ljmp sub2
  36. org 30h
  37. ;主程序
  38. main:
  39. clr IsSheZhi
  40. clr QH
  41. setb BJ
  42. setb bs
  43. setb cxbs
  44. mov KeyCode,#00h
  45. mov sp ,#30h
  46. mov year,#16h ;为当前时间赋初值
  47. mov month,#06h
  48. mov week,#4h
  49. mov day,#30h
  50. mov hour,#00h
  51. mov min,#00h
  52. mov sec,#00h
  53. mov DspBuf-1,#0h
  54. mov DspBuf-2,#02h
  55. mov jiepai,#80h ;设置节拍常数
  56. mov chuzhi,#00h ;设置1秒时开始报时
  57. mov dspba+0,#00h ;为闹钟时间赋初值
  58. mov dspba+1,#09h
  59. mov dspba+2,#0h
  60. mov dspba+3,#0h
  61. mov TH0,#0ffh
  62. mov TL0,#0ffh
  63. mov TH1,#0ffh
  64. mov TL1,#0ffh
  65. mov IE,#8aH
  66. mov TMOD,#11h
  67. setb pf
  68. acall lcd_init ;调LCM的初始化程序
  69. lcall word ;把自创字符写入CGRAM的子程序
  70. lcall set1302 ;DS1302初始化
  71. mainloop:
  72. jb IsSheZhi, SheZhi ;判断是否处于设置状态,处于设置状态则跳转
  73. lcall get1302 ;调读时间子程序
  74. lcall chaizi
  75. lcall display ;调显示子程序,显示当前时间与温度
  76. SheZhi:
  77. jb BJ,xq ;判断闹钟功能是否开启,未开启则跳转
  78. lcall bijiao ;调比较子程序,比较当前时间与闹钟时间
  79. xq:
  80. lcall anjian ;按键扫描
  81. jb bs,bs_1
  82. lcall zhengshi ;判断当前时间是否是整时,即能否报时
  83. bs_1:
  84. jb cxbs,cx_1
  85. lcall baoshi ;执行报时功能
  86. cx_1:
  87. sjmp mainloop
  88. ;液晶显示初始化设定
  89. lcd_init:
  90. mov a,#01h ;清除LCD的显示内容(清屏)
  91. acall LcdWrCmd
  92. mov a,#10 ;10ms延时
  93. acall delay
  94. mov a,#38h ;显示模式设置(使用8位数据,显示两行,使用5*7的字型)
  95. acall LcdWrCmd
  96. mov a,#10
  97. acall delay
  98. mov a,#0ch ;显示开及光标设置(显示器开,光标关,字符不闪烁)
  99. acall LcdWrCmd
  100. mov a,#10
  101. acall delay
  102. mov a,#06h ;显示光标移动设置(字符不动,光标自动右移)
  103. acall LcdWrCmd
  104. mov a,#10
  105. acall delay
  106. ret
  107. ;LCM命令嵌入
  108. LcdWrCmd:
  109. clr LCDRW
  110. clr LCDRS
  111. mov P_Lcd, A
  112. mov a,#6
  113. acall delay
  114. setb LcdE
  115. clr LcdE
  116. ret
  117. ;LCM数据输入
  118. LcdWrDat:
  119. setb LCDRS
  120. clr LCDRW
  121. mov P_Lcd, A
  122. mov a,#6
  123. acall delay
  124. setb LcdE
  125. clr LcdE
  126. ret
  127. ;延时子程序
  128. delay:
  129. mov r7,a ;设置a为自定义变量,可省去其他延时程序的编写
  130. d2: mov r6,#250 ;设置1ms延时
  131. d1:
  132. nop
  133. nop
  134. djnz r6,d1
  135. djnz r7,d2
  136. ret
  137. ;ds1302初始化程序set1302
  138. set1302:
  139. mov a,#8eh ;写ds1302控制寄存器地址
  140. mov b,#00h ;允许写操作,将WP位设置为低电平
  141. lcall clockwr
  142. mov a,#8ch ;写年初值
  143. mov b,year
  144. lcall clockwr
  145. mov a,#88h ;写月初值
  146. mov b,month
  147. lcall clockwr
  148. mov a,#8ah ;写星期初值
  149. mov b,week
  150. lcall clockwr
  151. mov a,#86h ;写日期初值
  152. mov b,day
  153. lcall clockwr
  154. mov a,#84h ;写时初值
  155. mov b,hour
  156. lcall clockwr
  157. mov a,#82h ;写分初值
  158. mov b,min
  159. lcall clockwr
  160. mov a,#80h ;写秒初值
  161. mov b,sec
  162. lcall clockwr
  163. ret
  164. ;读时间子程序get1302
  165. get1302:mov a,#81h ;读秒
  166. lcall clockrd
  167. mov sec,a
  168. mov a,#83h ;读分
  169. lcall clockrd
  170. mov min,a
  171. mov a,#85h ;读时
  172. lcall clockrd
  173. mov hour,a
  174. mov a,#87h ;读日
  175. lcall clockrd
  176. mov day,a
  177. mov a,#8bh ;读星期
  178. lcall clockrd
  179. mov week,a
  180. mov a,#89h ;读月
  181. lcall clockrd
  182. mov month,a
  183. mov a,#8dh ;读年
  184. lcall clockrd
  185. mov year,a
  186. ret
  187. ;ds1302读子程序
  188. clockrd:clr rst ;rst先设置低电平,再设置高电平,起到去乱码作用
  189. clr sclk ;sclk置为低电平
  190. setb rst ;rst置为高电平,选通DS1302
  191. mov r7,#8 ;串行移位传送次数
  192. rds1:
  193. rrc a
  194. mov io,c ;输出一位寄存器读地址
  195. setb sclk ;发串行脉冲
  196. nop
  197. nop
  198. clr sclk ;sclk置为低电平
  199. djnz r7,rds1
  200. nop ;延时,防后面串行读数据丢失
  201. nop
  202. setb io ;8位地址输出完毕,IO设置为输入端口
  203. mov r7,#8
  204. rds2:
  205. mov c,io ;读入一位数据
  206. rrc a
  207. setb sclk ;发串行脉冲
  208. nop
  209. nop
  210. clr sclk
  211. djnz r7,rds2
  212. clr rst
  213. setb sclk
  214. ret
  215. ;ds1302写数据子程序
  216. clockwr:
  217. push acc ;设置堆栈,入栈
  218. push b
  219. clr rst
  220. clr sclk
  221. setb rst ;选通DS1302
  222. mov r7,#8
  223. wrs1:
  224. rrc a
  225. mov io,c ;输出一位寄存器写地址
  226. clr sclk ;发串行输出脉冲
  227. setb sclk
  228. djnz r7,wrs1
  229. nop
  230. mov a,b ;将待写入数据送A
  231. mov r7,#8
  232. wrs2:
  233. rrc a
  234. mov io,c ;经IO输出一位数据
  235. clr sclk
  236. setb sclk
  237. djnz r7,wrs2
  238. pop b ;出栈
  239. pop acc
  240. ret
  241. ;显示设置—— 分配时间显示空间
  242. chaizi:
  243. mov a,year ;拆年
  244. mov r0,#60h
  245. acall hex2bcd
  246. mov a,month ;拆月
  247. mov r0,#62h
  248. acall hex2bcd
  249. mov a,day ;拆日期
  250. mov r0,#64h
  251. lcall hex2bcd
  252. mov a,week;
  253. mov 66h,a
  254. mov a,hour ;拆时
  255. mov r0,#67h
  256. lcall hex2bcd
  257. mov a,min
  258. mov r0,#69h ;拆分
  259. lcall hex2bcd
  260. mov a,sec
  261. mov r0,#6bh ;拆秒
  262. acall hex2bcd
  263. ret
  264. ;显示设置—— 采用除法指令实现的拆字子程序
  265. hex2bcd:
  266. mov b,a
  267. anl a,#0f0h
  268. swap a
  269. mov @r0,a
  270. mov a,b
  271. anl a,#0fh
  272. inc r0
  273. mov @r0,a
  274. ret
  275. ;显示设置——连续显示相邻的两字节
  276. LcdDspBuf:
  277. mov A, @R0
  278. orl a,#30h
  279. acall LcdWrDat
  280. inc R0
  281. djnz R2, LcdDspBuf
  282. ret
  283. ;显示设置——自创字符写入CGRAM的子程序
  284. word:
  285. mov a,#40h
  286. lcall LcdWrCmd
  287. mov r5,#40
  288. mov dptr,#tab1
  289. mov r4,#0
  290. nextt:
  291. mov a,r4
  292. movc a,@a+dptr
  293. lcall LcdWrDat
  294. inc r4
  295. djnz r5,nextt
  296. ret
  297. tab1:
  298. db 08h,0fh,12h,0fh,0ah,1fh,02h,00h;年
  299. db 0fh,09h,0fh,09h,0fh,09h,13h,00h;月
  300. db 0fh,09h,09h,0fh,09h,09h,0fh,00h;日
  301. db 06h,0fh,1fh,0fh,07h,1bh,19h,00h;显示闹钟功能开启标示符号
  302. db 15h,15h,04h,11h,1bh,1fh,0eh,00h;显示报时功能开启标示符号
  303. ;进入闹钟功能设置显示
  304. display_nz:
  305. mov a,#0c2h
  306. acall LcdWrCmd ;确定闹钟时间的首地址
  307. mov R0, #dspba+0
  308. mov R2, #2
  309. acall LcdDspBuf ;显示时
  310. mov a,#3ah ;显示分隔符号
  311. acall LcdWrDat
  312. mov R0, #dspba+2
  313. mov R2, #2
  314. acall LcdDspBuf ;显示时
  315. jb BJ,XT ;判断闹钟功能是否开启
  316. mov a,#0c0h
  317. acall LcdWrCmd
  318. mov a,#03h ;显示闹钟功能开启标示符号
  319. acall LcdWrDat
  320. XT: ret
  321. ;正常显示设置
  322. display:
  323. mov a,#80h
  324. acall LcdWrCmd ;指明显示的首地址
  325. mov R0, #DspBuf-2
  326. mov R2, #2
  327. acall LcdDspBuf ;显示年份前两位
  328. mov R0, #DspBuf+0
  329. mov R2, #2
  330. acall LcdDspBuf ;显示年后两位
  331. mov a,#00h ;显示汉字年
  332. acall LcdWrDat
  333. mov R0, #DspBuf+2
  334. mov R2, #2
  335. acall LcdDspBuf ;显示月份
  336. mov a,#01h ;显示汉月字年
  337. acall LcdWrDat
  338. mov R0, #DspBuf+4
  339. mov R2, #2
  340. acall LcdDspBuf ;显示日期
  341. mov a,#02h ;显示汉日字年
  342. acall LcdWrDat
  343. mov a,#8ch ;w指明星期的首地址
  344. acall LcdWrCmd
  345. mov a,#57h
  346. acall LcdWrDat ;显示w
  347. mov a,#3ah ;显示分隔符号
  348. acall LcdWrDat
  349. mov a,66h ;显示星期值
  350. orl a,#30h
  351. acall LcdWrDat
  352. jb bs,XtT ;判断报时功能是否开启
  353. mov a,#04h ;显示报时功能开启标示符号
  354. acall LcdWrDat
  355. XtT:
  356. mov a,#0c2h
  357. acall LcdWrCmd ;确定地址
  358. mov R0, #DspBuf+7
  359. mov R2, #2
  360. acall LcdDspBuf ;显示时
  361. mov a,#3ah ;显示分隔符号
  362. acall LcdWrDat
  363. mov R0, #DspBuf+9
  364. mov R2, #2
  365. ……………………
  366. …………限于本文篇幅 余下代码请从51黑下载附件…………

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

闽ICP备14008679号