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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

電子時鐘設計 求大神給個思路 想自學單片機技術

[復制鏈接]
跳轉到指定樓層
樓主
ID:150410 發表于 2016-11-26 23:00 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
100黑幣
電子時鐘設計:(1) 用51系列單片機作為控制器(2) 采用LCD液晶作為顯示設備(3) 可以分別設定小時,分鐘和秒(4) 能實現日期的設置,年、月、日
(5) 采用5V直流穩壓電源(6)匯編語言編寫(7)仿真圖,程序流程圖


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

使用道具 舉報

沙發
ID:85726 發表于 2016-11-27 10:37 | 只看該作者
你這是設計吧!我看你等級也不低,這個項目應該不是問題吧!
回復

使用道具 舉報

板凳
ID:150410 發表于 2016-11-27 11:21 | 只看該作者
ning 發表于 2016-11-27 10:37
你這是課程設計吧!我看你等級也不低,這個項目應該不是問題吧!

純新手,求大神幫忙
回復

使用道具 舉報

地板
ID:196445 發表于 2017-5-5 15:44 來自手機 | 只看該作者
可以照著網上搜的原理圖,用仿真軟件畫出
回復

使用道具 舉報

5#
ID:342731 發表于 2018-6-18 19:15 | 只看該作者
  1. #include <intrins.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit rs=P1^0;//寄存器選擇
  5. sbit rw=P1^1;//讀寫信號線
  6. sbit lcden=P1^2;//led使能端

  7. sbit scl=P1^3;//時鐘線
  8. sbit rst=P1^5;//復位線
  9. sbit io=P1^4;//數據口

  10. sbit key_set_time=P3^4;//設置時間鍵
  11. sbit key_add=P3^5;//加鍵
  12. sbit key_minus=P3^6;//減鍵
  13. sbit key_set_alarm=P3^7;//設置鬧鐘鍵
  14. sbit bee=P1^6;//蜂鳴器接口
  15. sbit dq=P1^7;//ds18b20測溫

  16. uchar getTimebuf[7];//存放時間數據
  17. uchar time[]={"  :  :  "};//時間格式字符串
  18. uchar date[]={"20  -  -  "};//日期格式字符串
  19. uchar weeklist[]={"SunMonTueWedThuFriSat"};//星期字符列表
  20. uchar week[]={"   "};//星期格式字符串

  21. int count;//設定秒分時日月星期年的時候count的值分別為1235647
  22. int alarm;//是否進入鬧鐘設置界面 123分別代表開關 分 小時的設置
  23. int isOpen;//鬧鐘是否開啟  默認不開啟
  24. int fen,shi;//鬧鐘的分鐘小時
  25. int isRing;//鬧鐘是否在響

  26. uchar isInit_1302;//是否初始化時鐘完畢

  27. int num;
  28. int temperature;//溫度
  29. int temp_flag;//溫度正負標志

  30. void delay(uint x){
  31.         int y;
  32.         while(x--){
  33.                 for(y=100;y>0;y--);
  34.         }
  35. }
  36. void write_1602com(uchar com){
  37.         //1602寫指令
  38.         rs=0;
  39.         lcden=0;
  40.         P2=com;
  41.         delay(5);
  42.         lcden=1;
  43.         delay(5);
  44.         lcden=0;
  45. }
  46. void write_1602data(uchar dat){
  47.         //1602寫數據
  48.         rs=1;
  49.         lcden=0;
  50.         P2=dat;
  51.         delay(5);
  52.         lcden=1;
  53.         delay(5);
  54.         lcden=0;
  55. }
  56. void init_1602(){
  57.         //初始化1602液晶
  58.         rw=0;
  59.         lcden=0;
  60.         write_1602com(0x38);//設置顯示模式
  61.         write_1602com(0x0c);//顯示開關及光標是否顯示和閃動
  62.         write_1602com(0x06);//光標移動方向
  63.         write_1602com(0x01);//清屏
  64. }
  65. void write_ds1302_byte(uchar temp){
  66.         //ds1302寫一個字節數據
  67.         uchar i;
  68.         for(i=0;i<8;i++){
  69.                 io=temp&0x01;//將數據放到IO口上
  70.                 scl=0;//scl為低時準備數據
  71.                 scl=1;//上升沿寫入
  72.                 temp>>=1;
  73.         }
  74. }
  75. void write_ds1302(uchar add,uchar dat){
  76.         //向地址add寫入數據dat
  77.         rst=0;
  78.         scl=0;
  79.         rst=1;
  80.         write_ds1302_byte(add);
  81.         write_ds1302_byte(dat);
  82.         scl=1;
  83.         rst=0;
  84. }
  85. uchar read_ds1302(uchar add){
  86.         //ds1302讀數據
  87.         uchar i,dat;
  88.         rst=0;
  89.         scl=0;
  90.         rst=1;
  91.         write_ds1302_byte(add);//首先寫入要讀的數據處的地址
  92.         for(i=0;i<8;i++){
  93.                 if(io==1){
  94.                         dat|=0x80;
  95.                 }
  96.                 scl=1;
  97.                 scl=0;//下降沿讀取數據
  98.                 dat>>=1;
  99.         }
  100.         scl=1;
  101.         rst=0;
  102.         return dat;
  103. }
  104. void read_time(uchar curr_time[]){
  105.           uchar i;
  106.           uchar ucAddr = 0x81;
  107.           for (i=0;i<7;i++){
  108.                 curr_time[i] = read_ds1302(ucAddr);//格式為: 秒 分 時 日 月 星期 年
  109.                 ucAddr += 2;
  110.           }
  111. }
  112. void set_time(uchar *pSecDa){
  113.         //設定時間
  114.         uchar i;
  115.         uchar ucAddr = 0x80;
  116.         write_ds1302(0x8e,0x00);        
  117.         for(i =7;i>0;i--){
  118.                 write_ds1302(ucAddr,*pSecDa); //秒 分 時 日 月 星期 年
  119.                 pSecDa++;
  120.                 ucAddr+=2;
  121.         }
  122.         write_ds1302(0x8e,0x80);
  123. }
  124. void init_ds1302(){
  125.         //ds1302初始化
  126.         isInit_1302=read_ds1302(0x81);//讀出時鐘狀態
  127.         if(isInit_1302&0x80){//說明沒有初始化
  128.                 write_ds1302(0x8e,0x00);//關閉寫保護  以后一直開著
  129.                 write_ds1302(0x90,0xa5); //輔助電源充電命令 一個二極管  一個2K電阻
  130.                 write_ds1302(0x80,0x00);//秒 CH置0 開啟時鐘
  131.                 write_ds1302(0x82,0x59);//分
  132.                 write_ds1302(0x84,0x10);//時
  133.                 write_ds1302(0x86,0x07);//日
  134.                 write_ds1302(0x88,0x05);//月
  135.                 write_ds1302(0x8a,0x04);//星期
  136.                 write_ds1302(0x8c,0x14);//年
  137.                 write_ds1302(0x8e,0x80);
  138.         }
  139. }
  140. char int_to_char(int temp){
  141.         //把0到9對應的數字轉為字符
  142.         char x='0';
  143.         switch(temp){
  144.                 case 0:x='0';break;
  145.                 case 1:x='1';break;
  146.                 case 2:x='2';break;
  147.                 case 3:x='3';break;
  148.                 case 4:x='4';break;
  149.                 case 5:x='5';break;
  150.                 case 6:x='6';break;
  151.                 case 7:x='7';break;
  152.                 case 8:x='8';break;
  153.                 case 9:x='9';break;
  154.         }
  155.         return x;
  156. }
  157. int ds18b20_read_temp();
  158. void display(){
  159.         uchar bai,shi,ge,point,fuhao;
  160.         read_time(getTimebuf);//時時讀取時間
  161.     time[6]=(getTimebuf[0])/16+48;//格式化時間秒
  162.     time[7]=(getTimebuf[0])%16+48;

  163.     time[3]=(getTimebuf[1])/16+48;//格式化時間分
  164.     time[4]=(getTimebuf[1])%16+48;

  165.     time[0]=(getTimebuf[2])/16+48;//格式化時間小時
  166.     time[1]=(getTimebuf[2])%16+48;

  167.     date[8]=getTimebuf[3]/16+48;//格式化日期日
  168.     date[9]=getTimebuf[3]%16+48;

  169.     date[5]=getTimebuf[4]/16+48;//格式化日期月
  170.     date[6]=getTimebuf[4]%16+48;

  171.     date[2]=getTimebuf[6]/16+48;//格式化日期年
  172.     date[3]=getTimebuf[6]%16+48;

  173.     week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
  174.     week[1]=weeklist[(getTimebuf[5]%10)*3+1];
  175.     week[2]=weeklist[(getTimebuf[5]%10)*3+2];
  176.         
  177.         write_1602com(0x80+1);
  178.         for(num=0;num<10;num++){
  179.                 write_1602data(date[num]);
  180.         }

  181.         write_1602data(' ');
  182.         for(num=0;num<3;num++){
  183.                 write_1602data(week[num]);
  184.         }

  185.         write_1602com(0x80+0x40);
  186.         for(num=0;num<8;num++){
  187.                 write_1602data(time[num]);
  188.         }
  189.         
  190.         //顯示溫度值
  191.         write_1602com(0x80+0x40+8);//設置數據指針
  192.         temperature=ds18b20_read_temp();
  193.         bai=temperature/1000+0x30;
  194.         shi=temperature%1000/100+0x30;
  195.         ge=temperature%100/10+0x30;
  196.         point=temperature%100%10+0x30;
  197.         if(temp_flag==1){//說明為正數  不顯示符號位 125.6 25.7兩種
  198.                 fuhao=0x20;//顯示空白
  199.                 if(bai==0x30){
  200.                         bai=0x20;//如果百位為0  不顯示
  201.                         if(shi==0x30){
  202.                                 shi=0x20;//如果百位為0  十位也為0  都不顯示
  203.                         }
  204.                 }
  205.                 write_1602data(fuhao);
  206.                 write_1602data(bai);
  207.                 write_1602data(shi);
  208.         }else{
  209.                 fuhao=0x2d;//顯示負號  -2.5  -25.8兩種
  210.                 write_1602data(0x20);//因為負數最低到55,所以不顯示百位
  211.                 if(shi==0x30){        
  212.                         write_1602data(0x20);
  213.                         write_1602data(fuhao);
  214.                 }else{
  215.                         write_1602data(fuhao);
  216.                         write_1602data(shi);
  217.                 }
  218.         }
  219.         write_1602data(ge);
  220.         write_1602data('.');
  221.         write_1602data(point);
  222.         write_1602data(0xdf);
  223.         write_1602data('C');
  224. }
  225. void display_alarm(uchar add,int dat){
  226.         //把設定的時分顯示出來
  227.         int x,y;
  228.         x=dat/10;
  229.         y=dat%10;
  230.         write_1602com(add);
  231.         write_1602data(int_to_char(x));
  232.         write_1602com(add+1);//防止寫后地址自動向后加一  光標閃爍看不到
  233.         write_1602data(int_to_char(y));
  234.         write_1602com(add+1);
  235. }
  236. void init_alarm(){
  237.         //鬧鐘設置界面  只有首次進入才執行
  238.         uchar code x[]="SET ALARM";
  239.         uchar i;
  240.         if(alarm==0){
  241.                 write_1602com(0x01);//清屏
  242.                 write_1602com(0x80+3);//設置數據指針
  243.                 for(i=0;i<9;i++){
  244.                         write_1602data(x[i]);
  245.                 }
  246.                 display_alarm(0x80+0x40+5,shi);//載入鬧鐘的時分
  247.                 write_1602com(0x80+0x40+7);
  248.                 write_1602data(':');
  249.                 display_alarm(0x80+0x40+8,fen);
  250.                 if(isOpen){//初始化的時候如果已經設定鬧鐘則顯示ON
  251.                         write_1602com(0x80+0x40+13);
  252.                         write_1602data(' ');
  253.                         write_1602data('O');
  254.                         write_1602data('N');
  255.                 }else{
  256.                         write_1602com(0x80+0x40+13);
  257.                         write_1602data('O');
  258.                         write_1602data('F');
  259.                         write_1602data('F');
  260.                 }
  261.         }
  262. }
  263. void key_scan(){
  264.         int i;
  265.         uchar code tips1[]="SET SUCCESS";//鬧鐘設置成功的提示
  266.         uchar code tips2[]="CANCEL SUCCESS";//取消鬧鐘的提示
  267.         if(key_set_time==0){//檢測是否按下
  268.                 delay(10);//消抖
  269.                 if(key_set_time==0){//再次檢測是否按下
  270.                         while(!key_set_time);//檢測是否松開
  271.                         delay(10);//延時消抖
  272.                         while(!key_set_time);//再次檢測是否松開
  273.                         if(alarm==0){//當沒有顯示鬧鐘界面時才顯示時間設定
  274.                                 count++;
  275.                                 write_ds1302(0x80,0x80);//讓時鐘停止
  276.                                 if(count==8){
  277.                                         //繼續走時,說明時間已經設定好了
  278.                                         write_1602com(0x0c);//讓光標消失
  279.                                         write_ds1302(0x80,0);//讓時鐘繼續
  280.                                         set_time(getTimebuf);//寫入新的時間
  281.                                         count=0;
  282.                                         return;
  283.                                 }
  284.                                 switch(count){
  285.                                         case 1:
  286.                                                 write_1602com(0x80+0x40+7);//在秒的位置
  287.                                                 break;
  288.                                         case 2:
  289.                                                 write_1602com(0x80+0x40+4);//在分的位置
  290.                                                 break;
  291.                                         case 3:
  292.                                                 write_1602com(0x80+0x40+1);//在時的位置
  293.                                                 break;
  294.                                         case 4:
  295.                                                 write_1602com(0x80+14);//在星期的位置
  296.                                                 break;
  297.                                         case 5:
  298.                                                 write_1602com(0x80+10);//在日的位置
  299.                                                 break;
  300.                                         case 6:
  301.                                                 write_1602com(0x80+7);//在月的位置
  302.                                                 break;
  303.                                         case 7:
  304.                                                 write_1602com(0x80+4);//在年的位置
  305.                                                 break;
  306.                                 }
  307.                                 write_1602com(0x0f);//讓光標閃爍
  308.                         }
  309.                 }
  310.         }
  311.         if(key_add==0){//檢測是否按下
  312.                 delay(10);//消抖
  313.                 if(key_add==0){//再次檢測是否按下
  314.                         while(!key_add);//檢測是否松開
  315.                         delay(10);//延時消抖
  316.                         while(!key_add);//再次檢測是否松開
  317.                         if(count!=0){
  318.                                 switch(count){
  319.                                 case 1:
  320.                                         //在秒的位置
  321.                                         getTimebuf[0]++;
  322.                                         if(getTimebuf[0]==0x5a){
  323.                                                 getTimebuf[0]=0;
  324.                                         }
  325.                                         if(getTimebuf[0]==0x4a){
  326.                                                 getTimebuf[0]=0x50;
  327.                                         }
  328.                                         if(getTimebuf[0]==0x3a){
  329.                                                 getTimebuf[0]=0x40;
  330.                                         }
  331.                                         if(getTimebuf[0]==0x2a){
  332.                                                 getTimebuf[0]=0x30;
  333.                                         }
  334.                                         if(getTimebuf[0]==0x1a){
  335.                                                 getTimebuf[0]=0x20;
  336.                                         }
  337.                                         if(getTimebuf[0]==0x0a){
  338.                                                 getTimebuf[0]=0x10;
  339.                                         }
  340.                                         time[6]=(getTimebuf[0])/16+48;//格式化時間秒
  341.                                         time[7]=(getTimebuf[0])%16+48;
  342.                                         write_1602com(0x80+0x40+6);//在秒的位置
  343.                                         write_1602data(time[6]);
  344.                                         write_1602com(0x80+0x40+7);//在秒的位置
  345.                                         write_1602data(time[7]);
  346.                                         write_1602com(0x80+0x40+7);//讓光標在秒的位置閃爍
  347.                                         break;
  348.                                 case 2:
  349.                                         //在分的位置
  350.                                         getTimebuf[1]++;
  351.                                         if(getTimebuf[1]==0x5a){
  352.                                                 getTimebuf[1]=0;
  353.                                         }
  354.                                         if(getTimebuf[1]==0x4a){
  355.                                                 getTimebuf[1]=0x50;
  356.                                         }
  357.                                         if(getTimebuf[1]==0x3a){
  358.                                                 getTimebuf[1]=0x40;
  359.                                         }
  360.                                         if(getTimebuf[1]==0x2a){
  361.                                                 getTimebuf[1]=0x30;
  362.                                         }
  363.                                         if(getTimebuf[1]==0x1a){
  364.                                                 getTimebuf[1]=0x20;
  365.                                         }
  366.                                         if(getTimebuf[1]==0x0a){
  367.                                                 getTimebuf[1]=0x10;
  368.                                         }
  369.                                         time[3]=(getTimebuf[1])/16+48;//格式化時間分
  370.                                         time[4]=(getTimebuf[1])%16+48;
  371.                                         write_1602com(0x80+0x40+3);//在分的位置
  372.                                         write_1602data(time[3]);
  373.                                         write_1602com(0x80+0x40+4);//在分的位置
  374.                                         write_1602data(time[4]);
  375.                                         write_1602com(0x80+0x40+4);//讓光標在分的位置閃爍
  376.                                         break;
  377.                                 case 3:
  378.                                         //在時的位置
  379.                                         getTimebuf[2]++;
  380.                                         if(getTimebuf[2]==0x24){
  381.                                                 getTimebuf[2]=0;
  382.                                         }
  383.                                         if(getTimebuf[2]==0x1a){
  384.                                                 getTimebuf[2]=0x20;
  385.                                         }
  386.                                         if(getTimebuf[2]==0x0a){
  387.                                                 getTimebuf[2]=0x10;
  388.                                         }
  389.                                         time[0]=(getTimebuf[2])/16+48;//格式化時間小時
  390.                                         time[1]=(getTimebuf[2])%16+48;
  391.                                         write_1602com(0x80+0x40+0);//在小時的位置
  392.                                         write_1602data(time[0]);
  393.                                         write_1602com(0x80+0x40+1);
  394.                                         write_1602data(time[1]);
  395.                                         write_1602com(0x80+0x40+1);
  396.                                         break;
  397.                                 case 4:
  398.                                         //在星期的位置
  399.                                         getTimebuf[5]++;
  400.                                         if(getTimebuf[5]==0x08){
  401.                                                 getTimebuf[5]=0x01;
  402.                                         }
  403.                                         if((getTimebuf[5]%10)*3==21){//輪完了  重新開始
  404.                                                 week[0]=weeklist[0];
  405.                                                 week[1]=weeklist[1];
  406.                                                 week[2]=weeklist[2];
  407.                                         }else{
  408.                                                 week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
  409.                                                 week[1]=weeklist[(getTimebuf[5]%10)*3+1];
  410.                                                 week[2]=weeklist[(getTimebuf[5]%10)*3+2];
  411.                                         }
  412.                                         write_1602com(0x80+12);
  413.                                         write_1602data(week[0]);
  414.                                         write_1602com(0x80+13);
  415.                                         write_1602data(week[1]);
  416.                                         write_1602com(0x80+14);
  417.                                         write_1602data(week[2]);
  418.                                         write_1602com(0x80+14);
  419.                                         break;
  420.                                 case 5:
  421.                                         //在日的位置
  422.                                         getTimebuf[3]++;
  423.                                         if(getTimebuf[3]==0x32){
  424.                                                 getTimebuf[3]=0x01;
  425.                                         }
  426.                                         if(getTimebuf[3]==0x2a){
  427.                                                 getTimebuf[3]=0x30;
  428.                                         }
  429.                                         if(getTimebuf[3]==0x1a){
  430.                                                 getTimebuf[3]=0x20;
  431.                                         }
  432.                                         if(getTimebuf[3]==0x0a){
  433.                                                 getTimebuf[3]=0x10;
  434.                                         }
  435.                                         date[8]=(getTimebuf[3])/16+48;
  436.                                         date[9]=(getTimebuf[3])%16+48;
  437.                                         write_1602com(0x80+9);
  438.                                         write_1602data(date[8]);
  439.                                         write_1602com(0x80+10);
  440.                                         write_1602data(date[9]);
  441.                                         write_1602com(0x80+10);
  442.                                         break;
  443.                                 case 6:
  444.                                         //在月的位置
  445.                                         getTimebuf[4]++;
  446.                                         if(getTimebuf[4]==0x13){
  447.                                                 getTimebuf[4]=0x01;
  448.                                         }
  449.                                         if(getTimebuf[4]==0x0a){
  450.                                                 getTimebuf[4]=0x10;
  451.                                         }
  452.                                         date[5]=(getTimebuf[4])/16+48;
  453.                                         date[6]=(getTimebuf[4])%16+48;
  454.                                         write_1602com(0x80+6);
  455.                                         write_1602data(date[5]);
  456.                                         write_1602com(0x80+7);
  457.                                         write_1602data(date[6]);
  458.                                         write_1602com(0x80+7);
  459.                                         break;
  460.                                 case 7:
  461.                                         //在年的位置
  462.                                         getTimebuf[6]++;
  463.                                         if(getTimebuf[6]==0x9a){
  464.                                                 getTimebuf[6]=0x00;
  465.                                         }
  466.                                         if(getTimebuf[6]==0x8a){
  467.                                                 getTimebuf[6]=0x90;
  468.                                         }
  469.                                         if(getTimebuf[6]==0x7a){
  470.                                                 getTimebuf[6]=0x80;
  471.                                         }
  472.                                         if(getTimebuf[6]==0x6a){
  473.                                                 getTimebuf[6]=0x70;
  474.                                         }
  475.                                         if(getTimebuf[6]==0x5a){
  476.                                                 getTimebuf[6]=0x60;
  477.                                         }
  478.                                         if(getTimebuf[6]==0x4a){
  479.                                                 getTimebuf[6]=0x50;
  480.                                         }
  481.                                         if(getTimebuf[6]==0x3a){
  482.                                                 getTimebuf[6]=0x40;
  483.                                         }
  484.                                         if(getTimebuf[6]==0x2a){
  485.                                                 getTimebuf[6]=0x30;
  486.                                         }
  487.                                         if(getTimebuf[6]==0x1a){
  488.                                                 getTimebuf[6]=0x20;
  489.                                         }
  490.                                         if(getTimebuf[6]==0x0a){
  491.                                                 getTimebuf[6]=0x10;
  492.                                         }
  493.                                         date[2]=(getTimebuf[6])/16+48;
  494.                                         date[3]=(getTimebuf[6])%16+48;
  495.                                         write_1602com(0x80+3);
  496.                                         write_1602data(date[2]);
  497.                                         write_1602com(0x80+4);
  498.                                         write_1602data(date[3]);
  499.                                         write_1602com(0x80+4);
  500.                                         break;
  501.                                 }
  502.                         }
  503.                         if(alarm!=0){
  504.                                 switch(alarm){
  505.                                         case 1:
  506.                                                 //調節鬧鐘的開與關
  507.                                                 if(isOpen==0){
  508.                                                         isOpen=1;
  509.                                                         write_1602com(0x80+0x40+13);
  510.                                                         write_1602data(' ');
  511.                                                         write_1602data('O');
  512.                                                         write_1602data('N');
  513.                                                 }else{
  514.                                                         isOpen=0;
  515.                                                         write_1602com(0x80+0x40+13);
  516.                                                         write_1602data('O');
  517.                                                         write_1602data('F');
  518.                                                         write_1602data('F');
  519.                                                 }
  520.                                                 //防止寫后地址自動向后加一  光標閃爍看不到
  521.                                                 write_1602com(0x80+0x40+15);
  522.                                                 break;
  523.                                         case 2:
  524.                                                 //調節鬧鐘的分
  525.                                                 fen++;
  526.                                                 if(fen==60){
  527.                                                         fen=0;
  528.                                                 }
  529.                                                 display_alarm(0x80+0x40+8,fen);
  530.                                                 break;
  531.                                         case 3:
  532.                                                 //調節鬧鐘的小時
  533.                                                 shi++;
  534.                                                 if(shi==24){
  535.                                                         shi=0;
  536.                                                 }
  537.                                                 display_alarm(0x80+0x40+5,shi);
  538.                                                 break;
  539.                                 }
  540.                         }
  541.                 }
  542.         }
  543.         if(key_minus==0){//檢測是否按下
  544.                 delay(10);//消抖
  545.                 if(key_minus==0){//再次檢測是否按下
  546.                         while(!key_minus);//檢測是否松開
  547.                         delay(10);//延時消抖
  548.                         while(!key_minus);//再次檢測是否松開
  549.                         if(count!=0){
  550.                                 switch(count){
  551.                                 case 1:
  552.                                         //在秒的位置
  553.                                         getTimebuf[0]--;
  554.                                         if(getTimebuf[0]==0xff){
  555.                                                 getTimebuf[0]=0x59;
  556.                                         }
  557.                                         if(getTimebuf[0]==0x4f){
  558.                                                 getTimebuf[0]=0x49;
  559.                                         }
  560.                                         if(getTimebuf[0]==0x3f){
  561.                                                 getTimebuf[0]=0x39;
  562.                                         }
  563.                                         if(getTimebuf[0]==0x2f){
  564.                                                 getTimebuf[0]=0x29;
  565.                                         }
  566.                                         if(getTimebuf[0]==0x1f){
  567.                                                 getTimebuf[0]=0x19;
  568.                                         }
  569.                                         if(getTimebuf[0]==0x0f){
  570.                                                 getTimebuf[0]=0x09;
  571.                                         }
  572.                                         time[6]=(getTimebuf[0])/16+48;//格式化時間秒
  573.                                         time[7]=(getTimebuf[0])%16+48;
  574.                                         write_1602com(0x80+0x40+6);//在秒的位置
  575.                                         write_1602data(time[6]);
  576.                                         write_1602com(0x80+0x40+7);//在秒的位置
  577.                                         write_1602data(time[7]);
  578.                                         write_1602com(0x80+0x40+7);//讓光標在秒的位置閃爍
  579.                                         break;
  580.                                 case 2:
  581.                                         //在分的位置
  582.                                         getTimebuf[1]--;
  583.                                         if(getTimebuf[1]==0xff){
  584.                                                 getTimebuf[1]=0x59;
  585.                                         }
  586.                                         if(getTimebuf[1]==0x4f){
  587.                                                 getTimebuf[1]=0x49;
  588.                                         }
  589.                                         if(getTimebuf[1]==0x3f){
  590.                                                 getTimebuf[1]=0x39;
  591.                                         }
  592.                                         if(getTimebuf[1]==0x2f){
  593.                                                 getTimebuf[1]=0x29;
  594.                                         }
  595.                                         if(getTimebuf[1]==0x1f){
  596.                                                 getTimebuf[1]=0x19;
  597.                                         }
  598.                                         if(getTimebuf[1]==0x0f){
  599.                                                 getTimebuf[1]=0x09;
  600.                                         }
  601.                                         time[3]=(getTimebuf[1])/16+48;//格式化時間分
  602.                                         time[4]=(getTimebuf[1])%16+48;
  603.                                         write_1602com(0x80+0x40+3);//在分的位置
  604.                                         write_1602data(time[3]);
  605.                                         write_1602com(0x80+0x40+4);//在分的位置
  606.                                         write_1602data(time[4]);
  607.                                         write_1602com(0x80+0x40+4);//讓光標在分的位置閃爍
  608.                                         break;
  609.                                 case 3:
  610.                                         //在時的位置
  611.                                         getTimebuf[2]--;
  612.                                         if(getTimebuf[2]==0xff){
  613.                                                 getTimebuf[2]=0x23;
  614.                                         }
  615.                                         if(getTimebuf[2]==0x1f){
  616.                                                 getTimebuf[2]=0x19;
  617.                                         }
  618.                                         if(getTimebuf[2]==0x0f){
  619.                                                 getTimebuf[2]=0x09;
  620.                                         }
  621.                                         time[0]=(getTimebuf[2])/16+48;//格式化時間小時
  622.                                         time[1]=(getTimebuf[2])%16+48;
  623.                                         write_1602com(0x80+0x40+0);//在小時的位置
  624.                                         write_1602data(time[0]);
  625.                                         write_1602com(0x80+0x40+1);
  626.                                         write_1602data(time[1]);
  627.                                         write_1602com(0x80+0x40+1);
  628.                                         break;
  629.                                 case 4:
  630.                                         //在星期的位置
  631.                                         getTimebuf[5]--;
  632.                                         if(getTimebuf[5]==0){
  633.                                                 getTimebuf[5]=0x07;
  634.                                         }
  635.                                         if((getTimebuf[5]%10)*3==21){//輪完了  重新開始
  636.                                                 week[0]=weeklist[0];
  637.                                                 week[1]=weeklist[1];
  638.                                                 week[2]=weeklist[2];
  639.                                         }else{
  640.                                                 week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
  641.                                                 week[1]=weeklist[(getTimebuf[5]%10)*3+1];
  642.                                                 week[2]=weeklist[(getTimebuf[5]%10)*3+2];
  643.                                         }
  644.                                         write_1602com(0x80+12);
  645.                                         write_1602data(week[0]);
  646.                                         write_1602com(0x80+13);
  647.                                         write_1602data(week[1]);
  648.                                         write_1602com(0x80+14);
  649.                                         write_1602data(week[2]);
  650.                                         write_1602com(0x80+14);
  651.                                         break;
  652.                                 case 5:
  653.                                         //在日的位置
  654.                                         getTimebuf[3]--;
  655.                                         if(getTimebuf[3]==0){
  656.                                                 getTimebuf[3]=0x31;
  657.                                         }
  658.                                         if(getTimebuf[3]==0x2f){
  659.                                                 getTimebuf[3]=0x29;
  660.                                         }
  661.                                         if(getTimebuf[3]==0x1f){
  662.                                                 getTimebuf[3]=0x19;
  663.                                         }
  664.                                         if(getTimebuf[3]==0x0f){
  665.                                                 getTimebuf[3]=0x09;
  666.                                         }
  667.                                         date[8]=(getTimebuf[3])/16+48;
  668.                                         date[9]=(getTimebuf[3])%16+48;
  669.                                         write_1602com(0x80+9);
  670.                                         write_1602data(date[8]);
  671.                                         write_1602com(0x80+10);
  672.                                         write_1602data(date[9]);
  673.                                         write_1602com(0x80+10);
  674.                                         break;
  675.                                 case 6:
  676.                                         //在月的位置
  677.                                         getTimebuf[4]--;
  678.                                         if(getTimebuf[4]==0){
  679.                                                 getTimebuf[4]=0x12;
  680.                                         }
  681.                                         if(getTimebuf[4]==0x0f){
  682.                                                 getTimebuf[4]=0x09;
  683.                                         }
  684.                                         date[5]=(getTimebuf[4])/16+48;
  685.                                         date[6]=(getTimebuf[4])%16+48;
  686.                                         write_1602com(0x80+6);
  687.                                         write_1602data(date[5]);
  688.                                         write_1602com(0x80+7);
  689.                                         write_1602data(date[6]);
  690.                                         write_1602com(0x80+7);
  691.                                         break;
  692.                                 case 7:
  693.                                         //在年的位置
  694.                                         getTimebuf[6]--;
  695.                                         if(getTimebuf[6]==0xff){
  696.                                                 getTimebuf[6]=0x99;
  697.                                         }
  698.                                         if(getTimebuf[6]==0x8f){
  699.                                                 getTimebuf[6]=0x89;
  700.                                         }
  701.                                         if(getTimebuf[6]==0x7f){
  702.                                                 getTimebuf[6]=0x79;
  703.                                         }
  704.                                         if(getTimebuf[6]==0x6f){
  705.                                                 getTimebuf[6]=0x69;
  706.                                         }
  707.                                         if(getTimebuf[6]==0x5f){
  708.                                                 getTimebuf[6]=0x59;
  709.                                         }
  710.                                         if(getTimebuf[6]==0x4f){
  711.                                                 getTimebuf[6]=0x49;
  712.                                         }
  713.                                         if(getTimebuf[6]==0x3f){
  714.                                                 getTimebuf[6]=0x39;
  715.                                         }
  716.                                         if(getTimebuf[6]==0x2f){
  717.                                                 getTimebuf[6]=0x29;
  718.                                         }
  719.                                         if(getTimebuf[6]==0x1f){
  720.                                                 getTimebuf[6]=0x19;
  721.                                         }
  722.                                         if(getTimebuf[6]==0x0f){
  723.                                                 getTimebuf[6]=0x09;
  724.                                         }
  725.                                         date[2]=(getTimebuf[6])/16+48;
  726.                                         date[3]=(getTimebuf[6])%16+48;
  727.                                         write_1602com(0x80+3);
  728.                                         write_1602data(date[2]);
  729.                                         write_1602com(0x80+4);
  730.                                         write_1602data(date[3]);
  731.                                         write_1602com(0x80+4);
  732.                                         break;
  733.                                 }
  734.                         }
  735.                         if(alarm!=0){
  736.                                 switch(alarm){
  737.                                         case 1:
  738.                                                 //調節鬧鐘的開與關
  739.                                                 if(isOpen==0){
  740.                                                         isOpen=1;
  741.                                                         write_1602com(0x80+0x40+13);
  742.                                                         write_1602data(' ');
  743.                                                         write_1602data('O');
  744.                                                         write_1602data('N');
  745.                                                 }else{
  746.                                                         isOpen=0;
  747.                                                         write_1602com(0x80+0x40+13);
  748.                                                         write_1602data('O');
  749.                                                         write_1602data('F');
  750.                                                         write_1602data('F');
  751.                                                 }
  752.                                                 //防止寫后地址自動向后加一  光標閃爍看不到
  753.                                                 write_1602com(0x80+0x40+15);
  754.                                                 break;
  755.                                         case 2:
  756.                                                 //調節鬧鐘的分
  757.                                                 fen--;
  758.                                                 if(fen<0){
  759.                                                         fen=59;
  760.                                                 }
  761.                                                 display_alarm(0x80+0x40+8,fen);
  762.                                                 break;
  763.                                         case 3:
  764.                                                 //調節鬧鐘的小時
  765.                                                 shi--;
  766.                                                 if(shi<0){
  767.                                                         shi=23;
  768.                                                 }
  769.                                                 display_alarm(0x80+0x40+5,shi);
  770.                                                 break;
  771.                                 }
  772.                         }
  773.                 }
  774.         }
  775.         if(key_set_alarm==0){//檢測是否按下
  776.                 delay(10);//消抖
  777.                 if(key_set_alarm==0){//再次檢測是否按下
  778.                         while(!key_set_alarm);//檢測是否松開
  779.                         delay(10);//延時消抖
  780.                         while(!key_set_alarm);//再次檢測是否松開
  781.                         if(count==0){//時間在正常走動的時候才能設置鬧鐘
  782.                                 init_alarm();
  783.                                 alarm++;//說明進入鬧鐘設置界面
  784.                                 if(alarm==4){
  785.                                         alarm=0;//說明鬧鐘設置完畢
  786.                                         write_1602com(0x01);//清屏以便顯示時間
  787.                                         write_1602com(0x0c);//關閉光標
  788.                                         //顯示設置成功或取消的提示
  789.                                         if(isOpen){
  790.                                                 write_1602com(0x80+2);
  791.                                                 for(i=0;i<11;i++){
  792.                                                         write_1602data(tips1[i]);
  793.                                                 }
  794.                                         }else{
  795.                                                 write_1602com(0x80+1);
  796.                                                 for(i=0;i<14;i++){
  797.                                                         write_1602data(tips2[i]);
  798.                                                 }
  799.                                         }
  800.                                         //延時2ms后清屏顯示時間
  801.                                         delay(2000);
  802.                                         write_1602com(0x01);
  803.                                 }else{
  804.                                         switch(alarm){
  805.                                                 case 1:
  806.                                                         write_1602com(0x80+0x40+15);
  807.                                                         break;
  808.                                                 case 2:
  809.                                                         write_1602com(0x80+0x40+9);
  810.                                                         break;
  811.                                                 case 3:
  812.                                                         write_1602com(0x80+0x40+6);
  813.                                                         break;
  814.                                         }
  815.                                         write_1602com(0x0f);
  816.                                 }
  817.                         }
  818.                 }
  819.         }
  820. }
  821. void beep(){
  822.         //檢測鬧鐘  并且報警
  823.         if(time[0]==int_to_char(shi/10)&&time[1]==int_to_char(shi%10)&&time[3]==int_to_char(fen/10)&&time[4]==int_to_char(fen%10)){
  824.                 isRing=1;//鬧鐘響起,此時如果進入鬧鐘設置界面 改變時分,鬧鐘就關閉了
  825.                 bee=0;
  826.                 delay(250);
  827.                 bee=1;
  828.                 delay(250);
  829.         }else{
  830.                 isRing=0;//關閉鬧鐘或者一分鐘后鬧鐘自動關閉
  831.                 bee=1;
  832.         }
  833. }
  834. void delay1(int i){
  835.         while(i--);
  836. }
  837. void ds18b20_init(){
  838.         uchar x=0;
  839.         dq = 1;    //DQ復位
  840.         delay1(8);  //稍做延時
  841.         dq = 0;    //單片機將DQ拉低
  842.         delay1(80); //精確延時 大于 480us
  843.         dq = 1;    //拉高總線
  844.         delay1(14);
  845.         x=dq;      //稍做延時后 如果x=0則初始化成功 x=1則初始化失敗
  846.         delay1(20);
  847. }
  848. uchar ds18b20_read(){
  849.         //讀一個字節
  850.         uchar i=0;
  851.         uchar dat = 0;
  852.         for (i=8;i>0;i--)
  853.         {
  854.                 dq = 0; // 給脈沖信號
  855.                 dat>>=1;
  856.                 dq = 1; // 給脈沖信號
  857.                 if(dq)
  858.                         dat|=0x80;
  859.                 delay1(4);
  860.         }
  861.         return(dat);
  862. }
  863. void ds18b20_write(char dat){
  864.         //寫一個字節
  865.         uchar i=0;
  866.         for (i=8; i>0; i--)
  867.         {
  868.                 dq = 0;
  869.                 dq = dat&0x01;
  870.                 delay1(5);
  871.                 dq = 1;
  872.                 dat>>=1;
  873.         }
  874. }
  875. int ds18b20_read_temp(){
  876.         //讀取溫度
  877.         uchar low;
  878.         uchar high;
  879.         unsigned long tmp;
  880.         float value;
  881.         int t;//溫度
  882.         ds18b20_init();
  883.         ds18b20_write(0xCC); //跳過讀序列號的操作
  884.         ds18b20_write(0x44); //啟動溫度轉換
  885.         ds18b20_init();
  886.         ds18b20_write(0xCC); //跳過讀序列號的操作
  887.         ds18b20_write(0xBE); //讀取溫度寄存器  共九個  前兩個代表溫度
  888.         low=ds18b20_read();//低八位數據
  889.         high=ds18b20_read();//高八位數據

  890.         tmp=high;
  891.         tmp<<=8;
  892.         tmp=tmp|low;
  893.         //此處有正負之分
  894.         if(tmp>=63488){//ffff f000 0000 0000-->(f800)
  895.                 temp_flag=0;
  896.                 //8位全為1時,加1才進位
  897.                 if((~low)==0xff){//判斷low取反加1之后是否進位
  898.                         high=(~high)+1;
  899.                         low=0;
  900.                 }else{
  901.                         high=~high;
  902.                         low=(~low)+1;
  903.                 }
  904.                 tmp=high*256+low;
  905.         }else{
  906.                 temp_flag=1;
  907.         }
  908.         value=tmp*0.0625;
  909.         t=value*10+((temp_flag==1)?+0.5:-0.5);//放大十倍輸出并四舍五入
  910.         return t;
  911. }
  912. void main(){
  913.         init_1602();
  914.         init_ds1302();
  915.         while(1){
  916.                 if(isOpen){//只有開啟鬧鐘的時候才檢測
  917.                         beep();//不斷檢測鬧鐘
  918.                 }
  919.                 key_scan();
  920.                 if(count==0&&alarm==0){//沒有設定時間  也沒有在鬧鐘界面的時候時間才顯示
  921.                         display();
  922.                 }
  923.         }
  924. }
