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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC89c52rc單片機4位數碼時鐘,4個按鍵是怎么設置時間的? 求幫助

[復制鏈接]
跳轉到指定樓層
樓主
ID:476064 發表于 2019-4-1 15:43 來自手機 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
手里有這個單片機也想做一個,但是仿真時 圖上的4個按鍵是怎么設置時間的?有知道的大神說下

ourdev_714824ELCVI2.JPG (272.97 KB, 下載次數: 72)

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

使用道具 舉報

來自 3#
ID:164602 發表于 2019-4-2 08:12 | 只看該作者
肯定沒人能說的!因為你的問題不完整!
你的電路,必須配合你的程序。
你都在問是電路問題還是程序問題,程序呢?
從你的電路上看,你的時鐘,只是使用定時器,沒有專門的時間芯片,應該很簡單。你說設置不了,我也沒辦法。
發程序來看看吧
回復

使用道具 舉報

沙發
ID:476064 發表于 2019-4-2 01:18 來自手機 | 只看該作者
沒人回答 不知道是程序問題還是我電路問題,就是設置不了時間這是在網上找的,也不知道是哪位大神之作。麻煩幫我修改下, 不求多么準!只求能正常運行和調整 !(我仿真時4個按鍵無用)
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. #define DispOFF 10;        //顯示關
  5. #define POINT 21;        //顯示小點
  6. #define F 22;
  7. #define H 23;
  8. #define M 24;
  9. #define N 25;
  10. #define O 26;
  11. sbit buzzer=P3^7;        //蜂鳴器控制腳
  12. uchar T2Count;
  13. uint T0Count;
  14. uchar key,key_new,key_old,KeyPressTime;
  15. uchar status;
  16. uchar month,day,hour,min,sec,AlarmHr,AlarmMin;
  17. uchar LastDay;
  18. uchar AlmTime,AlmCount,DispTime;
  19. uchar CountHr,CountMin,CountSec,CountSetSta=0;
  20. uint year;
  21. bit TimeAdj,AlarmAdj,AlarmSta;
  22. bit adjust,DigiBit;
  23. //數碼管顯示代碼
  24. uchar code LedCode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,
  25.                       0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x7f,
  26.                       0x8e,0x89,0xc8,0xab,0xa3
  27.                      };
  28. uchar Disp[4];
  29. void LedScan(void);
  30. void KeyScan(void);
  31. void years(void);
  32. void date(void);
  33. void timer(void);
  34. void alarmClock(void);
  35. void CountDown(void);
  36. void ring(void);
  37. uchar DaysCount(void);
  38. void Init(void)
  39. {
  40. TH2=0x3c;TL2=0xb0;
  41. RCAP2H=0x3c;RCAP2L=0xb0;
  42. EA=1;ET2=1;
  43. TR2=1;
  44. TMOD=0x01;
  45. //TH0=0x3c;
  46. //TL0=0xb0;
  47. ET0=1;
  48. P1=0xff;
  49. year=2011;
  50. month=1;
  51. day=1;
  52. hour=0;
  53. min=0;
  54. status=2;
  55. buzzer=1;
  56. }
  57. /************主函數*************/
  58. void main(void)
  59. {
  60. Init();
  61. while(1)
  62.    {
  63.     KeyScan();
  64.     LastDay=DaysCount();
  65.         switch(status)        //顯示狀態                                
  66.              {
  67.                   case 0:years();break;                        //顯示年
  68.                   case 1:date();break;                        //顯示日期
  69.                   case 2:timer();break;                        //顯示時間
  70.           case 3:alarmClock();break;        //顯示鬧鐘時間
  71.                   case 4:CountDown();break;                //顯示倒計時
  72.          }
  73.     LedScan();        
  74.     ring();
  75.    }
  76. }

  77. /***************定時器T0中斷函數,用于倒計時**************/
  78. void timer0(void) interrupt 1 using 2
  79. {TH0=0x3c;
  80. TL0=0xb0;
  81. T0Count++;
  82. if(CountHr||CountMin||CountSec)
  83.          {if(T0Count==20)
  84.                  {CountSec--;T0Count=0;}
  85.          if(CountSec>=60)
  86.                  {CountSec=59;CountMin--;}
  87.          if(CountMin>=60)
  88.                  {CountMin=59;CountHr--;}
  89.          }
  90. if(T0Count==1200)
  91.          {TR0=0;
  92.          T0Count=0;
  93.         }
  94. }
  95. /**************定時器T2中斷函數,用于計時**************/
  96. void timer2(void) interrupt 5 using 1
  97. {
  98. TF2=0;
  99. if(++T2Count==20)
  100.    {sec++;T2Count=0;}
  101. if(!TimeAdj)        //時間調整時,暫停計時
  102.          {if(sec==60)
  103.                    {min++;sec=0;}
  104.           if(min==60)
  105.                    {hour++;min=0;}
  106.           if(hour==24)
  107.                    {day++;hour=0;}
  108.           if(day>LastDay)
  109.                    {month++;day=1;}
  110.           if(month>12)
  111.             {year++;month=1;}
  112.         }
  113. }

  114. void delay(uchar x)
  115. {
  116. uchar k;
  117. while(x--)
  118.       for(k=0;k<123;k++);
  119. }
  120. /***********數碼管掃描顯示函數***************/
  121. void LedScan(void)
  122. {
  123. uchar i;
  124. uchar temp=0x08;
  125. for(i=0;i<4;i++)
  126.     {
  127.      P0=LedCode[Disp[i]];        //送段碼
  128.      P2=~temp;temp>>=1;                //LED顯示位控制
  129.      delay(3);                                //延時
  130.          P2=0xff;                                //關顯示
  131.     }
  132. }
  133. /**********按鍵掃描程序***************/
  134. void KeyScan(void)
  135. {
  136. if((P1&0x0f)!=0x0f)                //如果按下按鍵
  137.    {if(KeyPressTime>0)                //延時
  138.           {
  139.            switch(~(P1|0xf0))        //判斷鍵值
  140.              {
  141.               case 0x01:key_new=1;break;
  142.               case 0x02:key_new=2;break;
  143.               case 0x04:key_new=3;break;
  144.                           case 0x08:key_new=4;break;
  145.                          }
  146.           }
  147.         KeyPressTime++;                        //按鍵時間加1
  148.    }
  149. else                                                //如果沒有按鍵按下
  150.    {key_new=0;                                //鍵值清零
  151.     KeyPressTime=0;                        //按鍵時間清零
  152.    }
  153. if(key_new!=key_old)                //如果前后兩次鍵值不同
  154.     {key=key_new;                        //鍵值等于本次鍵值
  155.         }
  156. else                                                //如果前后兩次鍵值相同(按住按鍵未釋放)
  157.    {key=0;                                        //鍵值清零
  158.     if(KeyPressTime>100)        //按鍵時間大于100,差不多1秒(作長按鍵處理)
  159.           {KeyPressTime-=30;        //按鍵時間減30,當累加到100再次動作,相當于300毫秒按鍵一次,
  160.            key=key_new;                        //得到本次鍵值
  161.           }
  162.    }
  163. key_old=key_new;                   //記住本次鍵值
  164. }
  165. /***********計算本月有多少天**************/
  166. uchar DaysCount(void)                                                        
  167. {
  168. if(month==4||month==6||month==9||month==11)                //4、6、9、11月為30天
  169.    return 30;
  170. else if(month!=2)                                                                //1、3、5、7、8、10、12月為31天
  171.         return 31;
  172. if(month==2)
  173.   {if((year%4==0&&year%100!=0)||(year%400==0))
  174.       return 29;                                                                //閏年2月為29天
  175.    else
  176.       return 28;                                                                //非閏年2月為28天
  177.   }
  178. }
  179. /**************年函數**************/
  180. void years(void)
  181. {
  182. if(adjust)                //設置,調整年
  183.    {
  184.         switch(key)        //處理按鍵
  185.                 {case 1:{
  186.                              year++;                //年加1
  187.                                  break;
  188.                                 }
  189.                  case 2:{
  190.                                  year--;                //年減1
  191.                  break;
  192.                                 }
  193.                  case 3:{
  194.                                  adjust=0;                //退出設置
  195.                                  DispTime=0;
  196.                                  break;
  197.                                  }
  198.             }
  199.    }
  200. else
  201.    {
  202.     if(key==2) status++;                //顯示狀態加1,進入日期顯示
  203.         if(key==3) adjust=1;                //進入設置
  204.         if(++DispTime==200)                        //顯示時間加1,系統默認顯示時間,通過按鍵切換其他顯示一段時間后自動返回時間顯示
  205.                  {status=2;                                //利用程序循環執行一次的時間作延時,每循環一次DispTime+1,加到200后退出返回時間顯示
  206.                   DispTime=0;                        //DispTime清零
  207.                 }
  208.    }
  209. Disp[0]=year/1000;                                //年份千位
  210. Disp[1]=year/100%10;                        //年份百位
  211. Disp[2]=year/10%10;                        //年份十位
  212. Disp[3]=year%10;                                //年份個位
  213. if(T2Count<=10)
  214.    {if(adjust)                                        //如果調整年份,顯示閃爍
  215.             Disp[0]=Disp[1]=Disp[2]=Disp[3]=DispOFF;                                 
  216.    }
  217. }
  218. /***********日期函數***************/
  219. void date(void)
  220. {
  221. if(adjust)        //調整日期
  222.    {
  223.         switch(key)
  224.             {case 1:{
  225.                                  if(DigiBit==0) month++;        //月加1
  226.                                  else day++;                                //日加1
  227.                  if(month>12) month=1;                //月大于12,月份等于1
  228.                                  if(day>LastDay) day=1;                //日大于本月最后一日,日等于1
  229.                                  break;
  230.                                 }
  231.                  case 2:{
  232.                                  if(DigiBit==0) month--;        //月減1
  233.                                  else day--;                                //日減1
  234.                                  if(month==0) month=12;                //月=0,月份=12
  235.                                  if(day==0) day=LastDay;        //日=0,日等于本月最后一天
  236.                  break;
  237.                                 }
  238.                  case 3:{
  239.                                  DigiBit=~DigiBit;                        //月、日設置選擇切換
  240.                                  if(DigiBit==0)                                //DigiBit=0 選擇月 DigiBit=1 選擇日
  241.                                           {adjust=0;                                
  242.                                          DispTime=0;
  243.                                         }
  244.                                  break;
  245.                                 }
  246.                 }                        
  247.    }
  248. else
  249.    {
  250.         if(key==1) {status--;DispTime=0;}                //顯示年,顯示時間清零重新計算
  251.     if(key==2) status++;                                        //顯示時間
  252.         if(key==3) adjust=1;                                        //進入設置
  253.         if(++DispTime==200)                                                //顯示時間到,返回時間顯示
  254.                  {status=2;
  255.                   DispTime=0;
  256.                 }
  257.    }
  258. Disp[0]=month/10;
  259. Disp[1]=month%10;
  260. Disp[2]=day/10;
  261. Disp[3]=day%10+11;
  262. if(T2Count<=10)
  263.    {if(adjust)
  264.            {
  265.            if(!DigiBit)                        //如果調整日,日顯示閃爍
  266.              {
  267.                   Disp[0]=DispOFF;
  268.                   Disp[1]=DispOFF;
  269.                  }
  270.            else                                        //如果調整月,月顯示閃爍
  271.                  {
  272.                   Disp[2]=DispOFF;
  273.                   Disp[3]=POINT;
  274.                  }
  275.           }                                         
  276.    }
  277. }
  278. /**************時間函數****************/
  279. void timer(void)
  280. {
  281. if(TimeAdj)        //調整時間
  282.    {
  283.         switch(key)
  284.                 {case 1:{                        //up/加 按鍵
  285.                                  if(DigiBit==0) hour++;        //根據按鍵選擇時間、分鐘加調整
  286.                                  else min++;
  287.                  if(hour==24) hour=0;
  288.                                  if(min==60) min=0;
  289.                                  break;
  290.                                 }
  291.                  case 2:{                        //down 減 按鍵
  292.                                  if(DigiBit==0) hour--;        //時間、分鐘減調整
  293.                                  else min--;
  294.                                  if(hour>=24) hour=23;
  295.                                  if(min>=60) min=59;
  296.                  break;
  297.                                 }
  298.                  case 3:{
  299.                                  DigiBit=~DigiBit;                //DigiBit=0 小時,DigiBit=1 分鐘
  300.                                  if(DigiBit==0)                 //時間設置完后,秒清零,定時器重新計時
  301.                                          {sec=0;
  302.                                          TR2=0;
  303.                                          TH2=0x3c;TL2=0xb0;
  304.                                          T2Count=0;
  305.                                          TR2=1;
  306.                                          TimeAdj=0;
  307.                                         }
  308.                                  break;
  309.                                 }
  310.                    }
  311.    }
  312. else
  313.    {
  314.         if(key==1) {status--;DispTime=0;}
  315.     if(key==2) {status++;DispTime=80;}//進入鬧鐘顯示,顯示時間初始值為80
  316.         if(key==3) TimeAdj=1;
  317.    }
  318. Disp[0]=hour/10;
  319. Disp[1]=hour%10;
  320. Disp[2]=min/10+11;
  321. Disp[3]=min%10+11;
  322. if(T2Count<=10)
  323.    {if(TimeAdj)
  324.            {
  325.            if(!DigiBit)
  326.                  {
  327.                   Disp[0]=DispOFF;
  328.                   Disp[1]=DispOFF;
  329.                  }
  330.            else
  331.                  {
  332.                   Disp[2]=POINT;
  333.                   Disp[3]=POINT;
  334.                  }
  335.           }
  336.         else
  337.           {
  338.            Disp[2]=min/10;
  339.            Disp[3]=min%10;        
  340.            }
  341.    }
  342. }
  343. /*************鬧鐘函數***************/
  344. void alarmClock(void)
  345. {Disp[0]=AlarmHr/10;
  346. Disp[1]=AlarmHr%10;
  347. Disp[2]=AlarmMin/10+11;
  348. Disp[3]=AlarmMin%10+11;
  349. if(DispTime<80)//顯示時間<80,顯示鬧鐘開關狀態,顯示時間>=80,顯示鬧鐘時間
  350.          {if(AlarmSta)
  351.                 {Disp[0]=DispOFF;
  352.                  Disp[1]=DispOFF;
  353.                  Disp[2]=O;
  354.                  Disp[3]=N;
  355.                 }
  356.          else
  357.                  {Disp[0]=DispOFF;
  358.                  Disp[1]=O;
  359.                  Disp[2]=F;
  360.                  Disp[3]=F;
  361.                 }
  362.         }
  363. if(AlarmAdj)//設置鬧鐘時間
  364.    {
  365.         switch(key)
  366.                 {case 1:{
  367.                                  if(DigiBit==0) AlarmHr++;
  368.                                  else AlarmMin++;
  369.                  if(AlarmHr==24) AlarmHr=0;
  370.                                  if(AlarmMin==60) AlarmMin=0;
  371.                                  break;
  372.                                 }
  373.                  case 2:{
  374.                                  if(DigiBit==0) AlarmHr--;
  375.                                  else AlarmMin--;
  376.                                  if(AlarmHr>=24) AlarmHr=23;
  377.                                  if(AlarmMin>=60) AlarmMin=59;
  378.                  break;
  379.                                 }
  380.                  case 3:{
  381.                                  DigiBit=~DigiBit;
  382.                                  if(DigiBit==0)
  383.                                          {AlarmAdj=0;
  384.                                          DispTime=80;
  385.                                         }
  386.                                  break;
  387.                                 }
  388.                 }
  389.     if(T2Count<=10)
  390.           {
  391.            if(!DigiBit)
  392.                  {
  393.                   Disp[0]=DispOFF;
  394.                   Disp[1]=DispOFF;
  395.                  }
  396.            else
  397.               {
  398.                    Disp[2]=POINT;
  399.                    Disp[3]=POINT;
  400.                   }
  401.       }
  402.    }
  403. else
  404.    {
  405.         if(key==1) status--;
  406.     if(key==2)
  407.             {status++;
  408.                  DispTime=0;
  409.                 }
  410.         if(key==3) AlarmAdj=1;
  411.         if(key==4)//鬧鐘開關按鍵
  412.                 {if(DispTime<80)                //初次按下,顯示上次設置狀態
  413.                         AlarmSta=~AlarmSta;        //再按可改變設置
  414.                  DispTime=0;//每按一次,顯示時間清零,顯示鬧鐘開關狀態
  415.                 }
  416.         DispTime++;
  417.         if(DispTime==255)
  418.                 {status=2;
  419.                  DispTime=0;
  420.                 }
  421.    }

  422. }
  423. /**************倒計時函數*****************/
  424. void CountDown(void)
  425. {
  426. if(adjust)//設置倒數時間
  427.    {
  428.         switch(CountSetSta)
  429.                 {case 0:{//設置倒數小時
  430.                                  if(key==1) CountHr++;
  431.                                  if(key==2) CountHr--;
  432.                                  if(key==3) CountSetSta++;
  433.                                  if(CountHr==100) CountHr=0;
  434.                                  if(CountHr>100) CountHr=99;
  435.                                  Disp[0]=H;
  436.                                  Disp[1]=DispOFF;
  437.                                  Disp[2]=CountHr/10;
  438.                                  Disp[3]=CountHr%10;
  439.                                  break;
  440.                                 }
  441.                  case 1:{//設置倒數分鐘
  442.                                  if(key==1) CountMin++;
  443.                                  if(key==2) CountMin--;
  444.                                  if(key==3) CountSetSta++;
  445.                                  if(CountMin==60) CountMin=0;
  446.                                  if(CountMin>60) CountMin=59;
  447.                                  Disp[0]=M;
  448.                                  Disp[1]=DispOFF;
  449.                                  Disp[2]=CountMin/10;
  450.                                  Disp[3]=CountMin%10;
  451.                                  break;
  452.                                 }
  453.                  case 2:{//設置倒數秒
  454.                                  if(key==1) CountSec++;
  455.                                  if(key==2) CountSec--;
  456.                                  if(key==3) //設置鍵
  457.                                          {if(CountHr||CountMin||CountSec)//設置完成后,若倒數的時、分、秒不為零,倒計時開始
  458.                                                 {TH0=0x3c; TL0=0xb0;
  459.                                                  T0Count=0;
  460.                                                   TR0=1;
  461.                                                 }
  462.                                          CountSetSta=0;
  463.                                          adjust=0;
  464.                                          DispTime=0;
  465.                                         }
  466.                                  if(CountSec==60) CountSec=0;
  467.                                  if(CountSec>60) CountSec=59;
  468.                                  Disp[0]=5;
  469.                                  Disp[1]=DispOFF;
  470.                                  Disp[2]=CountSec/10;
  471.                                  Disp[3]=CountSec%10;
  472.                                  break;
  473.                                 }
  474.                 }
  475.    }
  476. else
  477.    {
  478.         if(key==1)                //進入鬧鐘顯示
  479.                 {status--;
  480.                  DispTime=80;
  481.                 }
  482.         if(key==3)                //設置倒數時間
  483.                  {
  484.                  TR0=0;
  485.                   CountHr=CountMin=CountSec=0;
  486.                  adjust=1;
  487.                   }
  488.         if(key==4)                //停止倒計時
  489.                 {TR0=0;
  490.                  CountHr=CountMin=CountSec=0;
  491.                 }
  492.         if(CountHr==0)        //若倒數時間小于1小時,倒計時顯示分鐘、秒
  493.                  {Disp[0]=CountMin/10;
  494.                  Disp[1]=CountMin%10;
  495.                  Disp[2]=CountSec/10+11;
  496.                  Disp[3]=CountSec%10+11;
  497.             }
  498.          else                        //若倒數時間大于1小時,倒計時顯示小時、分鐘
  499.                  {Disp[0]=CountHr/10;
  500.                  Disp[1]=CountHr%10;
  501.                  Disp[2]=CountMin/10+11;
  502.                  Disp[3]=CountMin%10+11;
  503.                 }
  504.         if(T2Count<=10)//倒計時顯示閃爍
  505.                          Disp[0]=Disp[1]=Disp[2]=Disp[3]=DispOFF;
  506.         if(!TR0)                //倒計時完成后,顯示一段時間后退出
  507.                 {if(++DispTime==200)
  508.                         {status=2;
  509.                          DispTime=0;
  510.                         }
  511.                   
  512.                 }
  513.           }
  514. }
  515. /*****************鬧鈴控制********************/
  516. void ring(void)
  517. {bit StopFlag;
  518. if((hour==AlarmHr&&min==AlarmMin&&AlarmSta)||(CountHr==0&&CountMin==0&&CountSec==0)&TR0)//鬧鐘時間到或倒數時間到,鬧鈴響
  519.    {
  520.     if(key==4&status!=3)
  521.                    StopFlag=~StopFlag;
  522.     if(!AlarmAdj&&!StopFlag)
  523.             {AlmTime++;                //計時,程序循環一次加1
  524.              if(AlmTime<=8)        //時間0-8
  525.                         buzzer=0;        //蜂鳴器響(有源蜂鳴器,接通就響,斷開就停)
  526.                  if(AlmTime>8)        //時間8-16
  527.                         buzzer=1;        //蜂鳴器停
  528.                  if(AlmTime==16)
  529.                         {if(++AlmCount!=4)//循環4次
  530.                                 AlmTime=0;
  531.                         }
  532.                  if(AlmTime==30)//延時一定時間重復上述動作,使蜂鳴器發出嘀、嘀、嘀、嘀的報警聲。
  533.                         {AlmTime=0;
  534.                           AlmCount=0;
  535.                         }
  536.                 }
  537.         else
  538.                 {buzzer=1;
  539.                  
  540.                 }
  541.    }
  542. else
  543.          {buzzer=1;
  544.          StopFlag=0;
  545.          AlmTime=0;
  546.          AlmCount=0;
  547.         }
  548. }
