久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 13799|回復: 25
打印 上一主題 下一主題
收起左側

用普中開發板做的51單片機的智能時鐘具有鬧鐘功能(DS1302+DS18B20+LCD1602)

  [復制鏈接]
跳轉到指定樓層
樓主
本貼針對學完單片機并且有讀懂代碼的非新手同學。本人目前放寒假,這個是本人在上個學期的單片機課上要求做的綜合實驗,現在重新修改了下增加了菜單目前測試毫無問題可以完美使用。有志向做鬧鐘的同學可以參考一下,原碼上由本人寫的大量注釋可以方便看懂。
使用了LCD1602、DS1302、DS18B20用來測試溫度、內部含鬧鐘系統但本人沒有做EEPROM有需要的同學可以自行添加。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<key.h>
  3. #include<LCD1602.h>
  4. #include<DS1302.h>
  5. #include<music.h>
  6. #include<DS18B20.H>

  7. #define normal 0//正常顯示時鐘界面
  8. #define settime 1//設定時鐘界面
  9. #define setalarm 2//設定鬧鐘界面
  10. #define displayalarm 3//顯示鬧鐘界面
  11. #define normal_12 4//顯示十二小時制界面
  12. #define caidan 5

  13. unsigned char system=normal;//我一開始就把界面切換為正常顯示時鐘界面

  14. extern unsigned char i,k;

  15. extern unsigned int code song[3][300];

  16. unsigned char code *week[8]={"NO ","Mon ","Tue ","Wed ","Thu ","Fri ","Sat ","Sun "};

  17. unsigned char code *clockzifu[4]={"ON ","OFF ","REP ","NRE "};

  18. struct Time timeset={0x18,0x01,0x16,0x14,0x30,0x50,0x03};

  19. //第一個鬧鐘
  20. //第二個鬧鐘
  21. //第三個鬧鐘
  22. //第四個鬧鐘
  23. //第五個鬧鐘
  24. struct alarmtime xdata clock[5]={{1,16,14,31,0,1,0,1},{1,8,14,32,3,0,0,0},{1,7,18,49,1,1,1,0},{0,0,0,0,0,0,1,0},{1,25,0,0,0,0,1,2}};

  25. unsigned char alarmnum;//鬧鐘

  26. unsigned char a;

  27. unsigned char flag=0;

  28. unsigned char xinghao=0;

  29. unsigned char tentoBCD(unsigned char dat)//十進制轉換為BCD碼函數
  30. {
  31.         unsigned char dat1,dat2;
  32.         dat1=dat/10;
  33.         dat2=dat%10;
  34.         dat2=dat2+dat1*16;
  35.         return dat2;
  36. }

  37. unsigned char BCDtoten(unsigned char dat)//BCD碼轉為十進制函數
  38. {
  39.         unsigned char dat1,dat2;
  40.         dat1=dat/16;
  41.         dat2=dat%16;
  42.         dat2=dat2+dat1*10;
  43.         return dat2;
  44. }

  45. void DS18B20deal(int temp)//DS18B20數據處理函數 顯示溫度更新溫度         
  46. {
  47.     //先判斷溫度值是否大于0或小于0等于0
  48.            float tp;//保存的數據可能帶小數  
  49.         if(temp<0)//當溫度值為負數
  50.           {
  51.                 LCD1602_writechar(9,1,0x2D);//ASCII碼中的-符號
  52.                 temp=temp-1;//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
  53.                 temp=~temp;//還原讀取的數據
  54.                 tp=temp;//保存到變量里面
  55.                 temp=tp*0.0625*100+0.5;//強制轉換成一個整形的數據.留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就算加上0.5,還是在小數點后面。       
  56.           }
  57.         else//當溫度值為正數
  58.           {                       
  59.                 LCD1602_writechar(9,1,0x20);//ASCII碼中的空格
  60.                 tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量。如果溫度是正的那么,那么正數的原碼就是補碼它本身
  61.                 temp=tp*0.0625*100+0.5;//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點。后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就算加上0.5,還是在小數點后面。       
  62.         }
  63.         LCD1602_writechar(10,1,temp/10000+'0');//溫度百位
  64.         LCD1602_writechar(11,1,temp%10000/1000+'0');//溫度十位
  65.         LCD1602_writechar(12,1,temp%1000/100+'0');//溫度個位
  66.     LCD1602_writechar(13,1,0x2E);//ASCII碼小數點
  67.         LCD1602_writechar(14,1,temp%100/10+'0');//小數點后一位
  68.         LCD1602_writechar(15,1,temp%10+'0');//小數點后兩位
  69. }

  70. void updatetime()//更新時鐘上的時間
  71. {
  72.         unsigned char time[9];//存儲變量
  73.         DS1302_gettime(×et);//讀取時間
  74.         time[0]=BCDtoten(timeset.hour)/10+'0';//小時的十位
  75.         time[1]=BCDtoten(timeset.hour)%10+'0';//小時的個位
  76.         time[2]=':';
  77.         time[3]=BCDtoten(timeset.min)/10+'0';//分的十位
  78.         time[4]=BCDtoten(timeset.min)%10+'0';//分的個位
  79.         time[5]=':';
  80.         time[6]=BCDtoten(timeset.sec)/10+'0';//秒的十位
  81.         time[7]=BCDtoten(timeset.sec)%10+'0';//秒的個位
  82.         time[8]='\0';//字符串結束標志

  83.         LCD1602_writestr(0,1,time);//在LCD上面打印時間
  84. }

  85. void updatetime_12()//更新十二小時制界面的時間
  86. {
  87.         unsigned char time[9];
  88.         DS1302_gettime(×et);//讀取時間
  89.         time[0]= BCDtoten(timeset.hour)%12/10+'0';//小時的十位
  90.         time[1]= BCDtoten(timeset.hour)%12%10+'0';//小時的個位
  91.         time[2]=':';
  92.         time[3]= BCDtoten(timeset.min)/10+'0';//分的十位
  93.         time[4]= BCDtoten(timeset.min)%10+'0';//分的個位
  94.         time[5]=':';
  95.         time[6]= BCDtoten(timeset.sec)/10+'0';//秒的十位
  96.         time[7]= BCDtoten(timeset.sec)%10+'0';//秒的個位
  97.         time[8]='\0';//字符串結束標志                                                                                                                                                                                                               
  98.         LCD1602_writestr(3,1,"TIME:");//打印出TIME的字符串
  99.         LCD1602_writestr(8,1,time);//在第二行第四列顯示時間
  100.         if(BCDtoten(timeset.hour)>12)//要是小時大于12時
  101.         {
  102.           LCD1602_writestr(0,1,"PM");//則顯示PM
  103.         }
  104.         else//小時不大于12
  105.         {
  106.           LCD1602_writestr(0,1,"AM");//則顯示AM
  107.         }  
  108. }

  109. void updatedate()//更新日歷
  110. {
  111.         unsigned char date[12];
  112.         date[0]= '2';
  113.         date[1]= '0';
  114.         date[2]= BCDtoten(timeset.year)/10%10+'0';//年的十位
  115.         date[3]= BCDtoten(timeset.year)%10+'0';//年的個位
  116.         date[4]='.';
  117.         date[5]= BCDtoten(timeset.mon)/10+'0';//月的十位
  118.         date[6]= BCDtoten(timeset.mon)%10+'0';//月的個位
  119.         date[7]='.';
  120.         date[8]= BCDtoten(timeset.day)/10+'0';//日的十位
  121.         date[9]= BCDtoten(timeset.day)%10+'0';//日的個位
  122.         date[10]='\0';
  123.         LCD1602_writestr(0,0,date);//顯示年月日
  124.         LCD1602_writestr(11,0,week[timeset.week]);//顯示星期
  125. }

  126. void updatealarm()//更新鬧鐘設定值
  127. {
  128.         unsigned char str0[14];
  129.         unsigned char str1[2];

  130.         str0[0]=alarmnum+'0';
  131.         str0[1]=' ';
  132.         str0[2]=clock[alarmnum].mon/10+'0';//月份十位
  133.         str0[3]=clock[alarmnum].mon%10+'0';//月份個位
  134.         str0[4]='-';
  135.         str0[5]=clock[alarmnum].day/10+'0';//日期十位
  136.         str0[6]=clock[alarmnum].day%10+'0';//日期個位
  137.         str0[7]=' ';
  138.         str0[8]=clock[alarmnum].hour/10+'0';//小時十位
  139.         str0[9]=clock[alarmnum].hour%10+'0';//小時個位
  140.         str0[10]=':';
  141.         str0[11]=clock[alarmnum].min/10+'0';//分鐘十位
  142.         str0[12]=clock[alarmnum].min%10+'0';//分鐘個位
  143.         str0[13]='\0';

  144.         LCD1602_writestr(0,1,str0);

  145.         str1[0]=clock[alarmnum].music+'0';//鈴聲
  146.         str1[1]='\0';

  147.         LCD1602_writestr(0,0,"U");
  148.         LCD1602_writestr(1,0,str1);//顯示鈴聲
  149.         LCD1602_writestr(3,0,clockzifu[clock[alarmnum].alarmre+2]);//顯示重不重復
  150.         LCD1602_writestr(7,0,week[clock[alarmnum].week]);//顯示星期
  151.         LCD1602_writestr(11,0,clockzifu[clock[alarmnum].alarmon]);//顯示開關       
  152. }

  153. void anjian4();

  154. void anjian1()
  155. {
  156.   if(system==normal)
  157.   {
  158.     system=caidan;
  159.         xinghao=0;
  160.         LCD1602_clear();
  161.         LCD1602_writechar(0,0,'*');
  162.         LCD1602_writestr(1,0,"12");
  163.         LCD1602_writestr(1,1,"alarm");
  164.         LCD1602_writestr(8,0,"setclock");
  165.         LCD1602_writestr(8,1,"setalarm");
  166.   }
  167.   else if(system==caidan&&xinghao==0)
  168.   {
  169.     system=normal_12;//切換到12小時制
  170.         LCD1602_clear();//清屏
  171.         updatetime_12();//顯示12小時制的時間
  172.         updatedate();//顯示日期
  173.   }
  174.   else if(system==caidan&&xinghao==1)
  175.   {
  176.     system=displayalarm;//切換到鬧鐘顯示
  177.     LCD1602_clear();//清屏
  178.         updatealarm();//顯示鬧鐘界面
  179.   }
  180.   else if(system==caidan&&xinghao==2)
  181.   {
  182.     system=settime;//進入設置時間界面
  183.         LCD1602_clear();
  184.         updatetime();//刷新時間
  185.     updatedate();//刷新日期
  186.     DS18B20deal(DS18B20readtemp());//DS18B20數據處理函數 同時輸出溫度
  187.     flag=0;//光標索引設置到秒鐘上
  188.     anjian4();//顯示光標位置
  189.     LCD1602_openguangbiao();//LCD1602打開光標顯示
  190.   }
  191.   else if(system==caidan&&xinghao==3)
  192.   {
  193.     system=setalarm;//進入設置鬧鐘
  194.         LCD1602_clear();//清屏
  195.         updatealarm();//顯示鬧鐘界面
  196.     flag=0;//光標索引設置到多鬧鐘選擇處上
  197.     anjian4();//顯示光標位置
  198.     LCD1602_openguangbiao();//LCD1602打開光標顯示
  199.   }
  200.   else if(system==settime)
  201.   {
  202.     system=normal;//切換回正常顯示時鐘的界面,顯示日歷時鐘、溫度。
  203.         DS1302_settime(×et);//把設定時間寫入實時時鐘
  204.         LCD1602_closeguangbiao();//LCD1602關閉光標顯示
  205.     LCD1602_clear();//LCD1602清屏
  206.     updatetime();//刷新時間
  207.         updatedate();//立即刷新日期
  208.         DS18B20deal(DS18B20readtemp());//DS18B20數據處理函數 顯示溫度
  209.   }
  210.   else if(system==setalarm)
  211.   {
  212.      system=displayalarm;//返回到鬧鐘顯示
  213.          LCD1602_closeguangbiao();//LCD1602關閉光標顯示
  214.          LCD1602_clear();//清屏
  215.          updatealarm();//刷新鬧鐘界面
  216.   }
  217. }

  218. void anjian4()
  219. {
  220.   if(system==caidan)
  221.   {
  222.     system=normal;
  223.         LCD1602_clear();//清屏
  224.         updatetime();//顯示時鐘時間
  225.         updatedate();//顯示日期
  226.         DS18B20deal(DS18B20readtemp());//DS18B20數據處理函數
  227.   }
  228.   else if(system==normal_12)
  229.   {
  230.     system=normal;//返回時鐘顯示界面
  231.         LCD1602_clear();//清屏
  232.         updatetime();//顯示時鐘時間
  233.         updatedate();//顯示日期
  234.         DS18B20deal(DS18B20readtemp());//DS18B20數據處理函數
  235.   }
  236.   else if(system==displayalarm)
  237.   {
  238.     system=caidan;
  239.         xinghao=1;
  240.         LCD1602_clear();
  241.         LCD1602_writechar(0,1,'*');
  242.         LCD1602_writestr(1,0,"12");
  243.         LCD1602_writestr(1,1,"alarm");
  244.         LCD1602_writestr(8,0,"setclock");
  245.         LCD1602_writestr(8,1,"setalarm");
  246.   }
  247.   else if(system==settime)//當前系統狀態位于設置時間時 定義光標的位置
  248.   {
  249.         switch(flag)//保存的設置位
  250.      {
  251.        case 0:LCD1602_setcur(7,1);flag=1;break;//定位于秒鐘個位處
  252.        case 1:LCD1602_setcur(4,1);flag=2;break;//定位于分鐘處
  253.        case 2:LCD1602_setcur(1,1);flag=3;break;//定位于小時處
  254.        case 3:LCD1602_setcur(11,0);flag=4;break;//定位于星期處
  255.        case 4:LCD1602_setcur(9,0);flag=5;break;//定位于日處
  256.        case 5:LCD1602_setcur(6,0);flag=6;break;//定位于月處
  257.        default:LCD1602_setcur(3,0);flag=0;break;//定位于年處
  258.      }
  259.   }
  260.   else if(system==setalarm)//當前系統狀態位于設置鬧鐘時 定義光標的位置
  261.      {
  262.         switch(flag)//保存的設置位
  263.         {
  264.             case 0:LCD1602_setcur(0,1);flag=1;break;//定位于多鬧鐘選擇處
  265.                         case 1:LCD1602_setcur(3,1);flag=2;break;//定位于鬧鐘月份處
  266.                         case 2:LCD1602_setcur(6,1);flag=3;break;//定位于鬧鐘日處
  267.                         case 3:LCD1602_setcur(9,1);flag=4;break;//定位于鬧鐘分鐘處
  268.                         case 4:LCD1602_setcur(12,1);flag=5;break;//定位于鬧鐘小時處
  269.                         case 5:LCD1602_setcur(1,0);flag=6;break;//定位于鬧鐘鈴聲選擇處
  270.                         case 6:LCD1602_setcur(3,0);flag=7;break;//定位于鬧鐘重復與不重復選擇處
  271.                         case 7:LCD1602_setcur(7,0);flag=8;break;//定位于鬧鐘星期選擇處
  272.             default:LCD1602_setcur(11,0);flag=0;break;//定位于鬧鐘開關處
  273.         }
  274.      }
  275. }

  276. void zengjia()//增加
  277. {
  278.     if(system==caidan)
  279.         {
  280.           if(xinghao==0)
  281.           {
  282.             LCD1602_clear();
  283.             LCD1602_writechar(0,1,'*');
  284.             LCD1602_writestr(1,0,"12");
  285.             LCD1602_writestr(1,1,"alarm");
  286.             LCD1602_writestr(8,0,"setclock");
  287.             LCD1602_writestr(8,1,"setalarm");
  288.                 xinghao=1;
  289.           }
  290.           else if(xinghao==1)
  291.           {
  292.                   LCD1602_clear();
  293.             LCD1602_writechar(7,0,'*');
  294.             LCD1602_writestr(1,0,"12");
  295.             LCD1602_writestr(1,1,"alarm");
  296.             LCD1602_writestr(8,0,"setclock");
  297.             LCD1602_writestr(8,1,"setalarm");
  298.                 xinghao=2;
  299.           }
  300.           else if(xinghao==2)
  301.           {
  302.             LCD1602_clear();
  303.             LCD1602_writechar(7,1,'*');
  304.             LCD1602_writestr(1,0,"12");
  305.             LCD1602_writestr(1,1,"alarm");
  306.             LCD1602_writestr(8,0,"setclock");
  307.             LCD1602_writestr(8,1,"setalarm");
  308.                 xinghao=3;
  309.           }
  310.           else if(xinghao==3)
  311.           {
  312.             LCD1602_clear();
  313.             LCD1602_writechar(0,0,'*');
  314.             LCD1602_writestr(1,0,"12");
  315.             LCD1602_writestr(1,1,"alarm");
  316.             LCD1602_writestr(8,0,"setclock");
  317.             LCD1602_writestr(8,1,"setalarm");
  318.                 xinghao=0;
  319.           }
  320.         }
  321.         else if(system==settime)//當設置日歷時間的界面時
  322.     {
  323.                 switch(flag)//檢查光標位置
  324.         {                               
  325.                         case 1: a=BCDtoten(timeset.sec);//把BCD碼轉為十進制 因為DS1302里時鐘程序讀寫時都是BCD碼 轉為10進制更好處理
  326.                                         if(a<59)
  327.                                         {
  328.                                           a++;
  329.                                         }  
  330.                                         else
  331.                                         {
  332.                                           a=0;//限制設置秒鐘不超過59秒,超過則回到0
  333.                                         }
  334.                                         timeset.sec=tentoBCD(a);//把十進制轉為BCD碼 因為DS1302時鐘程序讀寫時都是BCD碼 將加完的東西重新賦值給sec
  335.                                         LCD1602_writechar(6,1,(timeset.sec>>4)+'0');//秒的十位
  336.                                         LCD1602_writechar(7,1,(timeset.sec&0x0f)+'0');//秒的個位
  337.                                         LCD1602_setcur(7,1);//光標保持原位
  338.                                         break;

  339.                         case 2:        a=BCDtoten(timeset.min);//把BCD碼轉為十進制
  340.                                         if(a<59)
  341.                                         {
  342.                                           a++;
  343.                                         }  
  344.                                         else
  345.                                         {
  346.                                           a=0;//限制設置分鐘不超過59分,超過則回到0
  347.                                         }
  348.                                         timeset.min=tentoBCD(a);//把十進制轉為BCD碼
  349.                                         LCD1602_writechar(3,1,(timeset.min>>4)+'0');//分的十位
  350.                                         LCD1602_writechar(4,1,(timeset.min&0x0f)+'0');//分的個位
  351.                                         LCD1602_setcur(4,1);//光標保持原位
  352.                                         break;

  353.                         case 3:        a=BCDtoten(timeset.hour);//把BCD碼轉為十進制
  354.                                         if(a<23)
  355.                                         {
  356.                                           a++;
  357.                                         }  
  358.                                         else
  359.                                         {
  360.                                           a=0;//限制設置小時不超過23時,超過則回到0
  361.                                         }
  362.                                         timeset.hour=tentoBCD(a);//把十進制轉為BCD碼
  363.                                         LCD1602_writechar(0,1,(timeset.hour>>4)+'0');//小時的十位
  364.                                         LCD1602_writechar(1,1,(timeset.hour&0x0f)+'0');//小時的個位
  365.                                         LCD1602_setcur(1,1);//光標保持原位
  366.                                         break;

  367.                         case 4: if(timeset.week<7)//限制不超過星期日,如果超過則回到周一
  368.                                         {
  369.                                           timeset.week++;
  370.                                         }  
  371.                                         else
  372.                                         {
  373.                                           timeset.week=1;//回到星期一
  374.                                         }
  375.                                         LCD1602_writestr(11,0,week[timeset.week]);//
  376.                                         LCD1602_setcur(11,0);//光標保持原位
  377.                                         break;

  378.                         case 5:        a=BCDtoten(timeset.day);//把BCD碼轉為十進制
  379.                                         if(a<31)
  380.                                         {
  381.                                           a++;
  382.                                         }  
  383.                                         else
  384.                                         {
  385.                                           a=1;//限制設置日期不超過31日,超過則回到1
  386.                                         }
  387.                                         timeset.day=tentoBCD(a);//把十進制轉為BCD碼
  388.                                         LCD1602_writechar(8,0,(timeset.day>>4)+'0');//日的十位
  389.                                         LCD1602_writechar(9,0,(timeset.day&0x0f)+'0');//日的個位
  390.                                         LCD1602_setcur(9,0);//光標保持原位
  391.                                         break;

  392.                         case 6:        a=BCDtoten(timeset.mon);//把BCD碼轉為十進制
  393.                                         if(a<12)
  394.                                         {
  395.                                           a++;
  396.                                         }  
  397.                                         else
  398.                                         {
  399.                                           a=1;//限制設置月份不超過12月,超過則回到1
  400.                                         }
  401.                                         timeset.mon=tentoBCD(a);//把十進制轉為BCD碼
  402.                                         LCD1602_writechar(5,0,(timeset.mon>>4)+'0');//月的十位
  403.                                         LCD1602_writechar(6,0,(timeset.mon&0x0f)+'0');//月的個位
  404.                                         LCD1602_setcur(6,0);//光標保持原位
  405.                                         break;

  406.                         case 0:        a=BCDtoten(timeset.year);//把BCD碼轉為十進制
  407.                                         if(a<99)
  408.                                         {
  409.                                           a++;                                          
  410.                                         }  
  411.                                         else
  412.                                         {
  413.                                           a=0;//限制設置年不超過99年,超過則回到0
  414.                                         }
  415.                                         timeset.year=tentoBCD(a);//把十進制轉為BCD碼
  416.                                         LCD1602_writechar(2,0,(timeset.year>>4)+'0');//年的十位
  417.                                         LCD1602_writechar(3,0,(timeset.year&0x0f)+'0');//年的個位
  418.                                         LCD1602_setcur(3,0);//光標保持原位
  419.                                         break;
  420.                 }       
  421.         }
  422.         else if(system==setalarm)//當設置鬧鐘的時候
  423.         {
  424.                 switch(flag)//檢查光標位置
  425.         {
  426.                         case 1: if(alarmnum<4)//換鬧鐘
  427.                                 {
  428.                                           alarmnum++;
  429.                                 }  
  430.                                         else
  431.                                         {
  432.                                           alarmnum=0;
  433.                                         }
  434.                                         updatealarm();//更新鬧鐘設定值
  435.                                         LCD1602_setcur(0,1);//光標保持原位
  436.                                         break;
  437.                         case 2:        if(clock[alarmnum].mon<12)
  438.                                 {
  439.                                           clock[alarmnum].mon++;
  440.                                 }  
  441.                                         else
  442.                                         {
  443.                                           clock[alarmnum].mon=1;//限制設置月份不超過12月,超過則回到1
  444.                                         }
  445.                                         LCD1602_writechar(2,1,(clock[alarmnum].mon/10)+'0');//月的十位
  446.                                         LCD1602_writechar(3,1,(clock[alarmnum].mon%10)+'0');//月的個位
  447.                                         LCD1602_setcur(3,1);//光標保持原位
  448.                                         break;
  449.                         case 3:        if(clock[alarmnum].day<31)
  450.                                 {
  451.                                           clock[alarmnum].day++;
  452.                                         }  
  453.                                         else
  454.                                         {
  455.                                           clock[alarmnum].day=1;//限制設置日期不超過31日,超過則回到1
  456.                                         }
  457.                                         LCD1602_writechar(5,1,(clock[alarmnum].day/10)+'0');//日的十位
  458.                                         LCD1602_writechar(6,1,(clock[alarmnum].day%10)+'0');//日的個位
  459.                                         LCD1602_setcur(6,1);//光標保持原位
  460.                                         break;
  461.                         case 4:        if(clock[alarmnum].hour<23)
  462.                                 {
  463.                                           clock[alarmnum].hour++;
  464.                                         }
  465.                                         else
  466.                                         {
  467.                                           clock[alarmnum].hour=0;//限制設置小時不超過23時,超過則回到0
  468.                                         }                                                                                                                                                                                                                                                                                                                                                                                           
  469.                                         LCD1602_writechar(8,1,(clock[alarmnum].hour/10)+'0');//小時的十位
  470.                                         LCD1602_writechar(9,1,(clock[alarmnum].hour%10)+'0');//小時的個位
  471.                                         LCD1602_setcur(9,1);//光標保持原位
  472.                                         break;
  473.                         case 5: if(clock[alarmnum].min<59)
  474.                                 {
  475.                                           clock[alarmnum].min++;
  476.                                         }  
  477.                                         else
  478.                                         {
  479.                                           clock[alarmnum].min=0;//限制設置分鐘不超過59分,超過則回到0
  480.                                         }
  481.                                         LCD1602_writechar(11,1,(clock[alarmnum].min/10)+'0');//分鐘的十位
  482.                                         LCD1602_writechar(12,1,(clock[alarmnum].min%10)+'0');//分鐘的個位
  483.                                         LCD1602_setcur(12,1);//光標保持原位
  484.                                         break;
  485.                                        
  486.                         case 6:        if(clock[alarmnum].music<2)
  487.                                 {
  488.                                           clock[alarmnum].music++;
  489.                                         }  
  490.                                         else
  491.                                         {
  492.                                           clock[alarmnum].music=0;
  493.                                         }
  494.                                         LCD1602_writechar(1,0,clock[alarmnum].music+'0');//音樂曲目
  495.                                         LCD1602_setcur(1,0);//光標保持原位
  496.                                         break;
  497.                                                                
  498.                         case 7:        clock[alarmnum].alarmre=~clock[alarmnum].alarmre;//取反
  499.                                         LCD1602_writestr(3,0,clockzifu[clock[alarmnum].alarmre+2]);//顯示鬧鐘狀態
  500.                                         LCD1602_setcur(3,0);//光標保持原位
  501.                                         break;
  502.                         case 8:        if(clock[alarmnum].week<7)
  503.                                         {
  504.                                           clock[alarmnum].week++;
  505.                                         }  
  506.                                         else
  507.                                         {
  508.                                           clock[alarmnum].week=0;//限制不超過星期日,如果超過則回到不設星期
  509.                                         }
  510.                                         LCD1602_writestr(7,0,week[clock[alarmnum].week]);//顯示到液晶上;
  511.                                         LCD1602_setcur(7,0);//光標保持原位
  512.                                         break;

  513.                         case 0: clock[alarmnum].alarmon=~clock[alarmnum].alarmon;//取反
  514.                                         LCD1602_writestr(11,0,clockzifu[clock[alarmnum].alarmon]);//顯示鬧鐘狀態
  515.                                         LCD1602_setcur(11,0);//光標保持原位
  516.                                         break;               
  517.                 }               
  518.         }
  519. }

  520. void jianxiao()//S4按鍵功能函數,數據減
  521. {
  522.         if(system==caidan)
  523.         {
  524.           if(xinghao==0)
  525.           {
  526.             LCD1602_clear();
  527.             LCD1602_writechar(7,1,'*');
  528.             LCD1602_writestr(1,0,"12");
  529.             LCD1602_writestr(1,1,"alarm");
  530.             LCD1602_writestr(8,0,"setclock");
  531.             LCD1602_writestr(8,1,"setalarm");
  532.                 xinghao=3;
  533.           }
  534.           else if(xinghao==3)
  535.           {
  536.                   LCD1602_clear();
  537.             LCD1602_writechar(7,0,'*');
  538.             LCD1602_writestr(1,0,"12");
  539.             LCD1602_writestr(1,1,"alarm");
  540.             LCD1602_writestr(8,0,"setclock");
  541.             LCD1602_writestr(8,1,"setalarm");
  542.                 xinghao=2;
  543.           }
  544.           else if(xinghao==2)
  545.           {
  546.             LCD1602_clear();
  547.             LCD1602_writechar(0,1,'*');
  548.             LCD1602_writestr(1,0,"12");
  549.             LCD1602_writestr(1,1,"alarm");
  550.             LCD1602_writestr(8,0,"setclock");
  551.             LCD1602_writestr(8,1,"setalarm");
  552.                 xinghao=1;
  553.           }
  554.           else if(xinghao==1)
  555.           {
  556.             LCD1602_clear();
  557.             LCD1602_writechar(0,0,'*');
  558.             LCD1602_writestr(1,0,"12");
  559.             LCD1602_writestr(1,1,"alarm");
  560.             LCD1602_writestr(8,0,"setclock");
  561.             LCD1602_writestr(8,1,"setalarm");
  562.                 xinghao=0;
  563.           }
  564.         }
  565.         else if(system==settime)//設置日期/時間
  566.     {
  567.                 switch(flag)//檢查光標位置
  568.         {                               
  569.                         case 1:        a=BCDtoten(timeset.sec);//把BCD碼轉為十進制
  570.                                         if(a!=0)
  571.                                         {
  572.                                           a--;
  573.                                         }  
  574.                                         else
  575.                                         {
  576.                                           a=59;//限制設置秒鐘不為0時減1,為0時回到59
  577.                                         }
  578.                                         timeset.sec=tentoBCD(a);//把十進制轉為BCD碼
  579.                                         LCD1602_writechar(6,1,(timeset.sec>>4)+'0');//秒的十位
  580.                                         LCD1602_writechar(7,1,(timeset.sec&0x0f)+'0');//秒的個位
  581.                                         LCD1602_setcur(7,1);//光標保持原位
  582.                                         break;

  583.                         case 2:        a=BCDtoten(timeset.min);//把BCD碼轉為十進制
  584.                                         if(a!=0)
  585.                                         {
  586.                                           a--;
  587.                                         }  
  588.                                         else
  589.                                         {
  590.                                           a=59;//限制設置分鐘不為0時減1,為0時回到59
  591.                                         }
  592.                                         timeset.min=tentoBCD(a);//把十進制轉為BCD碼
  593.                                         LCD1602_writechar(3,1,(timeset.min>>4)+'0');//分的十位
  594.                                         LCD1602_writechar(4,1,(timeset.min&0x0f)+'0');//分的個位
  595.                                         LCD1602_setcur(4,1);//光標保持原位
  596.                                         break;

  597.                         case 3:        a=BCDtoten(timeset.hour);//把BCD碼轉為十進制
  598.                                         if(a!=0)
  599.                                         {
  600.                                           a--;
  601.                                         }  
  602.                                         else
  603.                                         {
  604.                                           a=23;//限制設置小時不為0時減1,為0時回到23
  605.                                         }
  606.                                         timeset.hour=tentoBCD(a);//把十進制轉為BCD碼
  607.                                         LCD1602_writechar(0,1,(timeset.hour>>4)+'0');//小時的十位
  608.                                         LCD1602_writechar(1,1,(timeset.hour&0x0f)+'0');//小時的個位
  609.                                         LCD1602_setcur(1,1);//光標保持原位
  610.                                         break;

  611.                         case 4: //如果為當前為星期一時,回到星期天
  612.                                         if(timeset.week!=1)
  613.                                         {
  614.                                           timeset.week--;
  615.                                         }  
  616.                                         else
  617.                                         {
  618.                                           timeset.week=7;
  619.                                         }
  620.                                         LCD1602_writestr(11,0,week[timeset.week]);//顯示到液晶上;
  621.                                         LCD1602_setcur(11,0);//光標保持原位
  622.                                         break;

  623.                         case 5:        a=BCDtoten(timeset.day);//把BCD碼轉為十進制
  624.                                         if(a!=1)
  625.                                         {
  626.                                           a--;
  627.                                         }  
  628.                                         else
  629.                                         {
  630.                                           a=31;
  631.                                         }//限制設置日期不為1時減1,為0時回到31
  632.                                         timeset.day=tentoBCD(a);//把十進制轉為BCD碼
  633.                                         LCD1602_writechar(8,0,(timeset.day>>4)+'0');//日期的十位
  634.                                         LCD1602_writechar(9,0,(timeset.day&0x0f)+'0');//日期的個位
  635.                                         LCD1602_setcur(9,0);//光標保持原位
  636.                                         break;

  637.                         case 6:        a=BCDtoten(timeset.mon);//把BCD碼轉為十進制
  638.                                         if(a!=1)
  639.                                         {
  640.                                           a--;
  641.                                         }  
  642.                                         else
  643.                                         {
  644.                                           a=12;//限制設置月份不為1時減1,為0時回到12
  645.                                         }
  646.                                         timeset.mon=tentoBCD(a);//把十進制轉為BCD碼
  647.                                         LCD1602_writechar(5,0,(timeset.mon>>4)+'0');//月份的十位
  648.                                         LCD1602_writechar(6,0,(timeset.mon&0x0f)+'0');//月份的個位
  649.                                         LCD1602_setcur(6,0);//光標保持原位
  650.                                         break;

  651.                         case 0:        a=BCDtoten(timeset.year);//把BCD碼轉為十進制
  652.                                         if(a!=0)
  653.                                         {
  654.                                           a--;
  655.                                         }  
  656.                                         else
  657.                                         {
  658.                                           a=99;//限制設置年不為0時減1,為0時回到99
  659.                                         }
  660.                                         timeset.year=tentoBCD(a);//把十進制轉為BCD碼
  661.                                         LCD1602_writechar(2,0,(timeset.year>>4)+'0');//年的十位
  662.                                         LCD1602_writechar(3,0,(timeset.year&0x0f)+'0');//年的個位
  663.                                         LCD1602_setcur(3,0);//光標保持原位
  664.                                         break;
  665.                 }               
  666.         }
  667.         else if(system==setalarm)//設置鬧鐘
  668.         {
  669.                 switch(flag)//檢查光標位置
  670.         {
  671.                         case 1: if(alarmnum!=0)//換鬧鐘
  672.                                 {
  673.                                           alarmnum--;
  674.                                         }
  675.                                         else
  676.                                         {
  677.                                           alarmnum=4;
  678.                                         }
  679.                                         updatealarm();//刷新鬧鐘界面
  680.                                         LCD1602_setcur(0,1);//光標保持原位
  681.                                         break;
  682.                         case 2:        if(clock[alarmnum].mon!=1)
  683.                                 {
  684.                                           clock[alarmnum].mon--;
  685.                                         }  
  686.                                         else
  687.                                         {
  688.                                           clock[alarmnum].mon=12;//限制設置月份不超過12月,超過則回到1
  689.                                         }
  690.                                         LCD1602_writechar(2,1,(clock[alarmnum].mon/10)+'0');//月份十位
  691.                                         LCD1602_writechar(3,1,(clock[alarmnum].mon%10)+'0');//月份個位
  692.                                         LCD1602_setcur(3,1);//光標保持原位
  693.                                         break;
  694.                         case 3:        if(clock[alarmnum].day!=1)
  695.                                 {
  696.                                           clock[alarmnum].day--;
  697.                                         }  
  698.                                         else
  699.                                         {
  700.                                           clock[alarmnum].day=31;//限制設置日期不超過31日,超過則回到1
  701.                                         }
  702.                                         LCD1602_writechar(5,1,(clock[alarmnum].day/10)+'0');//日期十位
  703.                                         LCD1602_writechar(6,1,(clock[alarmnum].day%10)+'0');//日期個位
  704.                                         LCD1602_setcur(6,1);//光標保持原位
  705.                                         break;
  706.                         case 4:        if(clock[alarmnum].hour!=0)
  707.                                 {
  708.                                           clock[alarmnum].hour--;
  709.                                         }  
  710.                                         else
  711.                                         {
  712.                                           clock[alarmnum].hour=23;//限制設置小時不超過23時,超過則回到0
  713.                                         }                                                                                                                                                                                                                                                                                                                                                                                           
  714.                                         LCD1602_writechar(8,1,(clock[alarmnum].hour/10)+'0');//小時十位
  715.                                         LCD1602_writechar(9,1,(clock[alarmnum].hour%10)+'0');//小時個位
  716.                                         LCD1602_setcur(9,1);//光標保持原位
  717.                                         break;
  718.                         case 5: if(clock[alarmnum].min!=0)
  719.                                 {
  720.                                           clock[alarmnum].min--;
  721.                                         }  
  722.                                         else
  723.                                         {
  724.                                           clock[alarmnum].min=59;//限制設置分鐘不超過59分,超過則回到0
  725.                                         }
  726.                                         LCD1602_writechar(11,1,(clock[alarmnum].min/10)+'0');//分鐘十位
  727.                                         LCD1602_writechar(12,1,(clock[alarmnum].min%10)+'0');//分鐘個位
  728.                                         LCD1602_setcur(12,1);//光標保持原位
  729.                                         break;
  730.                                        
  731.                         case 6:        if(clock[alarmnum].music!=0)
  732.                                 {
  733.                                           clock[alarmnum].music--;
  734.                                         }  
  735.                                         else
  736.                                         {
  737.                                           clock[alarmnum].music=2;
  738.                                         }
  739.                                         LCD1602_writechar(1,0,clock[alarmnum].music+'0');
  740.                                         LCD1602_setcur(1,0);//光標保持原位
  741.                                         break;
  742.                                                                
  743.                         case 7:        clock[alarmnum].alarmre=~clock[alarmnum].alarmre;
  744.                                         LCD1602_writestr(3,0,clockzifu[clock[alarmnum].alarmre+2]);//顯示鬧鐘狀態
  745.                                         LCD1602_setcur(3,0);//光標保持原位
  746.                                         break;
  747.                         case 8:        if (clock[alarmnum].week!=0)
  748.                                         {
  749.                                           clock[alarmnum].week--;
  750.                                         }  
  751.                                         else
  752.                                         {
  753.                                           clock[alarmnum].week=7;
  754.                                         }
  755.                                         LCD1602_writestr(7,0,week[clock[alarmnum].week]);//顯示到液晶上;
  756.                                         LCD1602_setcur(7,0);//光標保持原位
  757.                                         break;

  758.                         case 0: clock[alarmnum].alarmon=~clock[alarmnum].alarmon;
  759.                                         LCD1602_writestr(11,0,clockzifu[clock[alarmnum].alarmon]);//顯示鬧鐘狀態
  760.                                         LCD1602_setcur(11,0);//光標保持原位
  761.                                         break;
  762.                 }               
  763.         }
  764. }

  765. void alarmset()//鬧鐘函數
  766. {
  767.         unsigned char i;
  768.         for(i=0;i<5;i++)//掃描鬧鐘
  769.         {
  770.             //0就是重復 1不重復
  771.                 if(clock[i].alarmre)//不重復時
  772.                 {
  773.                           if((BCDtoten(timeset.hour)==clock[i].hour)&&(BCDtoten(timeset.min)==clock[i].min)&&(BCDtoten(timeset.mon)==clock[i].mon)&&(BCDtoten(timeset.day)==clock[i].day)&&(BCDtoten(timeset.sec))==0)//檢查鬧鐘的時間和日期是否跟目前的時鐘時間日期匹配
  774.                     {
  775.                               //0為打開 1為關閉
  776.                           if(!clock[i].alarmon)//檢查鬧鐘是否打開
  777.                                                 {
  778.                                                   LCD1602_clear();//清屏
  779.                                                   LCD1602_writestr(0,0,"Alarm");
  780.                                                   LCD1602_writechar(6,0,i+'0');
  781.                                                   LCD1602_writestr(8,0,"ring!");
  782.                                                   LCD1602_writestr(0,1,"Please press!");
  783.                                                   playmusic(clock[i].music);//播放鈴聲
  784.                                                   LCD1602_clear();//清屏
  785.                                                 }
  786.                     }
  787.                 }
  788.                 else//如果重復
  789.                 {
  790.                         if(clock[i].week)//有設置星期 則是每一個特定星期重復
  791.                         {
  792.                                 if(clock[i].week==timeset.week)//看鬧鐘設置的星期是否為現在的星期
  793.                                 {
  794.                                         if((BCDtoten(timeset.hour)==clock[i].hour)&&(BCDtoten(timeset.min)==clock[i].min)&&(BCDtoten(timeset.sec))==0)//檢查鬧鐘的時間是否跟目前的時鐘時間匹配
  795.                                     {
  796.                                           if(!clock[i].alarmon)//檢查鬧鐘是否打開
  797.                                                 {
  798.                                                   LCD1602_clear();//清屏
  799.                                                   LCD1602_writestr(0,0,"Alarm");
  800.                                                   LCD1602_writechar(6,0,i+'0');
  801.                                                   LCD1602_writestr(8,0,"ring!");
  802.                                                    LCD1602_writestr(0,1,"Please press!");
  803.                                                   playmusic(clock[i].music);//播放音樂
  804.                                                   LCD1602_clear();//清屏
  805.                                                 }
  806.                                     }
  807.                                        
  808.                                 }       
  809.                        
  810.                         }
  811.                         else//沒有設置星期且在重復的情況下 則為每天都響
  812.                         {
  813.                                         if((BCDtoten(timeset.hour)==clock[i].hour)&&(BCDtoten(timeset.min)==clock[i].min)&&(BCDtoten(timeset.sec))==0)//檢查鬧鐘的時間是否跟目前的時鐘時間匹配
  814.                                     {
  815.                                         if (!clock[i].alarmon)//檢查鬧鐘是否打開
  816.                                                 {
  817.                                                   LCD1602_clear();//清屏
  818.                                                   LCD1602_writestr(0,0,"Alarm");
  819.                                                   LCD1602_writechar(6,0,i+'0');
  820.                                                   LCD1602_writestr(8,0,"ring!");
  821.                                                   LCD1602_writestr(0,1,"Please press!");
  822.                                                   playmusic(clock[i].music);//播放音樂
  823.                                                   LCD1602_clear();//清屏
  824.                                                 }
  825.                                     }                               
  826.                         }       
  827.                 }
  828.         }          
  829. }


  830. void dingshiqi0()
  831. {
  832.         TMOD|=0x01;
  833.         TH0=0;
  834.         TL0=0;
  835.         TR0=0;
  836.         ET0=1;
  837.         PT0=1;
  838.         EA=1;
  839. }

  840. void dingshiqi1()
  841. {
  842.         TMOD|=0x10;
  843.         EA=1;
  844.         ET1=1;
  845.         TR1=1;
  846.         TH1=0xED;
  847.         TL1=0xFE;
  848. }

  849. void timer0() interrupt 1
  850. {       
  851.     TH0=song[k][i]/256;
  852.         TL0=song[k][i]%256;
  853.         beep=~beep;

  854. }

  855. void timer1() interrupt 3
  856. {
  857.     TH1=0xED;
  858.         TL1=0xFE;
  859.         key_scan();               
  860. }

  861. void main()
  862. {
  863.         dingshiqi0();//定時器0初始化
  864.         dingshiqi1();//定時器1初始化
  865.         LCD1602_init();//LCD1602初始化
  866.         DS1302_init();//DS1302初始化
  867.         while(1)
  868.         {
  869.                 key_driver();
  870.                 alarmset();//鬧鐘設定函數
  871.                 if(system==normal)//當狀態為正常顯示時間時
  872.                 {
  873.                    updatetime();//刷新時間
  874.                    updatedate();//刷新日期
  875.                    DS18B20deal(DS18B20readtemp());//DS18B20數據處理函數 同時輸出溫度
  876.                 }
  877.                 else if(system==normal_12)//當狀態為顯示12小時制
  878.                 {
  879.                    updatetime_12();//刷新時間
  880.                    updatedate();//刷新日期
  881.                 }
  882.         }
  883. }
