找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9028|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

用51單片機(jī)設(shè)計(jì)小時(shí)候帶的簡易電子表(含源碼)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:369060 發(fā)表于 2018-8-8 18:19 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
學(xué)了51,模仿了小時(shí)候電子手表的基本功能,可以在時(shí)鐘和秒表兩個(gè)功能間切換,用的是郭天祥的板子。采用四個(gè)獨(dú)立按鍵,通過對四個(gè)鍵按下的次數(shù)不同,實(shí)現(xiàn)不同的功能,程序詳注。(第一次嘗試很多地方未免復(fù)雜冗余,希望大神指點(diǎn))

/*使用1602作為電子表的顯示屏,單片機(jī)上電后,首先通過按鍵設(shè)定當(dāng)前時(shí)間,
完成初始化,同時(shí)該電子表還具有秒表功能,按下秒表鍵后,進(jìn)入秒表界面。秒
表界面有開始,取次,停止,復(fù)位,返回時(shí)間,可以記錄三次取時(shí),每個(gè)按鈕按
下都對應(yīng)蜂鳴器短響一聲進(jìn)入秒表界面,時(shí)間繼續(xù)運(yùn)行,在時(shí)間界面,秒表處于
復(fù)位狀態(tài)。*/

單片機(jī)源程序如下:
  1. /*......................................................................................*/
  2. #include<reg52.h>
  3. sbit lcden=P3^4;              //使能端                                                   
  4. sbit lcdrs=P3^5;              //RS                                                            
  5. sbit dula=P2^6;               //定義鎖存器的鎖存端         
  6. sbit wela=P2^7;
  7. sbit s1=P3^0;                 //定義按鍵----功能鍵
  8. sbit s2=P3^1;                                  //定義按鍵-----增加鍵
  9. sbit s3=P3^2;                                  //定義按鍵------計(jì)次鍵
  10. sbit s4=P3^3;                                  //定義按鍵------鐘與秒表的切換鍵
  11. sbit rd=P3^7;                                  //初始化函數(shù)中使它接地從而使第四列矩陣鍵盤成為獨(dú)立鍵盤                                                      
  12. sbit beep=P2^3;                                  //定義蜂鳴器
  13. char count,count1,s1num,s2num,s3num,s4num,stop, miao,shi,                               //stop保證在秒表工作模式下,定時(shí)器0的數(shù)值不會(huì)被送去lcd顯示。      count,count1是用到定時(shí)器里面,   *num是用來計(jì)按鍵次數(shù),miao*,shi*,fen*
  14. fen,miao1,shi1,fen1,miao3,fen3,shi3,miao4,fen4,shi4,miao5,                                   //是用來保持lcd上的顯示的,結(jié)合下面應(yīng)該可以看懂。
  15. fen5,shi5,miao6,fen6,shi6,miao7,fen7,shi7,miao8,fen8,shi8,
  16. miao9,fen9,shi9;                           //char表示的數(shù)據(jù)范圍-127~128     
  17. void delay(int z)             //延時(shí)子函數(shù)
  18. {
  19.         int x,y;
  20.         for(x=z;x>0;x--)
  21.                 for(y=110;y>0;y--);
  22. }
  23. void xiang()                  //蜂鳴器發(fā)聲函數(shù)
  24. {
  25.         beep=0;
  26.         delay(20);
  27.         beep=1;
  28. }
  29. void write_com(char com)      //寫命令子函數(shù)
  30. {
  31.         lcdrs=0;
  32.         P0=com;
  33.         delay(5);
  34.         lcden=1;
  35.         delay(5);
  36.         lcden=0;
  37. }

  38. void write_date(char date)    //寫數(shù)據(jù)子函數(shù)
  39. {
  40.         lcdrs=1;
  41.         P0=date;
  42.         delay(5);
  43.         lcden=1;
  44.         delay(5);
  45.         lcden=0;
  46. }
  47. void write_sfm(unsigned char add,unsigned char date)  //寫時(shí)分秒函數(shù)
  48. {
  49.         unsigned char shi,ge;
  50.         shi=date/10;              //分解一個(gè)2位數(shù)的十位和個(gè)位
  51.         ge=date%10;
  52.         write_com(0x80+0x40+add); //設(shè)置顯示位置
  53.         write_date(0x30+shi);     //送去液晶顯示十位
  54.         write_date(0x30+ge);      //送去液晶顯示個(gè)位
  55. }
  56. void init()                   //初始化函數(shù)
  57. {
  58.         rd=0;                     //軟件將矩陣按鍵第四列一端置低用來分離出獨(dú)立按鍵
  59.         dula=0;
  60.         wela=0;                          //關(guān)閉鎖存器,防止數(shù)碼管分流,影響1602的顯示
  61.         lcden=0;
  62.         fen=0;                    //初始化鐘變量值
  63.         miao=0;
  64.         shi=0;
  65.         count=0;
  66.         count1=0;
  67.         s1num=0;
  68.         s2num=0;
  69.         s3num=0;
  70.         s4num=0;
  71.         write_com(0x38);                 //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)口
  72.         write_com(0x0c);                 //開顯示,不開光標(biāo)  00001100
  73.         write_com(0x06);                 //寫字符后地址指針自動(dòng)加一,不移動(dòng) 00000110
  74.         write_com(0x01);                 //清除屏幕上原有的亂碼
  75.         write_com(0x80+0x04);         //從第一行的第五個(gè)字符位開始顯示
  76.         write_com(0x80+0x40+6);  //在第二行第第七個(gè)字符處寫入 “ :”
  77.         write_date(':');
  78.         delay(5);
  79.         write_com(0x80+0x40+9);  //在第二行第第十個(gè)字符處寫入 “ :”
  80.         write_date(':');
  81.         delay(5);
  82.         write_sfm(10,miao);
  83.         write_sfm(7,fen);
  84.         write_sfm(4,shi);
  85.         TMOD=0X11;                //設(shè)置定時(shí)器0的工作模式1;
  86.         TH0=(65536-50000)/256;    //裝初值
  87.         TL0=(65536-50000)%256;
  88.         EA=1;                     //打開總中斷
  89.         ET0=1;                    //開定時(shí)器0中斷
  90.         TR0=1;                    //啟動(dòng)定時(shí)器0
  91. }
  92. void init_stopwatch()                  //初始化秒表
  93. {
  94.         write_com(0x01);
  95.         miao1=0;
  96.         fen1=0;
  97.         shi1=0;
  98.         write_com(0x80+0x40+6);  //在第二行第第七個(gè)字符處寫入 “ :”
  99.         write_date(':');
  100.         delay(5);
  101.         write_com(0x80+0x40+9);  //在第二行第第十個(gè)字符處寫入 “ :”
  102.         write_date(':');
  103.         delay(5);
  104.         write_sfm(10,miao1);
  105.         write_sfm(7,fen1);
  106.         write_sfm(4,shi1);                           //TMOD=0x10;錯(cuò)誤處:采用兩個(gè)定時(shí)器時(shí),一次設(shè)置工作模式就行                                                  
  107.         TH1=(65536-50000)/256;
  108.         TL1=(65536-50000)%256;
  109.         EA=1;
  110.         ET1=1;
  111.         TR1=0;
  112. }
  113. void keyscan()                //鍵盤掃描函數(shù)
  114. {         
  115.         if(s1==0)                                  //判斷s1是否被按下
  116.         {
  117.                 delay(5);
  118.                 if(s1==0)                          //確實(shí)被按下
  119.                 {

  120.                         while(!s1);                  //按鍵抬起,
  121.                         xiang();                  //蜂鳴器響
  122.                         s1num++;                  //功能鍵被按下次數(shù)
  123.                         if(s1num==1)          //第一次被按下時(shí)
  124.                         {

  125.                         }
  126.                         if(s1num==2)          //第二次被按下時(shí)
  127.                         {
  128.                                 TR0=0;                                           //關(guān)閉定時(shí)器
  129.                                 write_com(0x80+0x40+10);   //指針定到秒的地址  
  130.                                 write_com(0x0f);                   //指針開始閃爍
  131.                         }
  132.                         if(s1num==3)                                        //第三次被按下時(shí)
  133.                         {
  134.                                 write_com(0x80+0x40+7);                //指針定位到分的地址               
  135.                         }
  136.                         if(s1num==4)                                        //第四次被按下時(shí)
  137.                         {
  138.                                 write_com(0x80+0x40+4);                //指針定位到時(shí)的地址               
  139.                         }
  140.                         if(s1num==5)                                        //第五次被按下時(shí)
  141.                         {      
  142.                                 s1num=0;                                        //清零
  143.                                 write_com(0x0c);                        //關(guān)閉光標(biāo)
  144.                                 TR0=1;                                                //打開定時(shí)器
  145.                         }                                                                                       
  146.                 }

  147.         }
  148.          if(s1num==1)
  149.          {
  150.                  if(s4==0)                                                   //切換到定時(shí)器模式
  151.                 {
  152.                         delay(5);                                       
  153.                         if(s4==0);
  154.                         s4num++;
  155.                         while(!s4);
  156.                         xiang();                                        //s4確實(shí)被按下
  157.                         if(s4num==1)
  158.                         {
  159.                                 stop=1;
  160.                                 init_stopwatch();               
  161.                         }
  162.                         if(s4num==2)
  163.                         {
  164.                                 TR1=0;
  165.                                 stop=0;
  166.                                 s4num=0;
  167.                                 write_sfm(10,(miao3+miao4));
  168.                                 write_sfm(7,(fen3+fen4));
  169.                                 write_sfm(4,(shi3+shi4));
  170.                               
  171.                         }
  172.                 }
  173.          }
  174.          if(s1num==1)
  175.          {
  176.                  if(s2==0)
  177.                 {
  178.                         delay(5);
  179.                         if(s2==0)
  180.                         {
  181.                                 while(!s2);
  182.                                 xiang();
  183.                                 s2num++;
  184.                                 if(s2num==1)
  185.                                 {
  186.                                         TR1=1;
  187.                                 }
  188.                                 if(s2num==2)
  189.                                 {
  190.                                         s2num=0;
  191.                                         TR1=0;
  192.                                 }
  193.                         }
  194.                 }
  195.          }
  196.          if(s2num==1&&s4num==1)
  197.        {      if(s3==0)
  198.                         {
  199.                                 delay(5);
  200.                                 if(s3==0)
  201.                                 {
  202.                                         s3num++;
  203.                                         while(!s3);
  204.                                     xiang();
  205.                                         if(s3num==1)
  206.                                         {
  207.                                                 shi6=shi5;
  208.                                                 fen6=fen5;
  209.                                                 miao6=miao5;      
  210.                                         }
  211.                                         if(s3num==2)
  212.                                         {
  213.                                                 shi7=shi5;
  214.                                                 fen7=fen5;
  215.                                                 miao7=miao5;
  216.                                         }
  217.                                         if(s3num==3)
  218.                                         {
  219.                                                 shi8=shi5;
  220.                                                 fen8=fen5;
  221.                                                 miao8=miao5;
  222.                                         }
  223.                                         if(s3num==4)
  224.                                         {
  225.                                                 miao1=0;
  226.                                                 fen1=0;
  227.                                                 shi1=0;
  228.                                                 write_sfm(10,miao1);
  229.                                                 write_sfm(7,fen1);
  230.                                                 write_sfm(4,shi1);
  231.                                                 TR1=0;
  232.                                         }
  233.                                         if(s3num==5)
  234.                                         {
  235.                                                 write_sfm(10,miao6);
  236.                                                 write_sfm(7,fen6);
  237.                                                 write_sfm(4,shi6);      
  238.                                         }
  239.                                         if(s3num==6)
  240.                                         {
  241.                                                 write_sfm(10,miao7);
  242.                                                 write_sfm(7,fen7);
  243.                                                 write_sfm(4,shi7);
  244.                                         }
  245.                                         if(s3num==7)
  246.                                         {
  247.                                                 write_sfm(10,miao8);
  248.                                                 write_sfm(7,fen8);
  249.                                                 write_sfm(4,shi8);
  250.                                         }
  251.                                         if(s3num==8)
  252.                                         {
  253.                                                 s3num=0;
  254.                                                 init_stopwatch();
  255.                                         }
  256.                                 }
  257.                         }
  258.                 }
  259.      if(s1num!=0)                                                         //若是s1被按過
  260.          {         
  261.                  if(s2==0)                                                         //s2被按下
  262.                 {
  263.                         delay(5);
  264.                         if(s2==0)                                                 //s2確實(shí)被按下
  265.                         {
  266.                                  while(!s2);                                         //如果s2抬起
  267.                             xiang();                                         //蜂鳴器響
  268.                                 if(s1num==2)                                 //此時(shí)若是s1被按了一次
  269.                                 {
  270.                                         miao++;                                         //秒加一
  271.                                         miao4=miao;
  272.                                         if(miao==60)                         //如果秒等于60
  273.                                         miao=0;
  274.                                         miao4=miao;                                 //清零
  275.                                         write_com(0x80+0x40+10);
  276.                                         write_sfm(10,miao);
  277.                                 }
  278.                                  if(s1num==3)
  279.                                  {
  280.                                           fen++;
  281.                                         fen4=fen;
  282.                                         if(fen==60)
  283.                                         fen=0;
  284.                                         fen4=fen;
  285.                                         write_com(0x80+0x40+7);
  286.                                         write_sfm(7,fen);
  287.                                  }
  288.                                  if(s1num==4)
  289.                                  {
  290.                                           shi++;
  291.                                         shi4=shi;
  292.                                         if(shi==24)
  293.                                         shi=0;
  294.                                         shi4=shi;
  295.                                         write_com(0x80+0x40+4);
  296.                                         write_sfm(4,shi);                                       
  297.                                  }
  298.                         }
  299.                 }
  300.                
  301.          }
  302. }
  303. void main()
  304. {
  305.         init();                                             //初始化1602
  306.         while(1)
  307.         {
  308.                 keyscan();                          //一直掃描鍵盤
  309.         }
  310. }
  311. void timer0() interrupt 1         //定時(shí)器0用于鐘表
  312. {
  313.         TH0=(65536-50000)/256;         //裝初值
  314.         TL0=(65536-50000)%256;
  315.         count++;                                  //計(jì)數(shù),保證每20次中斷一次,時(shí)長為一秒
  316.         if(count==20)
  317.         {
  318.                  count=0;
  319.                 miao++;
  320.                 miao3=miao;
  321.                 if(miao==60)                   //將更新的秒時(shí)分的值更新到1602
  322.                 {
  323.                          miao=0;
  324.                         miao3=miao;
  325.                         fen++;
  326.                         fen3=fen;
  327.                         if(fen==60)
  328.                         {      
  329.                             fen=0;
  330.                                 fen3=fen;
  331.                                 shi++;
  332.                                 shi3=shi;
  333.                                 if(shi==24)
  334.                                 {
  335.                                         shi=0;
  336.                                         shi3=shi;
  337.                                 }
  338.                                 if(stop==0)                                           //在秒表模式,鐘表的時(shí)間不顯示,但是任然計(jì)時(shí)
  339.                                 write_sfm(4,shi);
  340.                         }
  341.                         if(stop==0)
  342.                         write_sfm(7,fen);

  343.                 }   
  344.                 if(stop==0)               
  345.                 write_sfm(10,miao);
  346.         }               
  347. }
  348. void timer1() interrupt 3         //定時(shí)器1用于秒表計(jì)時(shí)
  349. {
  350.         TH1=(65536-50000)/256;
  351.         TL1=(65536-50000)%256;
  352.         count1++;
  353.         if(count1==20)
  354.         {
  355.                 count1=0;
  356.                 miao1++;
  357.                 miao5=miao1;
  358.                 if(miao1==60)
  359.                 {
  360.                         miao1=0;
  361.                         miao5=miao1;
  362.                         fen1++;
  363.                         fen5=fen1;
  364.                         if(fen1==60)
  365.                         {
  366.                                 fen1=0;
  367.                                 fen5=fen1;
  368.                                 shi1++;
  369.                                 shi5=shi1;
  370.                                 if(shi1==24)
  371.                                 {
  372.                                         shi1=0;
  373.                                         shi5=shi1;
  374.                                 }
  375.                                         write_sfm(4,shi1);
  376.                         }
  377.                         write_sfm(7,fen1);
  378.                 }
  379.                 write_sfm(10,miao1);
  380.         }                       
  381. }