復制代碼


回復

使用道具 舉報

地板
ID:230559 發表于 2019-4-2 10:00 | 只看該作者
程序配合四個按鍵:移位選定、確認、上鍵、下鍵。
回復

使用道具 舉報

5#
ID:503018 發表于 2019-4-2 10:39 | 只看該作者
#include
#define uchar unsigned char
uchar code shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0};//0 1 2 3 4 5 6 7 8 9 0
uchar code shuza[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0xc0};//0 1 2 3 4 5 0
uchar ss,dd,ff,gg,zz;
uchar qq,ww,ee,rr,tt;
uchar z,x,qw,qe,qr,as,fe;
sbit a=P2^0;//鎖存器1
sbit b=P2^1;//鎖存器2
sbit c=P2^2;//鎖存器3
sbit d=P2^3;//鎖存器4
sbit e=P2^4;//秒燈
sbit f=P2^5;//時間指示燈
sbit g=P2^6;//設置指示燈
sbit h=P2^7;//....
sbit i=P1^0;//時間設置按鍵
sbit j=P1^1;//返回
sbit k=P1^2;//加
sbit l=P1^3;//減
sbit m=P1^4;//定時設置
sbit y=P1^5;//啟動定時
void ys();

    void main()
{
EA=1;      //打開總中斷
TH0=(65535-50000)/256;  //定時器復初值
TL0=(65535-50000)%256;
ET0=1;      //
TR0=1;      //啟動定時器
P0=0xc0;
P2=0xff;
P2=0xd0;
  while(1)
{f=0;g=1;
    if(i==0)//設置時間 判斷
  {g=0;f=1;
  while(1)
{if(j==0){break;}
  if(i==0){ys();if(i==0){while(i==0){if(i==1){x++;break;}}}}
  if(x==5){x=1;}if(x==0){x=1;}

      if(x==1)
  {if(k==0){ys();if(k==0){ss++;if(k==0)if(ss==10){ss=0;}}} if(l==0){ys();if(l==0){if(ss==0){ss=10;}ss--;}}
  a=1;P0=0x7f;P0=shuzi[ss];a=0; }
  
   if(x==2)
  {if(k==0){ys();if(k==0){dd++;if(k==0)if(dd==6){dd=0;}}} if(l==0){ys();if(l==0){if(dd==0){dd=6;}dd--;}}
  b=1;P0=0x7f;P0=shuza[dd];b=0; }
  
   if(x==3)
  {if(k==0){ys();if(k==0){ff++;if(k==0)if(ff==10){ff=0;}}} if(l==0){ys();if(l==0){if(ff==0){ff=10;}ff--;}}
  c=1;P0=0x7f;P0=shuzi[ff];c=0; }
  
   if(x==4)
  {if(k==0){ys();if(k==0){gg++;if(k==0)if(gg==3){gg=0;}}} if(l==0){ys();if(l==0){if(gg==0){gg=3;}gg--;}}
  d=1;P0=0x7f;P0=shuzi[gg];d=0; }

     }
  }  //設置時間完

          if(m==0)//定時 判斷
  {g=0;f=0;as=1;
  while(1)
{if(j==0){as=0;break;}
  if(m==0){ys();if(m==0){while(m==0){if(m==1){x++;break;}}}}
  if(x==5){x=1;}if(x==0){x=1;}

      if(x==1)
  {if(k==0){ys();if(k==0){qq++;if(k==0)if(qq==10){qq=0;}}} if(l==0){ys();if(l==0){if(qq==0){qq=10;}qq--;}}a=1;P0=0x7f;P0=shuzi[qq];a=0; }
  
   if(x==2)
  {if(k==0){ys();if(k==0){ww++;if(k==0)if(ww==6){ww=0;}}} if(l==0){ys();if(l==0){if(ww==0){ww=6;}ww--;}} b=1;P0=0x7f;P0=shuza[ww];b=0;  }
  
   if(x==3)
  {if(k==0){ys();if(k==0){ee++;if(k==0)if(ee==10){ee=0;}}} if(l==0){ys();if(l==0){if(ee==0){ee=10;}ee--;}}c=1;P0=0x7f;P0=shuzi[ee];c=0; }
  
   if(x==4)
  {if(k==0){ys();if(k==0){rr++;if(k==0)if(rr==3){rr=0;}}} if(l==0){ys();if(l==0){if(rr==0){rr=3;}rr--;}}d=1;P0=0x7f;P0=shuzi[rr];d=0;}

     }
  }  //定時時間完
  if(y==0)//啟動定時功能
  {while(1){if(y==1){h=!h;if(h==0){fe=1;}if(h==1){fe=0;}break;}}}
if(fe==1)
{if(gg==rr){if(ff==ee){if(dd==ww){if(ss==qq){ g=0;f=0;;ys();g=1;f=1;ys(); }}}}}

     }
}
void zhongduan() interrupt 1  //中斷函
{  TH0=(65535-50000)/256;  //定時器復初值
  TL0=(65535-50000)%256;
  z++;
    if(z==80)
  {z=0;
    e=!e;
zz++;
if(zz==120){zz=0;ss++;}
  if(ss==10){ss=0;dd++;}
  if(dd==6){dd=0;ff++;}
  if(ff==10){ff=0;gg++;}

      if(gg==2) {if(ff>=4){ff=0;gg=0;}}
  if(gg>=3) {gg=0;}
    if(rr==2) {if(ee>=4){ee=0;rr=0;}}
  if(rr>=3) {rr=0;}
  
if(as==0)
{P0=shuzi[ss];a=1;a=0;
    P0=shuza[dd];b=1;b=0;
    P0=shuzi[ff];c=1;c=0;
    P0=shuzi[gg];d=1;d=0;
}
if(as==1)
  { a=1;P0=shuzi[qq];a=0;
    b=1;P0=shuza[ww];b=0;
    c=1;P0=shuzi[ee];c=0;
    d=1;P0=shuzi[rr];d=0;
  }
    }

    }
