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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5210|回復(fù): 3
收起左側(cè)

單片機1602智能電子鐘源程序+Proteus仿真

  [復(fù)制鏈接]
ID:371844 發(fā)表于 2019-7-30 16:14 | 顯示全部樓層 |閱讀模式
程序初始化為系統(tǒng)時間,顯示于LCD1602,可以使用按鈕修改時間,并與系統(tǒng)同步。
程序可能有一點點缺陷,感興趣的朋友可以繼續(xù)完善。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)

智能電子鐘

智能電子鐘


單片機源程序如下:
  1. #include<reg51.h>               
  2. typedef    unsigned char uchar;
  3. typedef    unsigned int  uint;  
  4. uchar code table[]= " 2019/07/17/Tue  ";
  5. uchar code table1[]="    12/05/10     ";
  6. uchar code table2[]={"Tus"};
  7. sbit RS=P2^0;
  8. sbit RW=P2^1;
  9. sbit E=P2^2;
  10. sbit K1=P1^0;
  11. sbit K2=P1^1;
  12. sbit K3=P1^2;
  13. sbit K4=P1^3;
  14. sbit RST=P2^5;
  15. sbit SCK=P2^6;
  16. sbit IO=P2^7;
  17. char shi,fen,miao,flag,dat,ri,yue,nian,xingqi;
  18. void write_ds(uchar add,uchar date);
  19. //延遲
  20. void delay(uchar z)
  21. {
  22.     uchar x,y;
  23.     for(x=z;x>0;x--)
  24.         for(y=10;y>0;y--);
  25. }
  26. //P0口寫操作,先寫地址,再寫數(shù)據(jù)
  27. void write_com(uchar com)
  28. {
  29.     RS=0;
  30.     RW=0;
  31.     P0=com;
  32.     E=1;
  33.     delay(3);
  34.     E=0;
  35. }
  36. void write_date(uchar date)
  37. {
  38.     RS=1;
  39.     RW=0;
  40.     P0=date;
  41.     E=1;
  42.     delay(3);
  43.     E=0;
  44. }
  45. //LCD顯示初始化
  46. void init_lcd()
  47. {
  48.     uchar num;
  49.     write_com(0X38);
  50.     write_com(0X0C);
  51.     write_com(0X06);
  52.     write_com(0X80);
  53.     for(num=0;num<16;num++)
  54.     {
  55.         write_date(table[num]);
  56.         delay(5);        
  57.     }
  58.     write_com(0x80+0x40);
  59.     for(num=0;num<20;num++)
  60.     {
  61.         write_date(table1[num]);
  62.         delay(5);        
  63.     }
  64. }
  65. //LCD顯示
  66. void display1(uchar add,uchar date)      //第一行顯示
  67. {
  68.     uchar temp,shi,ge;
  69.     temp=date;
  70.     shi=temp/16;
  71.     ge=temp%16;
  72.     write_com(0x80+add);
  73.     write_date(0x30+shi);              //這里要注意,顯示的是ASCII碼!
  74.     write_date(0x30+ge);
  75. }
  76. void display(uchar add,uchar date)      //第二行顯示
  77. {
  78.     uchar temp,shi,ge;
  79.     temp=date;
  80.     shi=temp/16;
  81.     ge=temp%16;
  82.     write_com(0x80+0x40+add);
  83.     write_date(0x30+shi);                //這里要注意,顯示的是ASCII碼!
  84.     write_date(0x30+ge);
  85. }
  86. //鍵盤掃描
  87. void keyscan()
  88. {
  89.     static unsigned char num;
  90.     K1=0;
  91.     //光標(biāo)移動(入口地址)
  92.     if(K2==0)
  93.         {
  94.           delay(5);
  95.             if(K2==0)
  96.               {
  97.                 while(!K2);
  98.                 delay(5);
  99.                 while(!K2);
  100.                 num++;
  101.                 flag=1;
  102.               }//異常重要!!!!
  103.             if(num==1)
  104.             {
  105.                 write_com(0X80+0X40+11);
  106.                 write_com(0X0F);
  107.             }
  108.             if(num==2)
  109.             {
  110.                 write_com(0X80+0X40+8);
  111.                 write_com(0X0F);
  112.             }
  113.             if(num==3)
  114.             {
  115.                 write_com(0X80+0X40+5);
  116.                 write_com(0X0F);
  117.             }
  118.             if(num==4)
  119.             {
  120.                 write_com(0x80+10);
  121.                 write_com(0x0f);
  122.             }
  123.             if(num==5)
  124.             {
  125.                 write_com(0x80+7);
  126.                 write_com(0x0f);
  127.             }
  128.             if(num==6)
  129.             {
  130.                 write_com(0x80+4);
  131.                 write_com(0x0f);
  132.             }
  133.             if(num==7)
  134.             {
  135.                 num=0;
  136.                 write_com(0X0C);                        
  137.                 write_ds(0x80,miao);      //要在最后一次性寫入,時分和分針定時的時候秒針還在走。
  138.                 write_ds(0x82,fen);
  139.                 write_ds(0x84,shi);
  140.                 write_ds(0x86,ri);
  141.                 write_ds(0x88,yue);
  142.                 write_ds(0x8A,nian);
  143.                 flag=0;        
  144.             }
  145.             }   
  146.             //修改時間,增加1
  147.             if(K3==0)  
  148.               {      
  149.                 delay(5);
  150.                 if(K3==0)
  151.                   {
  152.                     while(!K3);
  153.                     delay(5);
  154.                     while(!K3);
  155.                     //修改秒
  156.                     if(num==1)
  157.                       {
  158.                         uchar ge,shi;
  159.                         miao++;
  160.                         shi=miao/16;
  161.                         ge=miao%16;
  162.                         //秒的修整
  163.                         if(ge>=10)              
  164.                           {
  165.                              ge=0;
  166.                              shi++;
  167.                              if(shi==6){shi=0;}
  168.                           }
  169.                         //顯示修整值
  170.                         miao=shi*16+ge;
  171.                         display(10,miao);
  172.                         write_com(0x80+0x40+11);//把光標(biāo)位置移回來。
  173.                         write_ds(0x80,miao);
  174.                     }
  175.                 //修改分鐘
  176.                 if(num==2)
  177.                     {
  178.                         uchar ge,shi;
  179.                         fen++;
  180.                         shi=fen/16;
  181.                         ge=fen%16;
  182.                         if(ge>=10)
  183.                           {
  184.                             ge=0;
  185.                             shi++;
  186.                             if(shi==6){shi=0;}
  187.                           }
  188.                         fen=shi*16+ge;
  189.                         display(7,fen);
  190.                         write_com(0x80+0x40+8);
  191.                         write_ds(0x82,fen);
  192.                     }
  193.                 //修改小時
  194.                 if(num==3)
  195.                     {
  196.                         uchar ge,shi1;
  197.                         shi++;                        
  198.                         shi1=shi/16;
  199.                         ge=shi%16;
  200.                         if(ge>=10)
  201.                           {
  202.                             ge=0;
  203.                             shi1++;
  204.                           }
  205.                         if((shi1==2)&&(ge==4))
  206.                           {
  207.                             shi1=0;
  208.                             ge=0;
  209.                           }
  210.                         shi=shi1*16+ge;
  211.                         display(4,shi);
  212.                         write_com(0x80+0x40+5);
  213.                         write_ds(0x84,shi);
  214.                      }
  215.                   }           
  216.               }
  217.             //修改時間,減少1
  218.             if(K4==0)   
  219.               {
  220.                 delay(5);
  221.                 if(K4==0)
  222.                   {
  223.                     while(!K4);
  224.                     delay(5);
  225.                     while(!K4);
  226.                     //修改秒
  227.                     if(num==1)
  228.                       {
  229.                         uchar ge,shi;
  230.                         miao--;
  231.                         shi=miao/16;
  232.                         ge=miao%16;
  233.                         //減法0之后應(yīng)該是9,而不是“?”
  234.                         if(ge==0x0f){ge=9;}
  235.                         //修改時間,當(dāng)?shù)竭_(dá)0后,再減的話是-1
  236.                         if(ge==-1)
  237.                           {
  238.                             shi=5;
  239.                             ge=9;   
  240.                           }
  241.                         miao=shi*16+ge;                                                
  242.                         display(10,miao);
  243.                         write_com(0x80+0x40+11);
  244.                         write_ds(0x80,miao);
  245.                       }
  246.                     //修改分鐘
  247.                     if(num==2)
  248.                       {
  249.                         uchar ge,shi;
  250.                         fen--;
  251.                         shi=fen/16;
  252.                         ge=fen%16;
  253.                         if(ge==0x0f){ge=9;}
  254.                         if(ge==-1)
  255.                           {
  256.                             shi=5;
  257.                             ge=9;
  258.                           }
  259.                            fen=shi*16+ge;
  260.                         display(7,fen);
  261.                         write_com(0x80+0x40+8);
  262.                         write_ds(0x82,fen);
  263.                       }
  264.                     //修改小時
  265.                     if(num==3)
  266.                       {
  267.                         uchar ge,shi1;
  268.                         shi--;
  269.                         shi1=shi/16;
  270.                         ge=shi%16;
  271.                         if(ge==0x0f){ge=9;}
  272.                         if(ge==-1)
  273.                           {
  274.                             shi1=2;
  275.                             ge=3;
  276.                           }
  277.                         shi=shi1*16+ge;
  278.                         display(4,shi);
  279.                         write_com(0x80+0x40+5);
  280.                         write_ds(0x84,shi);
  281.                       }        
  282.                  }
  283.              }
  284. }
  285. //DS1302
  286. void write_ds(uchar add,uchar date)
  287. {
  288.     uchar num;
  289.     RST=0;//復(fù)位
  290.     delay(1);
  291.     SCK=0;
  292.     delay(1);
  293.     RST=1;//關(guān)閉復(fù)位,開始傳輸
  294.     delay(1);
  295.     for(num=0;num<8;num++)
  296.      {
  297.        IO=add&0x01;//地址從低位開始傳送
  298.        add>>=1;
  299.        //date=date<<1;
  300.        //IO=CY;
  301.        SCK=1;
  302.        delay(1);
  303.        SCK=0;
  304.        delay(1);
  305.      }
  306.     for(num=0;num<8;num++)
  307.      {
  308.        IO=date&0x01;//數(shù)據(jù)從低位開始傳送
  309.        date>>=1;
  310.        //date=date<<1;
  311.        //IO=CY;
  312.        SCK=1;
  313.        delay(1);
  314.        SCK=0;
  315.        delay(1);
  316.      }
  317.     RST=0;//傳輸結(jié)束,復(fù)位
  318.     delay(5);
  319. }
  320. uchar read_ds(uchar add)
  321. {                     
  322.     uchar num,temp,date;
  323.     RST=0;//復(fù)位
  324.     delay(1);
  325.     SCK=0;
  326.     delay(1);
  327.     RST=1;
  328.     delay(1);     
  329.     for(num=0;num<8;num++)//先寫入地址
  330.      {
  331.         IO=add&0x01;//數(shù)據(jù)從低位開始傳送
  332.         add>>=1;
  333.         //date=date<<1;
  334.         //IO=CY;
  335.         SCK=1;
  336.         delay(1);
  337.         SCK=0;
  338.         delay(1);
  339.      }
  340.     delay(2);
  341.     for(num=0;num<8;num++)   
  342.      {
  343.         temp=IO;
  344.         date=(date>>1)|(temp<<7);
  345.         SCK=1;
  346.         delay(1);
  347.         SCK=0;
  348.         delay(1);
  349.     }
  350.     RST=0;
  351.     delay(1);
  352.     SCK=1;
  353.     delay(1);
  354.     IO=0;
  355.     delay(1);
  356.     IO=1;
  357.     delay(1);
  358.     return date;
  359. }
  360. //LCD初始更新為系統(tǒng)時間
  361. void init_ds()
  362. {
  363.     miao=read_ds(0x81);
  364.     display(10,miao);   
  365.     fen=read_ds(0x83);
  366.     display(7,fen);
  367.     shi=read_ds(0x85);
  368.     display(4,shi);
  369.     ri=read_ds(0x87);
  370.     display1(9,ri);
  371.     yue=read_ds(0x89);
  372.     display1(6,yue);
  373.     //xingqi=read_ds(0x8B);
  374.     //display(12,table2[]);
  375.     nian=read_ds(0x8D);
  376.     display1(3,nian);
  377. }
  378. void set_time()
  379. {
  380.     write_ds(0x80,0x10);//設(shè)置初始時間秒;
  381.     write_ds(0x82,0x10);//設(shè)置初始時間分;
  382.     write_ds(0x84,0x14);//設(shè)置初始時間時;
  383.     write_ds(0x86,0x22);//設(shè)置初始時間日;
  384.     write_ds(0x88,0x03);//設(shè)置初始時間月;
  385.     write_ds(0x8a,0x03);//設(shè)置初始時間星期;
  386.     write_ds(0x8c,0x15);//設(shè)置初始時間年;
  387. }
  388. void main()
  389. {                                 
  390.     flag=0;   
  391.     write_ds(0x8e,0x00);
  392.     init_lcd();
  393.     while(1)              
  394.     {   
  395.       keyscan();
  396.       if(flag==0){init_ds();}
  397.     }
  398. }