復制代碼

所有資料51hei提供下載:
單片機考試:51單片機時鐘鬧鐘.zip (143.44 KB, 下載次數: 391)


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:73182 發表于 2019-1-31 07:57 | 只看該作者
感謝分享,再加個電路圖就好了
回復

使用道具 舉報

板凳
ID:406781 發表于 2019-1-31 12:03 | 只看該作者
ptlantu 發表于 2019-1-31 07:57
感謝分享,再加個電路圖就好了

電路圖參考普中開發板的就行了
回復

使用道具 舉報

地板
ID:406781 發表于 2019-1-31 12:05 | 只看該作者
上面是我用的開發板的電路圖

EM3 V2.2開發板原理圖.pdf

274.28 KB, 下載次數: 108, 下載積分: 黑幣 -5

回復

使用道具 舉報

5#
ID:537607 發表于 2019-5-28 10:02 來自手機 | 只看該作者
謝謝分享 幫了大忙
回復

使用道具 舉報

6#
ID:469510 發表于 2019-5-28 13:53 | 只看該作者
謝謝分享
回復

使用道具 舉報

7#
ID:555438 發表于 2019-6-5 11:40 | 只看該作者
樓主你的程序調整時間之后不具備保存的功能嗎,我調整之后按一下k1就自動回到初始時間了
回復