void ys()
{for(qw=255;qw>0;qw--)
for(qe=255;qe>0;qe--);
for(qw=255;qw>0;qw--)
for(qe=50;qe>0;qe--);
}
回復

使用道具 舉報

6#
ID:213173 發表于 2019-4-2 11:22 | 只看該作者
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

  1. //K1鍵調整選擇,K2鍵+,長按連+,K3鍵-,長按連-,K4鍵鬧鐘設置
  2. //定時器初始化程序根據晶振頻率選擇
  3. #include <reg51.h>
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. //#define key_S 300                                        //宏定義短按(約20ms)實物
  7. //#define key_L 6000                                        //宏定義長按(約2/3s)
  8. //#define key_M 3000                                        //宏定義長按(約1/3s)
  9. #define key_S 100                                        //宏定義短按(約20ms)仿真
  10. #define key_L 2000                                        //宏定義長按(約2/3s)
  11. #define key_M 1000                                        //宏定義長按(約1/3s)
  12. sbit K1 = P1^0;                                                //走時時間調整選擇/退出
  13. sbit K2 = P1^1;                                                //++,長按連+
  14. sbit K3 = P1^2;                                                //--,長按連-
  15. sbit K4 = P1^3;                                                //鬧鐘時間調整選擇/退出
  16. sbit wela1=P2^0;                                        //位選1
  17. sbit wela2=P2^1;                                        //位選2
  18. sbit wela3=P2^2;                                        //位選3
  19. sbit wela4=P2^3;                                        //位選4
  20. sbit Buzzer=P3^7;                                        //蜂鳴器
  21. uchar code table[]={//共陽數碼管段碼"0~f-."
  22.                 0xc0,0xf9,0xa4,0xb0,
  23.                 0x99,0x92,0x82,0xf8,
  24.                 0x80,0x90,0x88,0x83,
  25.                 0xc6,0xa1,0x86,0x8e,0xbf,0x7f};
  26. uint Cnt200us;                                                //定義200微秒變量
  27. uchar hour=12,min=0,sec=0;                        //定義時、分、秒變量
  28. uchar hour4=0,min4=0;                                //定義鬧鐘時、分變量
  29. uchar  Choice=0,Choice4=0;                        //調整走時的選擇變量、設置鬧鐘的選擇變量
  30. bit Buzzer_sign;                                        //蜂鳴器鬧鐘標志
  31. bit Twinkle,second=1;                                //閃爍標志、秒標志
  32. /**************************************
  33.         定時器0初始化程序 @12.000MHz
  34. **************************************/
  35. void Timer_Init(void)
  36. {
  37.         TMOD= 0x02;                        //設置定時器模式
  38.         TL0 = 0x38;                        //設置定時初值200微秒
  39.         TH0 = 0x38;                        //設置定時重載值200微秒
  40.         TR0 = 1;                        //定時器0開始計時
  41.         EA=1;                                //開總中斷
  42.         ET0=1;                                //開定時器1中斷
  43. }
  44. /***************************************
  45.         定時器0初始化程序 @11.0592MHz
  46. ***************************************/
  47. /*
  48. void Timer_Init()
  49. {
  50.         TMOD = 0x02;                //設置自動重載模式
  51.         TL0 = 0x48;                        //設置定時初值200微秒
  52.         TH0 = 0x48;                        //設置定時重載值200微秒
  53.         TR0 = 1;                        //定時器0開始計時
  54.         EA=1;                                //開總中斷
  55.         ET0=1;                                //開定時器1中斷
  56. }*/
  57. /*************************
  58.           按鍵掃描程序
  59. *************************/
  60. void key_scan()
  61. {
  62.         static bit key1_sign,key4_sign;        //按鍵自鎖標志變量
  63.         static uint count1,count2,count3=0,count4=0;//消抖計數變量                       

  64.         if(!K1)                                                        //檢測按鍵1按下
  65.         {
  66.                 count1++;                                        //消抖計數1自+1
  67.                 if((count1>=key_S)&&(key1_sign==0))//檢測消抖計數與按鍵1自鎖標志
  68.                 {                       
  69.                         key1_sign=1;                        //按鍵1自鎖標志置1
  70.                         Choice++;                                //調整選擇變量自+1
  71.                         if(Choice>=3)                        //調整時間選擇0正常走時,1調時,2調分
  72.                         {
  73.                                 Choice=0;                        //調整時間選擇清0
  74.                                 Cnt200us=0;                        //時間變量Cnt200us清0
  75.                                 sec=0;
  76.                         }
  77.                 }
  78.         }
  79.         else
  80.         {
  81.                 key1_sign=0;                                //按鍵1自鎖標志清0
  82.                 count1=0;                                        //消抖計數count1清0
  83.         }
  84.                                
  85.         if(!K2)   
  86.         {  
  87.                 count2++;  
  88.                 if(count2>=key_L)                        //長按快調
  89.                 {
  90.                         if(Choice==1)                        //選擇變量1調時
  91.                         {
  92.                                 hour++;
  93.                                 if(hour>=24)
  94.                                         hour=0;
  95.                         }
  96.                         if(Choice==2)                        //選擇變量2調分
  97.                         {
  98.                                 min++;
  99.                                 if(min>=60)
  100.                                         min=0;
  101.                         }
  102.                         if(Choice4==1)                        //選擇變量1調時
  103.                         {
  104.                                 hour4++;
  105.                                 if(hour4>=24)
  106.                                         hour4=0;
  107.                         }
  108.                         if(Choice4==2)                        //選擇變量2調分
  109.                         {
  110.                                 min4++;
  111.                                 if(min4>=60)
  112.                                         min4=0;
  113.                         }
  114.                         count2=key_M;
  115.                 }
  116.         }  
  117.         else                                                        //按鍵抬起
  118.         {  
  119.                 if(count2>key_S && count2<key_L)//短按
  120.                 {
  121.                         if(Choice==1)                        //選擇變量1調時
  122.                         {
  123.                                 hour++;
  124.                                 if(hour>=24)
  125.                                         hour=0;
  126.                         }
  127.                         if(Choice==2)                        //選擇變量2調分
  128.                         {
  129.                                 min++;
  130.                                 if(min>=60)
  131.                                         min=0;
  132.                         }
  133.                         if(Choice4==1)                        //選擇變量1調時
  134.                         {
  135.                                 hour4++;
  136.                                 if(hour4>=24)
  137.                                         hour4=0;
  138.                         }
  139.                         if(Choice4==2)                        //選擇變量2調分
  140.                         {
  141.                                 min4++;
  142.                                 if(min4>=60)
  143.                                         min4=0;
  144.                         }
  145.                 }
  146.                 count2=0;                                        //count2清0
  147.         }   
  148.         if(!K3)   
  149.         {  
  150.                 count3++;  
  151.                 if(count3>=key_L)                        //長按
  152.                 {
  153.                         if(Choice==1)                        //選擇變量
  154.                         {
  155.                                 hour--;
  156.                                 if(hour>=24)
  157.                                         hour=23;
  158.                         }
  159.                         if(Choice==2)                        //選擇變量
  160.                         {
  161.                                 min--;
  162.                                 if(min>=60)
  163.                                         min=59;
  164.                         }
  165.                         if(Choice4==1)                        //選擇變量
  166.                         {
  167.                                 hour4--;
  168.                                 if(hour4>=24)
  169.                                         hour4=23;
  170.                         }
  171.                         if(Choice4==2)                        //選擇變量
  172.                         {
  173.                                 min4--;
  174.                                 if(min4>=60)
  175.                                         min4=59;
  176.                         }
  177.                         count3=key_M;
  178.                 }
  179.         }  
  180.         else                                                        //按鍵抬起
  181.         {  
  182.                 if(count3>key_S && count3<key_L)//短按
  183.                 {
  184.                         if(Choice==1)                        //選擇變量
  185.                         {
  186.                                 hour--;
  187.                                 if(hour>=24)
  188.                                         hour=23;
  189.                         }
  190.                         if(Choice==2)                        //選擇變量
  191.                         {
  192.                                 min--;
  193.                                 if(min>=60)
  194.                                         min=59;
  195.                         }
  196.                         if(Choice4==1)                        //選擇變量
  197.                         {
  198.                                 hour4--;
  199.                                 if(hour4>=24)
  200.                                         hour4=23;
  201.                         }
  202.                         if(Choice4==2)                        //選擇變量
  203.                         {
  204.                                 min4--;
  205.                                 if(min4>=60)
  206.                                         min4=59;
  207.                         }
  208.                 }
  209.                 count3=0;                                        //count3清0
  210.         }   
  211.         if(!K4)                                                        //檢測按鍵1按下
  212.         {
  213.                 count4++;                                        //消抖計數1自+1
  214.                 if((count4>=key_S)&&(key4_sign==0))//檢測消抖計數與按鍵1自鎖標志
  215.                 {                       
  216.                         key4_sign=1;                        //按鍵1自鎖標志置1
  217.                         Choice4++;                                //調整選擇變量自+1
  218.                         if(Choice4>=4)                        //調整鬧鐘時間選擇0鬧鐘關閉,1調時,2調分,3開啟鬧鐘
  219.                         {
  220.                                 Choice4=0;                        //調整時間選擇清0
  221.                         }
  222.                 }
  223.         }
  224.         else
  225.         {
  226.                 key4_sign=0;                                //按鍵1自鎖標志清0
  227.                 count4=0;                                        //消抖計數count1清0
  228.         }
  229. }
  230. /********************************
  231.                 數碼管顯示程序
  232. ********************************/
  233. void display()
  234. {
  235.         static uchar num=0;                                //分時顯示變量
  236.         if((Choice4>0)&&(Choice4<3))        //鬧鐘設置顯示部分
  237.         {
  238.                 P0=0xff;        //消隱
  239.                 switch(num)
  240.                 {
  241.                         case 0:
  242. //                                P2=0x01;                        //時十位位碼
  243.                                 P2=0xfe;                        //加PNP管反向
  244.                                 P0=table[hour4/10];        //時十位段碼
  245.                                 num++;
  246.                          break;       
  247.        
  248.                         case 1:
  249. //                                P2=0x02;                        //時個位位碼
  250.                                 P2=0xfd;                        //加PNP管反向
  251.                                 if((Twinkle==1)&&(Choice4==1))//時點閃爍
  252.                                         P0=table[hour4%10];
  253.                                 else
  254.                                         P0=table[hour4%10]&0x7f;//時個位段碼+點
  255.                                 num++;
  256.                          break;       
  257.        
  258.                         case 2:
  259. //                                P2=0x04;                        //分十位位碼
  260.                                 P2=0xfb;                        //加PNP管反向
  261.                                 P0=table[min4/10];        //分十位段碼
  262.                                 num++;
  263.                          break;       
  264.        
  265.                         case 3:
  266. //                                P2=0x08;                        //分個位位碼
  267.                                 P2=0xf7;                        //加PNP管反向
  268.                                 if((Twinkle==1)&&(Choice4==2))//分點閃爍
  269.                                         P0=table[min4%10];
  270.                                 else
  271.                                         P0=table[min4%10]&0x7f;//分個位段碼+點
  272.                                 num=0;
  273.                          break;       
  274.                 }
  275.         }
  276.         else        //正常走時顯示部分
  277.         {
  278.                 P0=0xff;        //消隱
  279.                 switch(num)
  280.                 {
  281.                         case 0:
  282. //                                P2=0x01;                        //時十位位碼
  283.                                 P2=0xfe;                        //加PNP管反向
  284.                                 P0=table[hour/10];        //時十位段碼
  285.                                 num++;
  286.                          break;       
  287.        
  288.                         case 1:
  289. //                                P2=0x02;                        //時個位位碼
  290.                                 P2=0xfd;                        //加PNP管反向
  291.                                 if((Twinkle==1)&&(Choice==1))//時點閃爍
  292.                                         P0=table[hour%10];
  293.                                 else
  294.                                         P0=table[hour%10]&0x7f;//時個位段碼+點
  295.                                 num++;
  296.                          break;       
  297.        
  298.                         case 2:
  299. //                                P2=0x04;                        //分十位位碼
  300.                                 P2=0xfb;                        //加PNP管反向
  301.                                 P0=table[min/10];        //分十位段碼
  302.                                 num++;
  303.                          break;       
  304.        
  305.                         case 3:
  306. //                                P2=0x08;                        //分個位位碼
  307.                                 P2=0xf7;                        //加PNP管反向
  308.                                 if(Choice4==3)
  309.                                         P0=table[min%10]&0x7f;//鬧鐘啟動后秒個位+點
  310.                                 else if((Twinkle==1)&&(Choice==2))//分+點閃爍
  311.                                         P0=table[min%10]&0x7f;
  312.                                 else if(Choice==1)        //分+點
  313.                                         P0=table[min%10]&0x7f;//分個位段碼+點
  314.                                 else
  315.                                         P0=table[min%10];//分個位段碼
  316.                                 num=0;
  317.                          break;       
  318.                 }
  319.         }
  320. }
  321. /********************************
  322.                 鬧鐘程序
  323. ********************************/
  324. void Buzzer_nz()
  325. {
  326.         if((Choice4==3)&&(hour4==hour)&&(min4==min)&&(sec<30))
  327.                 Buzzer_sign=1;
  328.         else Buzzer_sign=0;

  329.         if((second==1)&&(Buzzer_sign==1))//計時周期1s       
  330.                 Buzzer=0;                                        //蜂鳴器響
  331.         else Buzzer=1;
  332. }
  333. /********************************
  334.                 主程序
  335. ********************************/
  336. void main(void)
  337. {
  338.         Timer_Init();                                        //初始化定時器
  339.         while(1)
  340.         {
  341.                 key_scan();                                        //按鍵掃描函數
  342.                 display();                                        //顯示函數
  343.                 Buzzer_nz();                                //鬧鐘函數
  344.         }
  345. }
  346. /*-----------------------------
  347.   定時器0中斷服務程序  200微秒
  348. ------------------------------*/
  349. void timer0() interrupt        1
  350. {
  351.         Cnt200us++;                                                //時間變量Cnt200us自+1
  352.         if((Cnt200us>1250 && Cnt200us<2500)||(Cnt200us>3750 && Cnt200us<5000))//閃爍頻率2Hz               
  353.                 Twinkle=1;                                        //閃爍標志
  354.         else Twinkle=0;
  355.         if(Cnt200us>=5000)                            //在此可以調整走時精度
  356.         {
  357.                 Cnt200us=0;                                        //變量Cnt200us清0
  358.                 second=~second;                                //秒標志取反
  359.                 if(Choice==0)                                //調整選擇變量>0停止走秒
  360.                 {
  361.                         sec++;                                        //秒自+1
  362.                         if(sec>=60)                                //如果秒>=60
  363.                         {
  364.                                 sec=0;                                //秒清0
  365.                                 min++;                                //分自+1
  366.                                 if(min>=60)                        //分>=60
  367.                                 {
  368.                                         min=0;                        //分清0
  369.                                         hour++;                  //小時自+1
  370.                                         if(hour>=24)        //小時>=24
  371.                                                 hour=0;                //小時清0
  372.                                 }
  373.                         }
  374.                 }
  375.         }
  376. }