復制代碼
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 午夜免费电影院 | 成人在线精品视频 | 日韩视频一区在线观看 | av黄色片 | 91精品国产一区二区在线观看 | 国产日韩久久久久69影院 | 久久久久久久久久久久亚洲 | 亚洲精品一区二区三区在线观看 | 欧州一区 | 久久综合伊人 | 国产精品美女 | 欧美日韩在线观看一区 | 欧美一级做a爰片免费视频 国产美女特级嫩嫩嫩bbb片 | 亚洲精品日韩在线观看 | 色婷婷精品 | a在线免费观看视频 | 91精品久久久久久久久久小网站 | 精品国产第一区二区三区 | 久久精品视频免费观看 | 中文字幕av一区二区三区 | 狠狠躁躁夜夜躁波多野结依 | 91成人在线视频 | 国产免费黄网 | 久久久久久亚洲 | 久久福利 | 日韩精品专区在线影院重磅 | 国产精品成人国产乱 | 国产午夜精品理论片a大结局 | 中文在线观看视频 | 99色综合| 99精品一级欧美片免费播放 | 久久精品二区 | 精品国产精品国产偷麻豆 | 欧美在线观看一区二区 | 久久久精品一区二区三区 | 天天插天天操 | 色爱区综合 | 日韩一级免费观看 | 国产综合一区二区 | 欧美日韩国产在线 | 国产成人久久精品 |