使用道具 舉報

8#
ID:406781 發表于 2019-7-16 21:49 | 只看該作者
dreamasakura 發表于 2019-6-5 11:40
樓主你的程序調整時間之后不具備保存的功能嗎,我調整之后按一下k1就自動回到初始時間了

時間保存啊只是鬧鐘沒有存儲功能上電鬧鐘會丟失數據而已
回復

使用道具 舉報

9#
ID:589966 發表于 2019-7-25 17:47 | 只看該作者
下載了壓縮包解壓后,keil4打不開,求樓主幫忙
回復

使用道具 舉報

10#
ID:406781 發表于 2019-7-29 12:12 | 只看該作者
Fairchild 發表于 2019-7-25 17:47
下載了壓縮包解壓后,keil4打不開,求樓主幫忙

沒有問題啊我這邊。剛剛下載用我的keil4是可以打開并且編譯的[img][/img]

1564373499(1).jpg (312.58 KB, 下載次數: 93)

1564373499(1).jpg
回復

使用道具 舉報

11#
ID:84745 發表于 2019-10-20 12:11 來自手機 | 只看該作者
感謝分享
回復

使用道具 舉報

12#
ID:345799 發表于 2019-10-20 14:50 | 只看該作者
學習了
回復

使用道具 舉報

13#
ID:611626 發表于 2019-10-27 10:32 | 只看該作者
請教一下:壓縮文件內少了4個按鍵聲明,添加到KEY.H以后顯示屏無顯示,怎么回事
回復