復(fù)制代碼

全部資料51hei下載地址:
智能電子鐘.zip (323.42 KB, 下載次數(shù): 125)
回復(fù)

使用道具 舉報

ID:846830 發(fā)表于 2020-11-24 11:26 | 顯示全部樓層
P1.0按了沒反應(yīng)啊
回復(fù)

使用道具 舉報

ID:852768 發(fā)表于 2020-12-2 21:14 | 顯示全部樓層
請問為什么修改"table1[]"的數(shù)值,對應(yīng)仿真顯示與設(shè)置的不一樣呢?但是修改table[]的就是正常的,這其中有什么奧秘嗎?期待各位大佬的幫助指導(dǎo)。
回復(fù)

使用道具 舉報

ID:939260 發(fā)表于 2021-6-17 18:56 | 顯示全部樓層
寫的真好
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区成人 | 国产精品久久久久久久久久免费 | 乱一性一乱一交一视频a∨ 色爱av | 成人福利片 | 欧美日韩在线免费观看 | 一区二区三区免费看 | 欧美一区二区免费视频 | 在线视频一区二区 | 国产精品免费小视频 | 亚洲二区视频 | 久久精品视频12 | 国产精品一区二区视频 | av一区在线 | 香蕉久久久久久 | 国产午夜精品一区二区三区四区 | 欧美成人激情 | 美女日批免费视频 | 欧美日韩视频在线第一区 | 亚洲福利在线观看 | 国产影音先锋 | 久久蜜桃av | www.性色 | 日本三级网站在线 | 亚洲一区二区在线播放 | 欧美日韩一区在线观看 | 国产综合久久久久久鬼色 | 日韩在线小视频 | 久久亚洲二区 | 久久成人国产精品 | 日韩中文字幕在线视频 | 日韩一区二区三区精品 | 欧州一区二区三区 | 欧美日韩一区二区在线观看 | 国产激情片在线观看 | 国产成人在线一区二区 | 国产最好的av国产大片 | 精品视频一区二区三区在线观看 | 亚洲免费精品 | 国产黄a一级 | 亚洲精选久久 | 五月天国产视频 |