復制代碼



回復

使用道具 舉報

7#
ID:476064 發表于 2019-4-2 18:11 來自手機 | 只看該作者
太感謝了 回家試試去
回復

使用道具 舉報

8#
ID:476064 發表于 2019-4-2 18:13 來自手機 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

謝謝!回家仿真一下試試,不能讓手里的單片機躺著睡覺
回復

使用道具 舉報

9#
ID:476064 發表于 2019-4-3 08:23 來自手機 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

用你這個代碼編譯后,也是無法在仿真軟件上無法調整時間。4個按鍵完全失效。
回復

使用道具 舉報

10#
ID:476064 發表于 2019-4-3 09:29 來自手機 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

用不同的機器居然可以仿真了! 運行的很好,按鍵也能調整了。那個4069為啥不能用三極管代替
回復

使用道具 舉報

11#
ID:213173 發表于 2019-4-3 11:21 | 只看該作者
zsf333666 發表于 2019-4-3 09:29
用不同的機器居然可以仿真了! 運行的很好,按鍵也能調整了。那個4069為啥不能用三極管代替

按鍵完全失效是因為用主循環計數方式消抖和判斷長短按,仿真時主循環周期要比實際電路長得多(與PC配置有關),按鍵在預定消抖時間內沒有響應,需要按的時間長些才行。4069就是反相器,實物完全可以用三極管代替,但仿真用三極管會不正常。
回復