復(fù)制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評分

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

使用道具 舉報(bào)

沙發(fā)
ID:292119 發(fā)表于 2018-8-10 14:16 | 只看該作者
怎么沒有圖,沒有真相呀
回復(fù)

使用道具 舉報(bào)

板凳
ID:369060 發(fā)表于 2018-8-14 11:47 | 只看該作者
songyuan 發(fā)表于 2018-8-10 14:16
怎么沒有圖,沒有真相呀

忘記拍照了,要想嘗試的話可以發(fā)給你
回復(fù)

使用道具 舉報(bào)

地板
ID:386147 發(fā)表于 2018-8-14 12:56 來自手機(jī) | 只看該作者
就是沒有圖
回復(fù)

使用道具 舉報(bào)

5#
ID:444232 發(fā)表于 2018-12-11 16:52 | 只看該作者
樓主,這個(gè)程序?qū)?yīng)的圖可以發(fā)給我么,自己畫了張圖但就是用不了
回復(fù)

使用道具 舉報(bào)

6#
ID:444232 發(fā)表于 2018-12-11 16:55 | 只看該作者
樓主,你那個(gè)電子表程序的圖可以發(fā)給我么,自己畫了張圖不能用
回復(fù)

使用道具 舉報(bào)

7#
ID:591211 發(fā)表于 2019-12-7 15:48 | 只看該作者
求圖,/流淚
回復(fù)

