找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3337|回复: 2
收起左侧

单片机+DS3232可调时钟程序与Proteus仿真 LCD12864显示

  [复制链接]
ID:794979 发表于 2021-4-4 21:40 | 显示全部楼层 |阅读模式
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png 51hei.png

单片机源程序如下:
  1. #include <STC89C5xRC.H>
  2. #include "12864.h"
  3. #include "1302.h"
  4. #include "wenzi.h"
  5. #define uchar unsigned char
  6. #define uint unsigned int

  7. //===============接口定义===============
  8. sbit key1 = P3^2; //确定/设置 按键
  9. sbit key2 = P3^3; //减  键
  10. sbit key3 = P3^4; //加  键
  11. sbit key4 = P3^5; //返回键
  12. sbit LED = P2^0;  //背光
  13. sbit beep = P2^1; //喇叭
  14. sbit GY=P3^7;
  15. //======================================
  16. uchar year,month,date,xq,hour,minute,second,shi,ge,ge1,shi1,ddd;                                                 //时间/闹钟相关
  17. uchar t_ss,t_ss1,t_mm,t_hh,t_dd,t_xq,t_yf,t_yy;                                                    //走时变量
  18. uchar idata t,danian;                         //农历  t:节日显示跳转时间 danian判断12月份大小月

  19. bit idata f0,f1,f2,f3;                                                                                                          //反白相关标志
  20. uchar idata setk,setc;                                                       
  21. uchar e,k,n;
  22. uchar idata kk,kk1,bgk,bsj,bld;
  23. bit idata w;
  24. uchar idata ta,tb;
  25. bit idata dinga;



  26. //==============延时函数===================
  27. void Delay(int num)       
  28. {
  29.         while(num--) ;
  30. }


  31. //============反白标志================
  32. void f_qc(void)
  33. {
  34.         f0=f1=f2=f3=0;
  35. }

  36. void displaytime(void)
  37. {
  38.   year=read_random(DS3231_YEAR);//调用3231时钟数据中的年数据,从地址0x8d中
  39.   WRITE_STRING(3,0,0,year/10,0);       
  40.   WRITE_STRING(3,1,0,year%10,0);       
  41.         WRITE_STRING(3,1,1,8,0);         //年       
  42.        
  43.         month=read_random(DS3231_MONTH);//调用3231时钟数据中的月数据,从地址0x05中
  44.         WRITE_STRING(3,4,0,month/10,0);         
  45.   WRITE_STRING(3,5,0,month%10,0);       
  46.         WRITE_STRING(3,3,1,7,0);         //月       
  47.        
  48.         date=read_random(DS3231_DAY);//从3231芯片中读取日数据,从地址0x04中
  49.         WRITE_STRING(3,8,0,date/10,0);       
  50.   WRITE_STRING(3,9,0,date%10,0);       
  51.         WRITE_STRING(3,5,1,6,0);                  //日
  52.        
  53.   xq=read_random(DS3231_WEEK);//从3231芯片中读取日数据,从地址0x04中
  54.         WRITE_STRING(3,7,1,xq-1,0);       


  55.     //小时
  56.         hour =read_random(DS3231_HOUR);        //从3231芯片中读取小时数据,从地址0x02中
  57.         WRITE_STRING(0,0,2,hour/10,0);         
  58.   WRITE_STRING(0,1,2,hour%10,0);       
  59.         WRITE_STRING(0,2,2,10,0);                  //时
  60.         //分钟
  61.         minute= read_random(DS3231_MINUTE); //从3231芯片中读取分钟数据,从地址0x01中
  62.         WRITE_STRING(0,3,2,minute/10,0);         
  63.   WRITE_STRING(0,4,2,minute%10,0);       
  64.         WRITE_STRING(0,5,2,10,0);                  //分
  65.         //秒钟
  66.         second =read_random(DS3231_SECOND); //从3231芯片中读取秒钟数据,从地址0x01中
  67.         WRITE_STRING(0,6,2,second/10,0);         
  68.   WRITE_STRING(0,7,2,second%10,0);       

  69.        
  70.         //WRITE_STRING(3,7,1,xq,c);

  71. }
  72.        
  73.         void Set_time(uchar sel)
  74. {
  75.           signed char address,item;
  76.           signed char max,mini;

  77.         if(sel==0) {WRITE_STRING(2,7,1,8,0);address=DS3231_YEAR; max=99; mini=0;}  //年?????
  78.         if(sel==1) {WRITE_STRING(2,7,1,7,0);address=DS3231_MONTH; max=12; mini=1;}  //月
  79.         if(sel==2) {WRITE_STRING(2,7,1,6,0);address=DS3231_DAY; max=31; mini=1;}  //日
  80.         if(sel==3) {WRITE_STRING(2,7,1,9,0);address=DS3231_WEEK; max=7;mini=1;}//星
  81.         if(sel==4) {WRITE_STRING(2,7,1,11,0);address=DS3231_HOUR; max=23;mini=0;}//时
  82.         if(sel==5) {WRITE_STRING(2,7,1,12,0);address=DS3231_MINUTE; max=59;mini=0;}//钟
  83.        

  84.   //读取3231某地址上的数值转换成10进制赋给item
  85.           item=(read_random(address));
  86.           if(key3 == 0){item++;}
  87.           if(key4 == 0){item--;}
  88.           if(item>max) item=mini;   
  89.           if(item<mini) item=max;           
  90.           //write_byte(0, 0x98);//允许写操作
  91.         write_byte(address,(item/10)*16+item%10);//转换成10进制写入3231
  92.   //        write_byte(0x8e,0x80);//写保护,禁止写操作
  93.                
  94.                 DelayM(20);  
  95.           displaytime();
  96.        

  97. }






  98.        
  99.         void main()
  100. {
  101.         uchar e=0;

  102.         LCD_ST7565_INIT();                //液晶初始化
  103.         Lcd12864_ClearScreen();   //清屏
  104.         while(1)
  105.         {
  106.                 if(w==0)
  107.                 {
  108.                         displaytime();//显示时间
  109.                 }   //正常走时
  110.                 else {}                    //否则启动调时
  111. //设置键------------------------------------------------------------------------               
  112.                 if (key1 == 0)               // 设置时间
  113.                 {
  114.                         DelayM(20);                   //按键消抖
  115.                         if(key1 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
  116.                         {
  117.                                 e++;
  118.                                 if (e >= 6 ){e = 0;}
  119.                                 Set_time(e);       //调整                               
  120.                         }                       
  121.                         if(key1 == 0 && w == 0)  //当是正常状态时就进入调时状态
  122.                         {
  123.               Lcd12864_ClearScreen();   //清屏
  124.                                 w=1;                   //进入调时                               
  125.                                 Set_time(e);       //调整
  126.                         }
  127.                            while(key1 == 0);        //等待键松开
  128.                 }
  129. //确认,返回键-------------------------------------------------------------------               
  130.                 if (key2 == 0)               //在调时状态时就退出调时
  131.                 {
  132.                         DelayM(20);            //按键消抖
  133.                         if(key2 == 0 && w == 1)
  134.                         {                               
  135.                                 w = 0;                   //退出调时
  136.                                 e = 0;                       //"下一项"计数器清0                                                               
  137.                         }
  138.                         if(key2 == 0 && w == 0)
  139.                         {                               
  140.               Lcd12864_ClearScreen();   //清屏                       
  141.                                 while(key2 == 0);   
  142.                         }
  143.              Lcd12864_ClearScreen();   //清屏
  144.                         displaytime();                   //显示时间

  145.                         while(key2 == 0);  
  146.                 }
  147. //加调整------------------------------------------------------------------------               
  148.                 if (key3 == 0 && w == 1)
  149.                 {                                                          
  150.                         DelayM(20);
  151.                         if(key3 == 0 && w == 1) {        Set_time(e); }
  152.                         while(key3 == 0);
  153.                 }
  154. //减调整------------------------------------------------------------------------               
  155.                 if (key4 == 0 && w == 1)
  156.                 {              
  157.                         DelayM(20);
  158.                         if(key4 == 0 && w == 1) { Set_time(e); }
  159.                         while(key4 == 0);
  160.                 }
  161.         }
  162. /*液晶背光控制,按一下亮,再按一下灭----------------------------------------
  163.                 if(K5 == 0)        
  164.                 {
  165.                         DelayM(20); q = ~q;      //标志位取反
  166.                          if(q){BLK = BLK | 1;}   
  167.                                  else {BLK = BLK & 0;}   
  168.                         while(K5 == 0);           
  169.                 }                                                                                                                                        */
  170. }
复制代码
51hei.png
所有资料51hei提供下载:
st12864电子钟+ds3232 -成功显示可调时钟.7z (125.97 KB, 下载次数: 101)

评分

参与人数 2黑币 +60 收起 理由
jialishoushi + 10 支持下 不错 刚好有个串口屏可以玩玩了
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:794979 发表于 2021-4-5 06:33 | 显示全部楼层
7c4337 可以使用相同程序驱动
回复

使用道具 举报

ID:161785 发表于 2021-4-21 15:53 | 显示全部楼层
非常好。正需要。谢谢无私分享。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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