找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机万年历设计简单1602显示ds1302采集系统 Proteus仿真程序

[复制链接]
跳转到指定楼层
楼主
根据电路图,编写程序使得LCD1602显示器显示DS1302时钟芯片当前年、月、日、十、分和秒信息。

附件包含对应仿真和C程序


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <string.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. sbit IO=P1^1;
  7. sbit SCLK=P1^0;
  8. sbit RST=P1^2;
  9. sbit RS=P2^0;
  10. sbit RW=P2^1;
  11. sbit EN=P2^2;

  12. uchar *WEEK[]=
  13. {
  14.         "SUN","***","MON","TUS","WEN","THU","FRI","SAT"
  15. };
  16. uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00   "};
  17. uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00   "};
  18. uchar DateTime[7];

  19. void DelayMS(uint ms)
  20. {
  21.   uchar i;
  22.   while(ms--)
  23.      { for(i=0;i<120;i++); }
  24. }

  25. void Write_A_Byte_TO_DS1302(uchar x)
  26. {
  27.   uchar i;
  28.   for(i=0;i<8;i++)
  29.     { IO=x&0x01;SCLK=1;SCLK=0;x>>=1; }
  30. }

  31. uchar Get_A_Byte_FROM_DS1302()
  32. {
  33.    uchar i,b=0x00;
  34.    for(i=0;i<8;i++)
  35.    {
  36.          b |= _crol_((uchar)IO,i);
  37.          SCLK=1;SCLK=0;
  38.    }
  39.    return b/16*10+b%16;
  40. }

  41. uchar Read_Data(uchar addr)
  42. {
  43.   uchar dat;
  44.   RST=0;SCLK=0;RST=1;
  45.   Write_A_Byte_TO_DS1302(addr);
  46.   dat=Get_A_Byte_FROM_DS1302();
  47.   SCLK=1;RST=0;
  48.   return dat;
  49. }

  50. void GetTime()
  51. {
  52.    uchar i,addr=0x81;
  53.    for(i=0;i<7;i++)
  54.    { DateTime[i]=Read_Data(addr);addr+=2; }
  55. }

  56. uchar read_lcd_state()
  57. {
  58.   uchar state;
  59.   RS=0;RW=1;EN=1;DelayMS(1);
  60.   state=P0;
  61.   EN=0;DelayMS(1);
  62.   return state;
  63. }

  64. void lcd_busy_wait()
  65. {
  66.   while((read_lcd_state()&0x80)==0x80);
  67.   DelayMS(5);
  68. }

  69. void write_lcd_data(uchar dat)
  70. {
  71.          lcd_busy_wait();
  72.          RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);
  73.          EN=0;
  74. }

  75. void write_lcd_command(uchar dat)
  76. {
  77.          lcd_busy_wait();
  78.          RS=0;RW=0;EN=0;P0=dat;EN=1;DelayMS(1);
  79.          EN=0;
  80. }

  81. void init_lcd()
  82. {
  83.          write_lcd_command(0x38);
  84.          DelayMS(1);
  85.          write_lcd_command(0x01);
  86.          DelayMS(1);
  87.          write_lcd_command(0x06);
  88.          DelayMS(1);
  89.          write_lcd_command(0x0c);
  90.          DelayMS(1);
  91. }

  92. void set_lcd_pos(uchar p)
  93. {
  94.         write_lcd_command(p|0x80);
  95. }

  96. void Display_LCD_String(uchar p,uchar *s)
  97. {
  98.         uchar i;
  99.         set_lcd_pos(p);
  100.         for(i=0;i<16;i++)
  101.         {
  102.           write_lcd_data(s[i]);
  103.           DelayMS(1);
  104.         }
  105. }

  106. void Format_DateTime(uchar d,uchar *a)
  107. {
  108.    a[0]=d/10+'0';
  109.    a[1]=d%10+'0';
  110. }

  111. void main()
  112. {
  113.   init_lcd();
  114.   while(1)
  115.   {
  116.         GetTime();
  117.         Format_DateTime(DateTime[6],LCD_DSY_BUFFER1+5);
  118.           Format_DateTime(DateTime[4],LCD_DSY_BUFFER1+8);
  119.         Format_DateTime(DateTime[3],LCD_DSY_BUFFER1+11);

  120.         strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTime[5]]);

  121.         Format_DateTime(DateTime[2],LCD_DSY_BUFFER2+5);
  122.         Format_DateTime(DateTime[1],LCD_DSY_BUFFER2+8);
  123.         Format_DateTime(DateTime[0],LCD_DSY_BUFFER2+11);

  124.         Display_LCD_String(0x00,LCD_DSY_BUFFER1);
  125.         Display_LCD_String(0x40,LCD_DSY_BUFFER2);
  126.   }
  127. }
复制代码

所有资料51hei提供下载:
万年历设计.zip (150.13 KB, 下载次数: 25)

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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