使用道具 舉報(bào)

8#
ID:702219 發(fā)表于 2020-3-4 12:19 | 只看該作者
手表的可以發(fā)個(gè)圖嗎。。我想試試
回復(fù)

使用道具 舉報(bào)

9#
ID:669286 發(fā)表于 2020-12-28 20:28 | 只看該作者
可以發(fā)個(gè)圖嗎
回復(fù)

使用道具 舉報(bào)

10#
ID:872086 發(fā)表于 2021-1-2 12:35 | 只看該作者
sbit lcden=P3^4;              //使能端                                                   
sbit lcdrs=P3^5;              //RS                                                            
sbit dula=P2^6;               //定義鎖存器的鎖存端         
sbit wela=P2^7;
請問這幾句命令是什么意思,比如這是什么使能端
回復(fù)

使用道具 舉報(bào)

11#
ID:822201 發(fā)表于 2021-1-3 12:44 | 只看該作者
lmyuan 發(fā)表于 2021-1-2 12:35
sbit lcden=P3^4;              //使能端                                                   
sbit lcdr ...

這是定義鎖存器吧
回復(fù)

使用道具 舉報(bào)

12#
ID:589491 發(fā)表于 2021-1-3 16:47 | 只看該作者
lmyuan 發(fā)表于 2021-1-2 12:35
sbit lcden=P3^4;              //使能端                                                   
sbit lcdr ...

lcd1602的使能
lcdd1602的rs端
下面2局就是數(shù)碼管的鎖存,因數(shù)碼管與LCD1602共用P0端口
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表