使用道具 舉報

14#
ID:613618 發表于 2019-10-27 12:05 來自手機 | 只看該作者
有鬧鐘功能就應該有儲存功能,這應該算不成熟的程序,望樓主改善
回復

使用道具 舉報

15#
ID:258542 發表于 2019-11-9 11:42 | 只看該作者
下載一個學習下
回復

使用道具 舉報

16#
ID:258542 發表于 2019-11-9 13:16 | 只看該作者
宏達工控 發表于 2019-10-27 10:32
請教一下:壓縮文件內少了4個按鍵聲明,添加到KEY.H以后顯示屏無顯示,怎么回事

我也碰到一樣的問題,在key.h中申明,用extern關鍵詞,就可以了。

目前我的問題是:編譯時出現錯誤
main.c(25): error C230: 'Time': unknown struct/union/enum tag
main.c(35): error C230: 'alarmtime': unknown struct/union/enum tag
這兩個結構體無法識別,不知道是哪里錯了?
回復

使用道具 舉報

17#
ID:229641 發表于 2019-11-12 16:41 來自手機 | 只看該作者
掉電還會走時嗎?
回復

使用道具 舉報

18#
ID:641369 發表于 2019-12-1 19:35 | 只看該作者
想著下來弄個時鐘玩玩
回復

