找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机语音播报万年历程序SYN6288+DS1302+1602+18B20 Proteus仿真

  [复制链接]
ID:642727 发表于 2021-6-18 10:17 | 显示全部楼层 |阅读模式
时间可以设置更改  ,一键报时万年历设置

采用1602显示   1302时钟芯片 +SYN6288语音播报芯片+DS18B20
仿真实物齐全,可以直接使用。直接焊接实物方可使用。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

仿真

仿真

成品原理图

成品原理图


单片机源程序如下:
  1. #include <REG52.H>
  2. #include "lcd1602.h"
  3. #include <string.h>
  4. #include <intrins.h>
  5. #include "KEY.H"
  6. #include <ds18b20.h>
  7. #include "1302.h"

  8. #include "config.h"
  9. /*********定义变量*********/

  10. uchar buff[16];
  11. uint Y=0,M=0,D=0,H=0,F=0,S=0,W=0;
  12. uchar T18B20=0;

  13. uchar ADDR=0;
  14. bit SetState=0;
  15. sbit led = P2^7;

  16. /*=====1602显示======*/
  17. void LCD_DISPLAY()
  18. {
  19.         T18B20=(retemp());       //18B20温度采集数值
  20.         
  21.         Y = (TIME[6]/16*10)+(TIME[6]&0X0F);
  22.         M = (TIME[4]/16*10)+(TIME[4]&0X0F);
  23.         D = (TIME[3]/16*10)+(TIME[3]&0X0F);
  24.         
  25.         W = ((TIME[5]/16*10)+(TIME[5]&0X0F)%7);
  26.         
  27.         H = (TIME[2]/16*10)+(TIME[2]&0X0F);
  28.         F = (TIME[1]/16*10)+(TIME[1]&0X0F);
  29.         S = (TIME[0]/16*10)+(TIME[0]&0X0F);
  30.         
  31.         
  32.         sprintf(buff,"20%02d-%02d-%02d",(int)Y,(int)M,(int)D);
  33.         print(1,1,buff);
  34.         
  35.         sprintf(buff,"%02d:%02d:%02d",(int)H,(int)F,(int)S);
  36.         print(2,1,buff);
  37.         
  38.         sprintf(buff,"T:%02dC",(int)T18B20);
  39.         print(2,12,buff);
  40.         
  41.         switch(W)
  42.         {
  43.                 case 0:print(1,12,"SUM");break;
  44.                 case 1:print(1,12,"MON");break;
  45.                 case 2:print(1,12,"TUE");break;
  46.                 case 3:print(1,12,"WED");break;
  47.                 case 4:print(1,12,"THU");break;
  48.                 case 5:print(1,12,"RFI");break;
  49.                 case 6:print(1,12,"STA");break;
  50.                
  51.                 default :break;
  52.         }
  53.         
  54. }


  55. void Int0Configuration()
  56. {
  57.         //设置INT0
  58.         IT0=1;//跳变沿出发方式(下降沿)
  59.         EX0=1;//打开INT0的中断允许。
  60. }
  61. /*******************************************************************************
  62. * 函数名         : Int0()
  63. * 函数功能                   : 外部中断0 中断函数
  64. * 输入           : 无
  65. * 输出                  : 无
  66. *******************************************************************************/

  67. void Int0() interrupt 0                 
  68. {
  69.         if(K6_F==1)
  70.         {
  71.                 K6_F=0;
  72.                 SetState=~SetState;
  73.                 Ds1302Init();        
  74.         }
  75. }


  76. /*========时间更改==========*/
  77. void TIMER_CHANGE()
  78. {
  79.         
  80.          if(K4_F==1)                //检测按键K4是否按下
  81.                 {        
  82.                         K4_F = 0;
  83.                         ADDR++;
  84.                         if(ADDR>=7)
  85.                         ADDR=0;                                       
  86.                 }
  87.                 else if(K3_F==1)                //检测按键K3是否按下
  88.                 {        
  89.                         K3_F = 0;
  90.                         ADDR--;
  91.                         if(ADDR<0)
  92.                         ADDR=7;                                       
  93.                 }
  94.                
  95.                 if((K2_F==1)||(K1_F==1))                //检测按键K2或者k1是否按下
  96.                 {
  97.                         if(K2_F==1)
  98.                         {
  99.                                 K2_F=0;
  100.                                 TIME[ADDR]++;
  101.                                 if((TIME[ADDR]&0X0F)>9)
  102.                                 {
  103.                                         TIME[ADDR] = TIME[ADDR]+6;
  104.                                 }
  105.                         }
  106.                         else if(K1_F==1)
  107.                         {
  108.                                 K1_F=0;
  109.                                 TIME[ADDR]--;
  110.                                 if((TIME[ADDR]&0X0F)>9)
  111.                                 {
  112.                                         TIME[ADDR] = TIME[ADDR]-6;
  113.                                 }
  114.                                 
  115.                         }
  116.                 }
  117.                
  118.                 if((ADDR<2)&&(TIME[ADDR]>=0x60))  //分不能超60
  119.                 {
  120.                         TIME[ADDR] = 0;
  121.                 }
  122.                 else if(ADDR==2&&TIME[ADDR]>=0x24)   //小时不能超24
  123.                 {
  124.                         TIME[ADDR] = 0;
  125.                 }
  126.                 else if(ADDR==3&&TIME[ADDR]>=0x32)   //day不能超31
  127.                 {
  128.                         TIME[ADDR] = 1;
  129.                 }
  130.                 else if(ADDR==4&&TIME[ADDR]>=0x13)   //月分<=12
  131.                 {
  132.                         TIME[ADDR] = 1;
  133.                 }
  134.                 else if(ADDR==0&&TIME[ADDR]>=0x07)   //星期<=7
  135.                 {
  136.                         TIME[ADDR] = 1;
  137.                 }
  138.                         
  139.                 Ds1302Write(ADDR,TIME[ADDR]);        
  140.                
  141.                
  142.                 switch(ADDR)
  143.                 {
  144.                         case 0:print(2,10,"S ");break;   //second
  145.                         case 1:print(2,10,"F ");break;   //Minute
  146.                         case 2:print(2,10,"H ");break;   //Hour
  147.                         case 3:print(2,10,"D ");break;   //DAY
  148.                         case 4:print(2,10,"M ");break;   //MONTH
  149.                         case 5:print(2,10,"W ");break;   //WEEK
  150.                         case 6:print(2,10,"Y ");break;   //YEAR
  151.                         default :break;
  152.                 }        
  153. }



  154. /*******主函数*******/
  155. void main() //int a   
  156. {
  157.         uchar kkk = 55;
  158.         Int0Configuration();
  159.         lcd_init();
  160.         lcd_clear();
  161.         EA=1;   //总中断
  162.         
  163.         while(1)
  164.         {
  165. ……………………

  166. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
可调万年历实物.zip (106 KB, 下载次数: 110)

评分

参与人数 3黑币 +122 收起 理由
xiaoyuxinke + 30 很给力!
Nieh + 12 共享资料的黑币奖励!
admin + 80 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:882048 发表于 2022-6-20 13:54 | 显示全部楼层
第52行代码:  case 5:print(1,12,"RFI");break;  其中"RFI"应为,"FRI"之误
回复

使用道具 举报

ID:987228 发表于 2022-6-30 17:00 | 显示全部楼层
楼主这个有闹钟功能吗,添加功能是不是更棒。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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