找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2692|回复: 0
收起左侧

单片机秒表设计,启动仿真开始计时LCD1602显示时分秒

[复制链接]
ID:921535 发表于 2021-5-27 16:43 | 显示全部楼层 |阅读模式
功能介绍:实现手表功能,
LCD显示时分秒,
附件包含完整程序及仿真设计。
仿真图.png

单片机源程序如下:
  1. #include <REG51.h>
  2. #include <intrins.h>
  3. #define N 50000
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define LCD_DB  P1
  7. void display_time();       //声明显示时间函数
  8. void LCD_init();           //申明1602初始化函数
  9. void LCD_write_command(uchar dat);    //申明1602写命令函数
  10. void LCD_write_data(uchar dat);      //申明1602写数据函数
  11. void delay_n40us(uint n);   //申明延迟函数
  12. uchar shi,fen,miao;                         //全局变量时分秒
  13. uchar tt[]="Welcome 51Luntan";
  14. uint num=0;
  15. /*****************************************
  16. 电路连接?
  17. P1------DB0~DB7
  18. P2.0------RS
  19. P2.1------RW
  20. P2.2------E
  21. *****************************************/
  22. sbit LCD_RS=P2^0;
  23. sbit LCD_RW=P2^1;
  24. sbit LCD_E=P2^2;

  25. //********延时函数***************
  26. void delay_n40us(uint n)
  27. { uint i;
  28. uchar j;
  29. for(i=n;i>0;i--)
  30. for(j=0;j<2;j++);
  31. }
  32. void LCD_init(void)
  33. {
  34. LCD_write_command(0x38);//设置8位格式,2行,5x7
  35. LCD_write_command(0x0c);//整体显示,关光标,不闪烁
  36. LCD_write_command(0x06);//设定输入方式,增量不移位--------------
  37. LCD_write_command(0x01);//清除屏幕显示----------------
  38. delay_n40us(100);     //实践证明,我的LCD1602上,用for 循环200 次就能可靠完成清屏指令。
  39. }
  40. //********************************
  41. //********写指令函数***********设置先向1602写入的数据为地址*
  42. void LCD_write_command(uchar dat)
  43. {
  44. LCD_DB=dat;
  45. LCD_RS=0;//指令
  46. LCD_RW=0;//写入
  47. LCD_E=1;//允许
  48. LCD_E=0;//产生下降沿
  49. delay_n40us(1);//实践证明,我的LCD1602 上,用for 循环1 次就能完成普通写指令。
  50. }
  51. //*******************************
  52. //********再写数据函数*****向1602中写入数据********
  53. void LCD_write_data(uchar dat)
  54. {
  55. LCD_DB=dat;
  56. LCD_RS=1;//数据
  57. LCD_RW=0;//写入
  58. LCD_E=1;//允许
  59. LCD_E=0;//产生下降沿
  60. delay_n40us(1);
  61. }


  62. //************显示时间**************
  63. void display_time()
  64. {
  65. LCD_init();
  66. LCD_write_command(0x80);   //从第一行显示T
  67. LCD_write_data('T');
  68. delay_n40us(15000);
  69. LCD_write_data('i');
  70. delay_n40us(15000);
  71. LCD_write_data('m');
  72. delay_n40us(15000);
  73. LCD_write_data('e');
  74. delay_n40us(15000);
  75. LCD_write_data(':');
  76. delay_n40us(15000);
  77. LCD_write_command(0x80+5);          //***显示时
  78. LCD_write_data(0x30+shi/10);  //****取十位显示
  79. delay_n40us(15000);
  80. LCD_write_data(0x30+shi%10);        //***取个位显示
  81. delay_n40us(15000);
  82. LCD_write_data(':');
  83. LCD_write_data(0x30+fen/10);  //显示分
  84. delay_n40us(15000);
  85. LCD_write_data(0x30+fen%10);
  86. delay_n40us(15000);
  87. LCD_write_data(':');
  88. LCD_write_data(0x30+miao/10);  //显示秒
  89. delay_n40us(15000);
  90. LCD_write_data(0x30+miao%10);
  91. delay_n40us(15000);
  92. }


  93. //*****T0中断函数50ms中断一次**************
  94. void t0_time() interrupt 1
  95. {
  96.   ++num;
  97.   TH0=(65536-N)/256;
  98.   TH0=(65536-N)%256;
  99.   if(num==20)        //计时满一秒钟
  100.   {
  101.   num=0;
  102.   ++miao;
  103.   LCD_write_command(0x80+11);
  104.   LCD_write_data(0x30+miao/10);
  105. delay_n40us(15000);
  106. LCD_write_data(0x30+miao%10);
  107. delay_n40us(15000);
  108. if(miao==60)        //计时满一分钟
  109. {
  110. miao=0;
  111. ++fen;
  112. LCD_write_command(0x80+8);
  113.   LCD_write_data(0x30+fen/10);
  114. delay_n40us(15000);
  115. LCD_write_data(0x30+fen%10);
  116. delay_n40us(15000);
  117. LCD_write_data(':');
  118. delay_n40us(15000);
  119. if(fen==60)        //计时满一小时
  120. {
  121. fen=0;
  122. ++shi;
  123. LCD_write_command(0x80+5);
  124.   LCD_write_data(0x30+shi/10);
  125. delay_n40us(15000);
  126. LCD_write_data(0x30+shi%10);
  127. delay_n40us(15000);
  128. LCD_write_data(':');
  129. delay_n40us(15000);
  130. if(shi==24)             //计时满一天
  131. {
  132. shi=0;
  133. }
  134. }
  135. }

  136.   }
  137. }



  138. //**************main函数***********
  139. main()
  140. {
  141. int h;
  142. shi=0;
  143. fen=0;
  144. miao=0;
  145. display_time();         //显示初始时间0
  146. LCD_write_command(0x80+64);//从第二行开始显示
  147. for(h=0;h<16;++h)                   //显示定义好的字符串
  148. {
  149. LCD_write_data(tt[h]);
  150. delay_n40us(15000);
  151. }
  152. TH0=(65536-N)/256;          //载入计数初值高八位
  153. TH0=(65536-N)%256;          //载入计数初值低八位
  154. EA=1;                                   //开中断权限
  155. ET0=1;                                   //开T0中断
  156. TR0=1;                                   //定时开始
  157. TMOD=0x01;                           //选用模式1定时
  158. while(1);                                //等待中断
  159. }
复制代码

所有资料51hei提供下载:
利用定时中断设计手表LCD1602显示时分秒.zip (64.88 KB, 下载次数: 41)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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