使用道具 舉報

19#
ID:632112 發表于 2019-12-6 11:51 | 只看該作者
下載一個學習下
回復

使用道具 舉報

20#
ID:406781 發表于 2020-2-25 13:27 | 只看該作者
依戀曉 發表于 2019-10-27 12:05
有鬧鐘功能就應該有儲存功能,這應該算不成熟的程序,望樓主改善

對這應該要有存儲功能但那時偷懶就沒有加
回復

使用道具 舉報

21#
ID:406781 發表于 2020-2-25 13:28 | 只看該作者

會啊因為板子里面的DS1302自帶電池
回復

使用道具 舉報

22#
ID:406781 發表于 2020-2-25 13:32 | 只看該作者
絆腳石13 發表于 2019-11-9 13:16
我也碰到一樣的問題,在key.h中申明,用extern關鍵詞,就可以了。

目前我的問題是:編譯時出現錯誤

想看看你的情況截圖一下看看唄
回復

使用道具 舉報

23#
ID:812792 發表于 2020-8-11 17:42 | 只看該作者
請問樓主,時間顯示,溫度,鬧鐘的功能都能實現么
回復

使用道具 舉報

24#
ID:812792 發表于 2020-8-11 17:46 | 只看該作者
請問樓主有沒有仿真的電路圖呢,幫幫小菜雞叭
回復

