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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機數碼管時鐘及鬧鈴時間可調

[復制鏈接]
跳轉到指定樓層
樓主
ID:693144 發表于 2020-2-14 19:04 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*-----------------------------------------------
  2. 實驗名稱:基于定時器T0的可調時鐘、
  3. 接線說明:
  4.          LSA=>P2^2;
  5.          LSB=>P2^3;
  6.          LSC=>P2^4;
  7.          P0=>數碼管位選
  8.          P3=>獨立按鍵
  9. 實驗現象:
  10.          數碼管從00-00-00 (時-分-秒)開始計秒
  11.          K1  時鐘+   K2    時鐘-
  12.          K3    分鐘+    K4    分鐘-
  13. ------------------------------------------------*/
  14. #include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義

  15. #define KeyPort P3 //定義按鍵端口
  16. #define u8 unsigned char
  17. #define u16 unsigned int
  18. //#define DataPort P0 //定義數據端口 程序中遇到DataPort 則用P0 替換

  19. //sbit LATCH1=P2^2;//定義鎖存使能端口 段鎖存
  20. //sbit LATCH2=P2^3;//                 位鎖存
  21. sbit LSA=P2^2;
  22. sbit LSB=P2^3;
  23. sbit LSC=P2^4;
  24. sbit beep=P1^5;

  25. unsigned char hour,minute,second;//定義時分秒

  26. bit UpdateTimeFlag;//定義讀時間標志

  27. unsigned char code dofly_DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 顯示段碼值0~9
  28. unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分別對應相應的數碼管點亮,即位碼

  29. u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  30.                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//顯示0~F的值

  31. unsigned char TempData[8],Key_Num; //存儲顯示值的全局變量

  32. void DelayUs2x(unsigned char t);//us級延時函數聲明
  33. void DelayMs(unsigned char t); //ms級延時
  34. void DigDisplay();//數碼管顯示函數
  35. unsigned char KeyScan(void);//鍵盤掃描
  36. void     Init_Timer0(void);//定時器初始化
  37. /*------------------------------------------------
  38.                     主函數
  39. ------------------------------------------------*/
  40. void delay(u16 i)
  41. {
  42.     while(i--);   
  43. }   
  44. /*--------------------------------------------------*/
  45. void main (void)
  46. {
  47. //unsigned char num;                  

  48.     Init_Timer0();
  49.     //Init_Timer1();  //定時器1初始化

  50. while (1)         //主循環
  51.   {
  52.    
  53.                     Key_Num=KeyScan();
  54.                     switch(Key_Num)
  55.                         {
  56.                                     case 1:hour++;if(hour==24)hour=0;     //正常時間 小時 加1
  57.                                         break;
  58.                                     case 2:hour--;if(hour==255)hour=23;   //正常時間 小時減1
  59.                                          break;
  60.                                     case 3:minute++;if(minute==60)minute=0;     //分鐘加1
  61.                                          break;
  62.                                     case 4:minute--;if(minute==255)minute=59;   //分鐘減1
  63.                                          break;
  64.                                     default:break;
  65.                         }
  66. //                    if(UpdateTimeFlag==1)
  67. //                     {
  68. //                                UpdateTimeFlag=0;

  69.                              TempData[0]=dofly_DuanMa[hour/10]; //時            //數據的轉換,因我們采用數碼管0~9的顯示,將數據分開
  70.                              TempData[1]=dofly_DuanMa[hour%10];
  71.                              TempData[2]=0x40;                                    //加入"-"
  72.                              TempData[3]=dofly_DuanMa[minute/10];//分
  73.                              TempData[4]=dofly_DuanMa[minute%10];
  74.                              TempData[5]=0x40;
  75.                              TempData[6]=dofly_DuanMa[second/10];//秒
  76.                              TempData[7]=dofly_DuanMa[second%10];   
  77.                            
  78.                             DigDisplay();
  79. //                        }
  80.                     // DigDisplay();
  81. }
  82. }
  83. /*------------------------------------------------
  84. uS延時函數,含有輸入參數 unsigned char t,無返回值
  85. unsigned char   是定義無符號字符變量,其值的范圍是
  86. 0~255 這里使用晶振12M,精確延時請使用匯編,大致延時
  87. 長度如下 T=tx2+5 uS
  88. ------------------------------------------------*/
  89. void DelayUs2x(unsigned char t)
  90. {   
  91. while(--t);
  92. }
  93. /*------------------------------------------------
  94. mS延時函數,含有輸入參數 unsigned char t,無返回值
  95. unsigned char 是定義無符號字符變量,其值的范圍是
  96. 0~255 這里使用晶振12M,精確延時請使用匯編
  97. ------------------------------------------------*/
  98. void DelayMs(unsigned char t)
  99. {
  100.      
  101. while(t--)
  102. {
  103.      //大致延時1mS
  104.      DelayUs2x(245);
  105.        DelayUs2x(245);
  106. }
  107. }
  108. /*------------------------------------------------
  109. 顯示函數,用于動態掃描數碼管
  110. 輸入參數 FirstBit 表示需要顯示的第一位,如賦值2表示從第三個數碼管開始顯示
  111. 如輸入0表示從第一個顯示。
  112. Num表示需要顯示的位數,如需要顯示99兩位數值則該值輸入2
  113. ------------------------------------------------*/
  114. void DigDisplay()
  115. {
  116.     u8 i=0;
  117.     for(i=0;i<8;i++)
  118.     {
  119.         switch(i)     //位選,選擇點亮的數碼管,
  120.         {
  121.             case(0):
  122.                 LSA=0;LSB=0;LSC=0; break;//顯示第0位
  123.             case(1):
  124.                 LSA=1;LSB=0;LSC=0; break;//顯示第1位
  125.             case(2):
  126.                 LSA=0;LSB=1;LSC=0; break;//顯示第2位
  127.             case(3):
  128.                 LSA=1;LSB=1;LSC=0; break;//顯示第3位
  129.             case(4):
  130.                 LSA=0;LSB=0;LSC=1; break;//顯示第4位
  131.             case(5):
  132.                 LSA=1;LSB=0;LSC=1; break;//顯示第5位
  133.             case(6):
  134.                 LSA=0;LSB=1;LSC=1; break;//顯示第6位
  135.             case(7):
  136.                 LSA=1;LSB=1;LSC=1; break;//顯示第7位   
  137.         }
  138.         P0=TempData[i];//發送段碼
  139.         delay(100); //間隔一段時間掃描   
  140.         P0=0x00;//消隱
  141.     //delay(1000);
  142.     }
  143. }
  144. /*------------------------------------------------
  145.                     定時器初始化子程序
  146. ------------------------------------------------*/
  147. void Init_Timer0(void)
  148. {
  149. TMOD |= 0x01;      //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響            
  150. //TH0=0x00;          //給定初值
  151. //TL0=0x00;
  152. EA=1;            //總中斷打開
  153. ET0=1;           //定時器中斷打開
  154. TR0=1;           //定時器開關打開
  155. }
  156. /*------------------------------------------------
  157.                  定時器中斷子程序
  158. ------------------------------------------------*/
  159. void Timer0_isr(void) interrupt 1
  160. {
  161. static unsigned int num,i;
  162. TH0=(65536-2000)/256;//重新賦值 2ms
  163. TL0=(65536-2000)%256;

  164. // DigDisplay();     // 調用數碼管掃描
  165. i++;

  166.     if(hour==0,minute==1&&second<=3)
  167.     {
  168.     beep=~beep;
  169.    
  170. /*        if(i>=1000)                //持續時間
  171.         {
  172.                 i=0;                //計數清0                                
  173.                 beep=0;                //蜂鳴器端口復位
  174.                 TR0 = 0;
  175.                                 //定時器0關閉
  176.         }    */
  177.     }   

  178. if(i==10)              //20ms更新一次
  179.     {
  180.     i=0;
  181.     UpdateTimeFlag=1;     //更新時間志位置1
  182.     }
  183. num++;
  184. if(num==500)        //大致1s
  185.    {
  186.     num=0;
  187.     second++;
  188.     if(second==60)          //秒到60,分鐘加1
  189.      {
  190.       second=0;      
  191.       minute++;
  192.       if(minute==60)    //分鐘到60,小時加1
  193.         {
  194.          minute=0;
  195.          hour++;
  196.          if(hour==24)        //小時到24,回零
  197.            hour=0;
  198.         }
  199.      }
  200.    
  201.   }
  202. }

  203. /*------------------------------------------------
  204. 按鍵掃描函數,返回掃描鍵值
  205. ----------------------------------------------*/
  206. unsigned char KeyScan(void)
  207. {
  208. unsigned char keyvalue;
  209. if(KeyPort!=0xff)
  210.    {
  211.     DelayMs(10);
  212.     if(KeyPort!=0xff)
  213.        {
  214.         keyvalue=KeyPort;
  215.         while(KeyPort!=0xff);
  216.         switch(keyvalue)
  217.         {
  218.          case 0xfe:return 1;break;
  219.          case 0xfd:return 2;break;
  220.          case 0xfb:return 3;break;
  221.          case 0xf7:return 4;break;
  222.          case 0xef:return 5;break;
  223.          case 0xdf:return 6;break;
  224.          case 0xbf:return 7;break;
  225.          case 0x7f:return 8;break;
  226.          default:return   0;break;
  227.         }
  228.       }
  229.    }
  230.    return 0;
  231. }