使用道具 舉報

12#
ID:63400 發表于 2019-4-3 13:10 | 只看該作者
通過按鍵 檢測 你要設置的按鍵狀態 給你個思路吧 比如按鍵s1 進入后停止定時器閃爍數碼管 如何按s2 設置加 s3設置減 你自己試試不想在來問我  
回復

使用道具 舉報

13#
ID:476064 發表于 2019-4-3 16:16 來自手機 | 只看該作者
已經搞定,是共陽極的4個三級管應該改成反相的
回復

使用道具 舉報

14#
ID:478454 發表于 2019-4-4 01:05 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

????我是哪里弄錯錯了么

QQ截圖20190404010411.png (33.95 KB, 下載次數: 57)

QQ截圖20190404010411.png
回復

使用道具 舉報

15#
ID:478454 發表于 2019-4-4 01:22 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

OK啦!,謝謝

QQ截圖20190404012216.png (79.44 KB, 下載次數: 44)

QQ截圖20190404012216.png
回復

使用道具 舉報

16#
ID:478454 發表于 2019-4-4 01:43 | 只看該作者
wulin 發表于 2019-4-3 11:21
按鍵完全失效是因為用主循環計數方式消抖和判斷長短按,仿真時主循環周期要比實際電路長得多(與PC配置有 ...

那么仿真的使用哪一種才能讓它正常呢???
回復

使用道具 舉報

17#
ID:478454 發表于 2019-4-4 03:04 | 只看該作者
wulin 發表于 2019-4-2 11:22
按照你的硬件電路給你改寫的程序,仿真走時不一定準確,實物比較準,也可以軟件調整精確度。

我想讓蜂鳴器常鳴60S后關閉,是有源的蜂鳴器。。要怎么改程序呢?

QQ截圖20190404030306.png (18.16 KB, 下載次數: 55)

QQ截圖20190404030306.png
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线国产一区二区 | 91在线免费视频 | 成人h视频在线观看 | 欧美一区二区三区在线观看 | 国产综合网址 | 91精品国产91久久综合桃花 | 亚洲成人免费观看 | 日韩男人天堂 | 亚洲欧美日韩中文字幕一区二区三区 | 国产一区二区三区高清 | xx视频在线观看 | 日韩视频一区二区在线 | 国产在线区 | 日本三级在线 | 国产免费一区二区 | 精品国产色 | 日韩精品无码一区二区三区 | 国产福利91精品一区二区三区 | 精精国产xxxx视频在线播放 | 国产一级大片 | 中文字幕在线观看www | 成人99| 九九热精 | 午夜小视频在线播放 | 国产95在线 | 午夜精品久久久久久久久久久久 | 在线国产视频 | 久久久99精品免费观看 | 日韩一区在线播放 | 中文字幕av一区 | 日韩综合在线 | 久久丝袜| 在线观看亚洲专区 | 国产精品自拍视频网站 | 伊人精品 | 中文字幕视频在线观看免费 | 97成人免费| 国产伦精品一区二区三区精品视频 | 免费在线视频精品 | 播放一级黄色片 | 精品一区二区三区中文字幕 |