找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC15F2K60S2单片机万年历代码 DS1302、内部eeprom、DHT11、1.3寸OLED

[复制链接]
ID:1002550 发表于 2022-4-5 19:19 | 显示全部楼层 |阅读模式
1.png

目前只实现了1、2、3、4和1、2、4
DS1302、内部eeprom、DHT11、1.3寸OLED

单片机源程序如下:
  1. #include <STC15F2K60S2.H>
  2. #include "oled.h"
  3. #include "Delay.h"
  4. #include <DHT.h>
  5. #include "MatrixKey.h"
  6. #include "Buzzer.h"
  7. #include "UART.h"
  8. #include "DS1302.H"
  9. #include "Timer0.h"
  10. #include "esp8266.h"
  11. #include "eeprom.h"

  12. sbit LED = P3^4;
  13. #define IAP_ADDRESS 0X000

  14. unsigned char tempH,MiniSec,tempL,humiH,humiL,KeyNum,MODE=0,Run=0,i,j,temp,TimeSetselect;
  15. unsigned char Sec=0,Min=0,Hour=0;
  16. unsigned char ReadTime[14];
  17. unsigned char receive[4];
  18. unsigned char code table[]="AT+CIPMUX=1\r\n";
  19. unsigned char code table1[]="AT+CIPSERVER=1,8080\r\n";
  20. char xdata clock1_hour=0,clock1_min=0;
  21. //unsigned char xdata clock1[7]="00:00";
  22. static unsigned int T0Count3;

  23. void TimeShow(void);
  24. void Stopwatch();
  25. void TimeSet(void);
  26. void Clock(void);
  27. void ESP8266(void);
  28. void Buzzer(void);
  29. void esp_init();
  30. void int_init();
  31. void eeprom(void);
  32. void EEPROM_Init(void);
  33. void Judge_Clock(void);

  34. void main(void)
  35. {
  36.         DHT11_Rst();
  37.         OLED_Init(); //初始化OLED  
  38.         OLED_Clear();
  39.          Buzzer();
  40.         UART_Init();
  41.         DS1302_Init();
  42.         Timer0Init();
  43.          EEPROM_Init();
  44. //                DS1302_SetTime();
  45. //                 DS1302_WriteByte(0x80,0x07);//关闭1302写保护
  46. //        EEPROM_Erase(0);
  47.                 while(1)
  48.                 {
  49. //                LED=~LED;
  50. //                        OLED_ShowString(0,0,"hello");
  51.                 KeyNum=MatrixKey();
  52.         
  53.                 P42=0;
  54.                 if(KeyNum==13)
  55.                 {
  56.                                         P42=1;
  57.                                         Delay(100);
  58.                                         P42=0;
  59.                                 if(MODE==0){MODE=1;TimeSetselect=0;}
  60.                                 else if(MODE==1){MODE=0;OLED_Clear();DS1302_SetTime();}
  61.                 }
  62.                         if(KeyNum==14)
  63.                 {
  64.                                         P42=1;
  65.                                         Delay(100);
  66.                                         P42=0;
  67.                                 if(MODE==0){MODE=2;        OLED_Clear();}
  68.                                 else if(MODE==2){MODE=0;        OLED_Clear();         }
  69.                 }
  70.                                         if(KeyNum==15)
  71.                 {
  72.                                         P42=1;
  73.                                         Delay(100);
  74.                                         P42=0;
  75.                                 if(MODE==0){MODE=3;        OLED_Clear();}
  76.                                 else if(MODE==3){MODE=0;        OLED_Clear();        Judge_Clock(); }
  77.                 }
  78.                 if(KeyNum==9)
  79.                 {
  80.                                 P42=1;
  81.                                         Delay(100);
  82.                                         P42=0;
  83.                         Run=~Run;        
  84. //                                                Run=1;        
  85.                 }
  86.                         if(KeyNum==10)
  87.                         {
  88.                                         P42=1;
  89.                                         Delay(100);
  90.                                         P42=0;
  91.                                 Sec=0;
  92.                                 Min=0;
  93.                                 MiniSec=0;
  94.                         }
  95.                                         if(KeyNum==7)
  96.                 {
  97.                                         P42=1;
  98.                                         Delay(100);
  99.                                         P42=0;
  100.                                 if(MODE==0){MODE=4;        OLED_Clear();}
  101.                                 else if(MODE==4){MODE=0;        OLED_Clear();         }
  102.                 }
  103.                                                 if(KeyNum==8)
  104.                 {
  105.                                         P42=1;
  106.                                         Delay(100);
  107.                                         P42=0;
  108.                                 if(MODE==0){MODE=5;        OLED_Clear();}
  109.                                 else if(MODE==5){MODE=0;        OLED_Clear();         }
  110.                 }
  111.                 switch(MODE)
  112.                 {
  113.                         case 0:TimeShow();break;
  114.                         case 1:TimeSet();break;
  115.                         case 2:Stopwatch();break;
  116.                         case 3:Clock();break;
  117.                         case 4:ESP8266();break;
  118.                         case 5:eeprom();break;
  119.                 }

  120.                 }
  121.         }
  122. void ESP8266(void)
  123. {
  124. //        int_init();                                                                //中断初始化,定时器初始化
  125. //        esp_init();                                                //模块初始化,发送那两条指令
  126. //                if(receive[1]=='1'){                                //收到1点亮LED
  127. //                                P34 =0 ;
  128. //                }
  129. //                else P34 =1;        

  130.         DS1302_ReadTime2();
  131.         ReadTime[0]=(DS1302_Time[0]>>4);   //分离出年十位
  132.   ReadTime[1]=(DS1302_Time[0]&0x0F); //分离出年个位
  133.   
  134.         ReadTime[2]=(DS1302_Time[1]>>4);   //分离出月十位
  135.   ReadTime[3]=(DS1302_Time[1]&0x0F); //分离出月个位

  136.   ReadTime[4]=(DS1302_Time[2]>>4);   //分离出日十位
  137.   ReadTime[5]=(DS1302_Time[2]&0x0F); //分离出日个位

  138.   ReadTime[6]=(DS1302_Time[3]>>4);   //分离出小时十位
  139.   ReadTime[7]=(DS1302_Time[3]&0x0F); //分离出小时个位

  140.   ReadTime[8]=(DS1302_Time[4]>>4);   //分离出分钟十位
  141.   ReadTime[9]=(DS1302_Time[4]&0x0F); //分离出分钟个位
  142.   ReadTime[10]=(DS1302_Time[5]>>4);   //分离出秒钟十位
  143.   ReadTime[11]=(DS1302_Time[5]&0x0F); //分离出秒钟个位
  144.   Delay(10);
  145.         EA=0;
  146.         UART_SendByte(ReadTime[0]+48);//年
  147.         UART_SendByte(ReadTime[1]+48);
  148.         
  149.         UART_SendByte('-');

  150.         UART_SendByte(ReadTime[2]+48);//月
  151.         UART_SendByte(ReadTime[3]+48);   

  152.         UART_SendByte('-');

  153.   UART_SendByte(ReadTime[4]+48);//日
  154.         UART_SendByte(ReadTime[5]+48);

  155.         UART_SendByte(' ');

  156.   UART_SendByte(ReadTime[6]+48);//时
  157.         UART_SendByte(ReadTime[7]+48);

  158.         UART_SendByte(':');

  159.         UART_SendByte(ReadTime[8]+48);//分
  160.         UART_SendByte(ReadTime[9]+48);

  161.         UART_SendByte(':');

  162.         UART_SendByte(ReadTime[10]+48);//秒
  163.         UART_SendByte(ReadTime[11]+48);

  164.         UART_SendByte('\n');
  165.         SBUF='\n';
  166.           while(!TI);      //等待发送完毕
  167.     TI=0;           //清中断
  168.                 EA=1;

  169.                 Delay(1000);
  170.                
  171. }
  172. void eeprom(void)
  173. {
  174.         unsigned char i;
  175. //        EEPROM_Erase(0x000);

  176.         for(i=0;i<1;i++)
  177.         {
  178.                 UART_SendByte(EERPOM_ReadByte(0x000));
  179.         }
  180.         

  181. }
  182. void Clock(void)
  183. {
  184. //                        OLED_Clear();
  185. //                        clock1_hour=EERPOM_ReadByte(0x000);
  186.                         OLED_ShowString(0,0,"    Clock");
  187.                         OLED_ShowString(47,2,":");
  188.                         OLED_ShowNum(30,2,clock1_hour,2,16);
  189.                         OLED_ShowNum(54,2,clock1_min,2,16);
  190.                         
  191.                         if(KeyNum==1)        {clock1_hour++;if(clock1_hour>=24) clock1_hour=0;}
  192.                         if(KeyNum==2)        {clock1_hour--;if(clock1_hour<0) clock1_hour=23;}
  193.                         if(KeyNum==3) {clock1_min++;if(clock1_min>=60) clock1_min=0;}
  194.                         if(KeyNum==4)        {clock1_min--;if(clock1_min<0) clock1_min=59;}
  195. //                        EEPROM_WriteByte(0x000,clock1_hour);
  196.                         
  197. }
  198. void TimeShow(void)
  199. {
  200. //        Delay(1200);
  201.         DS1302_ReadTime();
  202.         OLED_ShowNum(0,0,DS1302_Time[0],2,16);
  203.         OLED_ShowString(17,0,"-");
  204.         OLED_ShowNum(24,0,DS1302_Time[1],2,16);
  205.         OLED_ShowString(41,0,"-");
  206.         OLED_ShowNum(48,0,DS1302_Time[2],2,16);
  207.         OLED_ShowNum(30,2,DS1302_Time[3],2,16);
  208.         OLED_ShowString(47,2,":");
  209.         OLED_ShowNum(54,2,DS1302_Time[4],2,16);
  210.         OLED_ShowString(71,2,":");
  211.         OLED_ShowNum(78,2,DS1302_Time[5],2,16);
  212.         OLED_ShowString(87,0,"DAY:");
  213.         OLED_ShowNum(120,0,DS1302_Time[6],1,16);
  214.         
  215.   DHT11_Read_Data(&tempH,&tempL,&humiH,&humiL);

  216.         OLED_ShowString(75,6,"T:");
  217.         OLED_ShowNum(95,6,tempH,2,16);                                                                                                   
  218. //        OLED_ShowNum(119,6,tempL,2,16);
  219.         OLED_ShowString(0,6,"H:");
  220.         OLED_ShowNum(20,6,humiH,2,16);
  221. //        OLED_ShowNum(44,6,humiL,2,16);
  222. //        OLED_ShowString(37,6,".");               

  223.         OLED_ShowString(50,6,"%");
  224.         

  225. }
  226. void TimeSet(void)
  227. {
  228.         
  229.                 if(KeyNum==16)
  230.         {
  231.                         P42=1;
  232.                         Delay(100);
  233.                         P42=0;
  234.                 TimeSetselect++;
  235.                 TimeSetselect%=6;
  236.         }
  237.                 OLED_ShowNum(102,2,TimeSetselect,2,16);
  238.         if(KeyNum==5)
  239.         {
  240.                        
  241.                 DS1302_Time[TimeSetselect]++;
  242.                 if(DS1302_Time[0]>99){DS1302_Time[0]=0;}
  243.                 if(DS1302_Time[1]>12){DS1302_Time[1]=1;}
  244.                 if(DS1302_Time[1]==1||DS1302_Time[1]==3||DS1302_Time[1]==3||DS1302_Time[1]==5||DS1302_Time[1]==7||DS1302_Time[1]==8||DS1302_Time[1]==10||DS1302_Time[1]==12){if(DS1302_Time[2]>31)
  245.                         {
  246.                         if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
  247.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}}
  248.                         }
  249.                 else if(DS1302_Time[1]==4||DS1302_Time[1]==6||DS1302_Time[1]==9||DS1302_Time[1]==11)
  250.                         {
  251.                         if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
  252.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
  253.                         }
  254.                         else if(DS1302_Time[1]==2)
  255.                 {
  256.                         if(DS1302_Time[0]%4==0)
  257.                         {
  258.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
  259.                                 if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
  260.                         }
  261.                         else
  262.                         {
  263.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
  264.                                 if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
  265.                         }
  266.                 }
  267.                 if(DS1302_Time[3]>23){DS1302_Time[3]=0;}
  268.                 if(DS1302_Time[4]>59){DS1302_Time[4]=0;}
  269.                 if(DS1302_Time[5]>59){DS1302_Time[5]=0;}
  270.                 }
  271.         if(KeyNum==6)//按键3按下
  272.         {
  273.                 DS1302_Time[TimeSetselect]--;//时间设置位数值减1
  274.                 if(DS1302_Time[0]<0){DS1302_Time[0]=99;}//年越界判断
  275.                 if(DS1302_Time[1]<1){DS1302_Time[1]=12;}//月越界判断
  276.                 if( DS1302_Time[1]==1 || DS1302_Time[1]==3 || DS1302_Time[1]==5 || DS1302_Time[1]==7 ||
  277.                         DS1302_Time[1]==8 || DS1302_Time[1]==10 || DS1302_Time[1]==12)//日越界判断
  278.                 {
  279.                         if(DS1302_Time[2]<1){DS1302_Time[2]=31;}//大月
  280.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
  281.                 }
  282.                 else if(DS1302_Time[1]==4 || DS1302_Time[1]==6 || DS1302_Time[1]==9 || DS1302_Time[1]==11)
  283.                 {
  284.                         if(DS1302_Time[2]<1){DS1302_Time[2]=30;}//小月
  285.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
  286.                 }
  287.                 else if(DS1302_Time[1]==2)
  288.                 {
  289.                         if(DS1302_Time[0]%4==0)
  290.                         {
  291.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=29;}//闰年2月
  292.                                 if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
  293.                         }
  294.                         else
  295.                         {
  296.                                 if(DS1302_Time[2]<1){DS1302_Time[2]=28;}//平年2月
  297.                                 if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
  298.                         }
  299.                 }
  300.                 if(DS1302_Time[3]<0){DS1302_Time[3]=23;}//时越界判断
  301.                 if(DS1302_Time[4]<0){DS1302_Time[4]=59;}//分越界判断
  302.                 if(DS1302_Time[5]<0){DS1302_Time[5]=59;}//秒越界判断
  303.         }
  304.         OLED_ShowNum(0,0,DS1302_Time[0],2,16);
  305.         OLED_ShowString(17,0,"-");
  306.         OLED_ShowNum(24,0,DS1302_Time[1],2,16);
  307.         OLED_ShowString(41,0,"-");
  308.         OLED_ShowNum(48,0,DS1302_Time[2],2,16);
  309.         OLED_ShowNum(30,2,DS1302_Time[3],2,16);
  310.         OLED_ShowString(47,2,":");
  311.         OLED_ShowNum(54,2,DS1302_Time[4],2,16);
  312.         OLED_ShowString(71,2,":");
  313.         OLED_ShowNum(78,2,DS1302_Time[5],2,16);
  314. //        OLED_Clear();
  315. }
  316. void Stopwatch()
  317. {
  318. //                LED=~LED;
  319. //        KeyNum=MatrixKey();
  320. //        OLED_Clear();
  321.                 OLED_ShowString(4,0,"    StopWatch");
  322.         OLED_ShowNum(30,2,MiniSec,2,16);
  323.         OLED_ShowString(47,2,":");
  324.         OLED_ShowNum(54,2,Sec,2,16);
  325.         OLED_ShowString(71,2,":");
  326.         OLED_ShowNum(78,2,Min,2,16);
  327. //        if(KeyNum==9)
  328. //        {
  329. //                Buzzer_Time(100);
  330. //                Run=1;
  331. //        Delay(100);
  332. //        LED=~LED;
  333. //        }
  334.         
  335. }
  336. void Sec_Loop(void)
  337. {
  338. //        if(Run)
  339. //        {
  340.                 MiniSec++;
  341.                 if(MiniSec>=10)
  342.                 {
  343.                         MiniSec=0;
  344.                         Sec++;
  345.                         if(Sec>=60)
  346.                         {
  347.                                 Sec=0;
  348.                                 Min++;
  349.                                 if(Min>=60)
  350.                                 {
  351.                                         Min=0;
  352.                                 }
  353.                         }
  354.                 }
  355. //        }
  356. }
  357. void Buzzer(void)
  358. {
  359.         P4M1=0X00;
  360.         P4M0=0x04;
  361. //        P42=1;
  362. //        Delay(100);
  363. //        P42=0;
  364. }
  365. void EEPROM_Init(void)
  366. {
  367.         if(EERPOM_ReadByte(0)==0xff)//可用一个校验位来判断是否进行擦写
  368.         {
  369.                 P34=~P34;
  370.         }
  371.         else
  372.         {
  373.                 clock1_hour=EERPOM_ReadByte(0);
  374.                 clock1_min =EERPOM_ReadByte(0x001);
  375.         }
  376. }

  377. void Judge_Clock(void)
  378. {
  379.                 EEPROM_Erase(0);
  380.                
  381.                 EEPROM_WriteByte(0x000,clock1_hour);
  382.         
  383. //                EEPROM_Erase(0x400);
  384.         
  385.                 EEPROM_WriteByte(0x001,clock1_min);
  386. }
  387. void shortdelay(unsigned int n){                //短延时
  388.         unsigned int i,j;
  389.         for(i=n;i>0;i--){
  390.                 for(j=110;j>0;j--){;}
  391.         }
  392. }

  393. void esp_init()
  394. {
  395.         unsigned char a=0,b=0;
  396.     while(table[a]!='\0')
  397.     {
  398.         SBUF=table[a];                //写入要发送的字符
  399.         while(!TI);                        //等待发送完成
  400.         TI=0;                                //发送
  401.         a++;
  402.     }
  403.     shortdelay(50);                        //延时函数
  404.     while(table1[b]!='\0')
  405.     {
  406.                 SBUF=table1[b];
  407.                 while(!TI);                        //等待发送完成
  408.                 TI=0;
  409.                 b++;
  410.     }
  411. }

  412. void int_init(){                        //开启定时器1,产生9600波特率
  413.         TMOD = 0x20;                        //定时器1工作在方式2八位自动重装模式
  414. ……………………

  415. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
51hei.png
Keil代码下载:
代码.zip (155.92 KB, 下载次数: 57)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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