復制代碼

任務4.zip

43.74 KB, 下載次數: 22, 下載積分: 黑幣 -5

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久这里只有精品首页 | 91亚洲国产亚洲国产 | 亚洲欧美日韩激情 | 国产在线观看不卡一区二区三区 | 亚州影院 | 亚洲欧美视频 | 亚洲欧洲一区二区 | 国产一区不卡 | 日本a v在线播放 | 欧美日韩在线成人 | 91文字幕巨乱亚洲香蕉 | 国内精品一区二区 | 男人的天堂久久 | 欧美日韩国产综合在线 | 欧美a级成人淫片免费看 | 久久久久久久国产精品视频 | 国产视频第一页 | 国产精品久久久久久一区二区三区 | 91精品久久久久久综合五月天 | 国产一区二区三区四区在线观看 | 国产成人免费观看 | 亚洲人成在线观看 | 中文字幕亚洲一区 | 91精品国产高清久久久久久久久 | 欧美精品一区在线 | 亚洲 欧美 日韩在线 | 日本精品一区二区三区四区 | 亚洲大片一区 | 精品久久国产 | 国产精品高潮呻吟久久 | 亚洲成人黄色 | 免费久久久 | 国产情侣啪啪 | 91精品国产综合久久久动漫日韩 | 欧美精品久久久久久久久久 | 欧美 中文字幕 | 国产激情在线 | 欧美一区二区免费视频 | 午夜免费福利电影 | 九色porny自拍视频 | 国产伦精品 |