使用道具 舉報

25#
ID:406781 發表于 2021-10-21 09:59 | 只看該作者
張張不會單片機 發表于 2020-8-11 17:46
請問樓主有沒有仿真的電路圖呢,幫幫小菜雞叭

無,只有上面的開發板原理圖
回復

使用道具 舉報

26#
ID:406781 發表于 2021-10-21 10:00 | 只看該作者
張張不會單片機 發表于 2020-8-11 17:42
請問樓主,時間顯示,溫度,鬧鐘的功能都能實現么

對的,可以實現的
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 九九国产 | 国产精品久久久久久久午夜 | 国产在线观看av | 看真人视频一级毛片 | 国产精品污www一区二区三区 | 天天影视色综合 | 免费成人高清在线视频 | 九九精品影院 | 亚洲福利免费 | 国产日韩欧美激情 | 网色| 亚洲网站在线播放 | 久草视频2 | 国产在线成人 | 午夜视频一区 | 亚洲最色视频 | 亚洲精品国产电影 | 精品国产网| 日本a在线 | 日韩免费福利视频 | 久久成人一区 | 欧美精品一级 | 亚洲综合一区二区三区 | 国产精品污www一区二区三区 | 99精品在线免费观看 | 九九免费视频 | 岛国视频| 国内精品一区二区三区 | 久草新在线 | 成人午夜精品 | 天天色av| 成人精品久久 | 激情五月综合网 | 免费一区二区三区 | 欧美国产日韩精品 | 久久久一区二区 | 不卡视频一区二区三区 | 国产精品久久久久一区二区三区 | 91免费观看国产 | 国产精品1区 | 精品国产乱码久久久久久丨区2区 |