找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6211|回復: 2
收起左側

單片機數碼管單片機時鐘實驗 C語言和匯編語言2個程序 還帶Proteus仿真

[復制鏈接]
ID:175881 發(fā)表于 2017-3-30 01:41 | 顯示全部樓層 |閱讀模式
基于51單片機數碼管顯示的單片機時鐘仿真原理圖(proteus工程文件可到本帖附件下載):

0.png

單片機匯編語言程序:
  1. ;-----------------------------------------------------------------
  2. ;文件名稱:SZ10-3.ASM
  3. ;程序功能:帶倒計時的鬧鐘
  4. ;----------------------------------------------------------------
  5. ;******************* 鬧鐘(含插入倒計時)程序部分 *******************

  6. ;----- -------- 程序初始化 -------------
  7. ; 定義存放計時單元地址
  8.          ALB           EQU           20H.0     ;鬧鈴設置標志   
  9.          BUF           EQU           30H       ;30~33H 連續(xù)4個字節(jié)存放顯示器數據
  10.          HOUR              EQU           34H       ;存放小時變量
  11.          MIN           EQU            35H       ;存放分鐘變量
  12.          SEC           EQU            36H       ;存放秒鐘變量
  13.          DEDA              EQU            37H      ;存放5ms計數值
  14.          HH            EQU            38H      ;鬧鈴設置小時變量
  15.          MM           EQU            39H           ;鬧鈴設置分鐘變量
  16.              ;………………………………
  17.              SEC0           EQU    3AH    ;存放舊的秒數
  18.              MM_D          EQU    3BH    ;倒數時間分鐘數
  19.              SS_D           EQU    3CH    ;倒數時間秒鐘數
  20.              ;………………………………
  21.   ;按鍵輸入引腳定義
  22.           K1          EQU            P2.4     ;按鍵K1引腳定義
  23.           K2          EQU            P2.5     ;按鍵K2引腳定義
  24.           K3          EQU            P2.6     ;按鍵K3引腳定義
  25.           K4          EQU           P2.7     ;按鍵K4引腳定義

  26. ;蜂鳴器和指示燈引腳定義
  27.          SPK           EQU            P3.7    ;蜂鳴器控制信號引腳定義
  28.          WLED          EQU     P3.0    ;工作指示燈引腳定義

  29. ;程序開始執(zhí)行地址
  30.          ORG       0H                     ;程序代碼由地址0開始
  31.          JMP       MAIN
  32.          ORG       0BH                   ;定時器T0中斷地址設置
  33.          JMP       TO_SRV

  34. ;-------------- 主 程 序 ------------

  35.   MAIN:                                           ;主程序
  36.          CLR       ALB                   ;清除鬧鈴標志   
  37.          ACALL     BZ                     ;蜂鳴器連續(xù)兩次鳴響
  38.          ACALL     BZ         
  39.          ACALL     LED_BL                ;LED 閃動,表示程序開始執(zhí)行
  40.          ACALL     INIT                   ;初始變化量
  41.          ACALL           INIT_TIMER            ;設置定時器

  42. ;加載顯示器初值數據
  43.          MOV       A, #0C0H  
  44.          MOV       P0, A   

  45.   ;無窮循環(huán)
  46.   LOOP:                  
  47.          ACALL    CONV         
  48.          ACALL    TIME_PRO              ;檢查鬧鈴時間   
  49.          ACALL    DISP                   ;掃描顯示  

  50.   ;設置走時時間
  51.          JB         K1, M1                 ;未按下K1鍵,則繼續(xù)掃描
  52.          ACALL     LED_BL                ;LED閃動
  53.          ACALL     SET_TIME              ;設置目前時間
  54.          JMP        LOOP                  ;跳轉到LOOP處運行
  55.   
  56.   ;設置鬧鈴時間
  57.   M1:    JB        K2,  M2               ;未按下K2鍵,則繼續(xù)掃描
  58.          ACALL     LED_BL     
  59.          ACALL     SET_ATIME            ;設置鬧鈴時間
  60.          JMP        LOOP                 ;跳轉到LOOP處運行
  61.   
  62.   ;設置倒計時間
  63.   M2:    JB        K3, M3                 ;未按下K3鍵,則繼續(xù)掃描
  64.         ;…………………………
  65.               ACALL    LED_BL
  66.               ACALL    DOWN_ATIME  ;設置倒計時間
  67.         ;…………………………
  68.           JMP             LOOP                   ;跳轉到LOOP處運行
  69.   
  70.   M3:    JB              K4, M4                  ;未按下K4鍵,則繼續(xù)掃描
  71.          CPL             ALB         
  72.          JNB              ALB, M31
  73.       
  74.   ;鬧鈴啟動連續(xù)3次發(fā)出響聲
  75.          ACALL     BZ
  76.          ACALL     BZ
  77.          ACALL     BZ
  78.          JMP       LOOP                   ;跳轉到LOOP處運行

  79.   M31:
  80.          ACALL     BZ                      ;鬧鈴停止,發(fā)出一聲響
  81.          JMP       LOOP                   ;跳轉到LOOP處運行

  82.   M4:
  83.          JMP       LOOP                   ;跳轉到LOOP處運行

  84. ;----------- 實現走時功能的子程序 ----------

  85.   ;使用定時器T0模式0計時
  86.    INIT_TIMER:                            ;初始化定時器,使用定時器T0模式0計時
  87.          MOV              TMOD,#00000000B        ;設置定時器T0工作模式0
  88.          MOV              IE,  #10000010B        ;啟用定時器T0中斷產生
  89.          MOV              TL0, #(8192-4900)MOD 32  ;加載初始化數據
  90.          MOV              TH0, #(8192-4900)/32     
  91.          SETB     TR0               ;啟動定時器0開始計時
  92.          RET
  93. ;-----------―――
  94.   ;中斷服務程序
  95.   TO_SRV:                                         ;定時器T0計時中斷程序每隔5ms中斷一次
  96.          PUSH      ACC                    ;將A值壓入堆棧
  97.          MOV       TL0, #(8192-4900)MOD 32 ;重加載初始化數據
  98.          MOV       TH0, #(8192-4900)/32   
  99.          INC       DEDA                   ;加1   
  100.   ;秒輸出
  101.         MOV               A, DEDA
  102.         CJNE      A,#200,TT1              ;是否1s到了
  103.         MOV               DEDA,  #0              ;計數值清0
  104.         CPL              WLED                   ;LED燈亮滅變換
  105.         INC              SEC                     ;秒計數加1
  106.         MOV              A,  SEC
  107.         CJNE      A, #60, TT1           ;是否1min到了
  108.   ;分輸出
  109.         INC               MIN                     ;分計數加1
  110.         MOV              SEC,  #0                ;秒計數清0
  111.         MOV               A,  MIN
  112.         CJNE      A, #60, TT1            ;是否1h到了
  113.   ;小時輸出
  114.         INC        HOUR                   ;小時計數加1
  115.         MOV               MIN,  #0                ;分計數清0
  116.         MOV               A,  HOUR
  117.         CJNE      A, #24, TT1             ;是否24h到了
  118.         MOV               SEC,  #0                ;秒鐘變量清0
  119.         MOV               MIN,  #0                ;分鐘變量清0
  120.         MOV               HOUR, #0                ;小時變量清0
  121.   TT1:
  122.         POP               ACC                    ;將A值由堆棧取出
  123.         RETI

  124. ;------------- 實現顯示功能的子程序 ---------


  125.   CONV:
  126.   ;轉換小時數據
  127.         MOV              A,  HOUR
  128.         MOV               B,  #10
  129.         DIV               AB
  130.         MOV               DPTR,#TABLE           ;查表轉換
  131.         MOVC             A,  @A+DPTR
  132.         MOV              BUF,  A
  133.         MOV              A, B
  134.         MOVC             A,  @A+DPTR
  135.         MOV              BUF+1,  A
  136.   ;轉換分鐘數據
  137.         MOV               A,  MIN
  138.         MOV               B,  #10
  139.         DIV               AB
  140.         MOV               DPTR,#TABLE             ;查表轉換
  141.         MOVC             A,  @A+DPTR
  142.         MOV               BUF+2,  A
  143.         MOV               A, B
  144.         MOVC      A,  @A+DPTR
  145.         MOV               BUF+3,  A
  146.         RET

  147.   ;字型數據編碼表
  148.   TABLE:
  149.         DB   0C0H,0F9H,0A4H,0B0H
  150.         DB   99H,92H,82H,0F8H
  151.         DB   80H,90H,88H,83H
  152.         DB   0C6H,0A1H,86H,8EH

  153. ;-------------- 掃描顯示子程序 -----------
  154.   ;掃描顯示
  155.   DISP:
  156.         MOV               R0,  #BUF               ;指向顯示器顯示緩沖區(qū)起始地址
  157.         MOV               R2,  #4                  ;循環(huán)執(zhí)行4次
  158.         MOV               ACC, #11110111b        ;加載掃描信號初值11110111B
  159.   S1:
  160.         PUSH      ACC
  161.         MOV               A, @R0                 ;取出顯示器數據
  162.         MOV               P0, A                   ;由P0送出一位顯示器數據
  163.         POP               ACC
  164.         MOV               P2, ACC                ;由P2送出掃描輸出信號  
  165.         MOV               R5, #2                   ;延遲一段時間
  166.         ACALL            DELAY
  167.   ;改變掃描碼 EX:XXXX1011
  168.         RR                A                       ;累加器A向右移動一位
  169.         INC               R0                      ;顯示器顯示緩沖區(qū)地址加1
  170.         DJNZ             R2, S1                  ;判斷是否繼續(xù)執(zhí)行循環(huán)
  171.         RET

  172. ;------------- 實現調整時間子程序 -----------

  173. ;設置目前時間
  174.   SET_TIME:
  175.         CLR              TR0                     ;定時器工作暫停
  176.         MOV              SEC, #0                  ;秒鐘變量清0
  177.   L0:
  178.         ACALL     DISP                    ;掃描顯示

  179.         JB        K2,  L1                ;未按下K2鍵,則繼續(xù)掃描
  180.         JNB               K2,  $                  ;按下,則等待放開
  181.    ;K2小時調整   
  182.         INC               HOUR                   ;小時計數加1
  183.         MOV               A, HOUR
  184.         CJNE      A,#24, L11              ;是否24h到了
  185.         MOV               HOUR, #0               ;小時變量清0
  186.   L11:
  187.         ACALL            CONV                   ;轉換顯示數據
  188.         ACALL            DISP                    ;掃描顯示
  189.         JMP               L0                      ;跳轉到L0處執(zhí)行

  190.   L1:   JB        K3, L2                  ;未按下K3鍵,則繼續(xù)掃描
  191.         JNB               K3,$                    ;按下,則等待放開
  192.    ;K3分鐘調整
  193.         INC       MIN                    ;分鐘計數加1
  194.         MOV               A,  MIN
  195.         CJNE      A,#60, L21              ;是否60min到了
  196.         MOV               MIN, #0                ;分鐘變量清0
  197.   L21:
  198.         ACALL     CONV                  ;轉換顯示數據
  199.         ACALL     DISP                   ;掃描顯示
  200.         JMP       L0                     ;跳轉到L0處運行

  201.   L2:   JB               K4,L0                  ;未按下K4鍵,則繼續(xù)掃描
  202.         JNB               K4, $                   ;按下,則等待放開
  203.        ACALL            BZ                     ;蜂鳴器鳴響一聲
  204.   ;K4設置完成
  205.         ACALL     LED_BL                ;LED閃動
  206.         SETB      TR0                    ;啟動定時器
  207.         RET

  208. ;------------- 計時單元清0子程序 ----------

  209.   ;計時單元清0
  210. INIT:              
  211.        MOV               DEDA,         #0            ;5ms計數值清0
  212.        MOV               SEC,           #0            ;秒鐘變量清0
  213.        MOV               MIN,           #0             ;分鐘變量清0
  214.        MOV               HOUR,         #0             ;小時變量清0
  215.        RET

  216. ; ------------―蜂鳴器鳴響一聲子程序 ----------
  217. ;蜂鳴器
  218.   BZ:                                ;蜂鳴器鳴響一聲
  219.         MOV       R6, #250
  220.   B1:   ACALL            DEX
  221.         CPL               SPK
  222.         DJNZ      R6, B1
  223.         MOV               R5, #50
  224.         ACALL            DELAY
  225.         RET

  226. ;-------------工作指示燈閃爍子程序 ----------
  227. ;工作指示
  228.   LED_BL:                                ;工作指示燈閃爍
  229.         MOV        R4, #6
  230.   LE1:  CPL       WLED                  ;位反向
  231.         MOV        R5,#25
  232.         ACALL      DELAY            ;延遲50ms
  233.         DJNZ      R4, LE1         
  234.         RET

  235. ;-------------- 延時子程序 -------------

  236.   ;延時子程序
  237.   DELAY:                                   ;總延遲時間R5 2ms
  238.         MOV        R6,#10
  239.   D1:  MOV         R7,#100
  240.         DJNZ       R7,$
  241.         DJNZ       R6, D1
  242.         DJNZ       R5, DELAY
  243.         RET
  244. ;------------ 蜂鳴器短暫延時子程序-----------
  245.   ; 蜂鳴器
  246.   DEX:  MOV       R7, #180               ;短暫延時
  247.   DE1:  NOP
  248.          DJNZ      R7, DE1
  249.          RET

  250. ;******************** 增加定時鬧鈴程序部分 *********************

  251. ; ----------- 設置鬧鈴時間子程序 ------------
  252. ;設置鬧鈴時間
  253.   SET_ATIME:
  254.          MOV       HH, #0
  255. MOV       MM, #0
  256. ACALL     CONVA                 ;加載鬧鈴時間數據
  257.   N0:
  258.          ACALL     DISP
  259.   ;-----------
  260.         JB         K2, N1                  ;未按下K2鍵,則繼續(xù)掃描
  261.         JNB               K2, $                   ;按下,則等待放開
  262. ;K2調整小時
  263.         INC               HH                     ;小時數加1
  264.         MOV             A, HH
  265.         CJNE            A, #24, N11             ;是否24h到了
  266.         MOV       HH, #0                  ;小時數清0
  267.   N11:
  268.         ACALL            CONVA                 ;加載鬧鈴時間數據
  269.         ACALL           DISP                    ;掃描顯示
  270.         JMP             N0                      ;跳轉到N0處運行
  271.   ;------------
  272.   N1:   JB               K3, N2                  ;未按下K3鍵,則繼續(xù)掃描
  273.         JNB               K3, $                   ;按下,則等待放開
  274. ;K3調整分鐘
  275.         INC             MM                           ;調整分鐘數
  276.         MOV               A, MM                 ;分鐘數加1
  277.         CJNE      A, #60, N21             ;是否60min到了
  278.         MOV               MM, #0                 ;分鐘數清0
  279.   N21:
  280.         ACALL            CONVA                ;加載鬧鈴時間數據
  281.         ACALL            DISP                  ;掃描顯示
  282.         JMP              N0                     ;跳轉到N0處運行
  283.   ;------------
  284.   N2:   JB               K4, N0                  ;未按下K4鍵,則繼續(xù)掃描
  285.         JNB              K4, $                   ;等K4鍵放開
  286.   ;K4設置完成
  287.         ACALL            LED_BL                ;LED閃動
  288.         ACALL           CONV                  ;加載現在時間數據
  289.         RET

  290. ; ----------- 加載鬧鈴時間數據子程序 ----------


  291.   CONVA:
  292.   ;轉換小時數據
  293.         MOV               A,  HH
  294.         MOV               B,  #10
  295.         DIV               AB
  296.   ;-----------
  297.         MOV              DPTR,#TABLE           ;查表轉換
  298.         MOVC             A,  @A+DPTR
  299.         MOV             BUF,  A
  300.   ;-----------
  301.         MOV              A, B
  302.         MOVC             A,  @A+DPTR
  303.         MOV              BUF+1,  A
  304.   ;轉換分鐘數據
  305.         MOV              A,  MM
  306.         MOV              B,  #10
  307.         DIV               AB
  308.   ;-----------
  309.         MOV              DPTR, #TABLE           ;查表轉換
  310.         MOVC             A,  @A+DPTR
  311.         MOV              BUF+2,  A
  312.   ;-----------
  313.         MOV              A, B
  314.         MOVC             A,  @A+DPTR
  315.         MOV              BUF+3,  A
  316.         RET

  317. ; ---------- 檢查鬧鈴時間處理子程序 ----------

  318. ;檢查是否啟動鬧鈴
  319.   TIME_PRO:
  320.         JB        ALB, TI3
  321.         RET
  322. ; --------------

  323. ;檢查鬧鈴時間是否到了
  324.   TI3:
  325.         MOV              A, HOUR
  326.         MOV              B, HH
  327.         CJNE             A, B, BK                ;檢查鬧鈴小時時間
  328.   ;-----------
  329.         MOV       A, MIN
  330.         MOV       B, MM
  331.         CJNE      A, B, BK         ;檢查鬧鈴分鐘時間
  332.    ;-----------
  333.         ACALL            TIME_OUT              ;調用執(zhí)行檢查鬧鈴時間處理子程序
  334.   BK:
  335.         RET

  336. ;---------- 執(zhí)行鬧鈴時間處理子程序 -----------

  337.   TIME_OUT:                                ;所設置的鬧鈴數據到了
  338.    X1:  ACALL           LED_BL                ;LED閃動
  339.          ACALL           BZ                     ;蜂鳴器發(fā)聲
  340.   ;按下K4鍵停止鬧鈴
  341.          JB        K4, X1                  ;等待是否按下K4鍵
  342.          JNB       K4,$                    ;若按下鍵,則等待按鍵放開
  343.          ACALL     LED_BL                 ;LED閃動
  344.          CLR       ALB                    ;清除鬧鈴位
  345.          RET
  346. ; -----------------------------------
  347.      
  348. ;******************** 增加倒計時程序部分 ***********************

  349. ;----------- 設置倒計時時間子程序 ----------
  350. ;設置倒計時時間
  351.   DOWN_ATIME:
  352.          CLR       TR0                     ;定時器工作暫停
  353.          MOV       HH, #0
  354.          MOV       MM, #0
  355. MOV       SS_D, #1         ;秒鐘變量為1
  356.   S0:
  357.         ACALL     DISP                    ;掃描顯示
  358.    ;-----------
  359. ;按K2分鐘數增加
  360.          JB               K2, S12                  ;未按下K2,則繼續(xù)掃描
  361.          JNB             K2, $                    ;按下,則等待放開

  362.          INC       MM_D                   ;分鐘數加1
  363.          MOV       A, MM_D
  364.          CJNE      A, #60, S11            ;是否60min到了
  365.          MOV       MM_D, #0                ;分鐘變量清0
  366.   S11:
  367.         ACALL  DOWN_CONV                ;顯示倒數的時間
  368.         ACALL            DISP                     ;掃描顯示
  369.         JMP               S0                       ;跳轉到S0處運行
  370.   ;------------
  371. ;按K3分鐘數減少
  372.   S12:  JB        K3, S2                  ;未按下K3,則繼續(xù)掃描
  373.         JNB               K3, $                  ;按下,則等待放開

  374.         DEC               MM_D                   ;分鐘數減少1
  375.         MOV              A, MM_D         
  376.         CJNE      A, #0,S21               ;判斷是否為0
  377.         MOV               MM_D, #60               ;分鐘數賦值為60
  378.   S21:
  379.         ACALL            DOWN_CONV            ;加載倒數時間數據
  380.         ACALL            DISP                     ;掃描顯示
  381.         JMP              S0                       ;循環(huán)執(zhí)行
  382.   ;------------
  383.   S2:   JB               K4, S0                   ;未按下K4鍵,則繼續(xù)掃描
  384.         JNB              K4, $                    ;等K4鍵放開
  385.   ;K4設置完成
  386.         ACALL            BZ                       ;響4聲
  387.         ACALL            BZ
  388.         ACALL            BZ
  389.         ACALL            BZ
  390.    
  391.         ACALL            LED_BL                  ;LED閃動
  392.         SETB             TR0                     ;啟動定時器
  393.    
  394.   S3:
  395.         ACALL            DOWN_TIME             ;檢查倒計時
  396.         ACALL            DOWN_CONV            ;加載倒數時間數據
  397.         ACALL            DISP                     ;掃描顯示
  398.         JMP              S3      
  399.         RET
  400.    
  401.   ; ----------  加載倒計時時間子程序  ---------
  402. ;顯示倒數的分鐘數
  403.   DOWN_CONV:
  404.         MOV              A,  MM_D
  405.         MOV              B, #10                   ;設置被除數
  406.         DIV               AB                      ;除法運算,結果A存商數,B存余數
  407.         MOV               DPTR, #TABLE           ;查表轉換
  408.         MOVC             A,  @A+DPTR
  409.         MOV              BUF+2,  A               ;商數存入BUF+2
  410.         MOV              A, B                     ;余數暫存入A
  411.         MOVC             A,  @A+DPTR          ;查表轉換
  412.         MOV       BUF+3,  A              ;余數存入BUF+3
  413.         RET

  414. ;------------- 檢查倒計時子程序  ------------
  415. ;檢查倒計時
  416.   DOWN_TIME:                              ;檢查是否倒數終止
  417.         MOV              A,SEC                  ;加載現在秒數
  418.         MOV              B, SEC0                 ;載入舊秒數
  419.         CJNE             A, B, D01               ;是否過了1s
  420.         RET
  421. ; -----------
  422.   D01:
  423.         MOV              SEC0, SEC               ;記錄舊的秒數
  424.         DEC              SS_D                   ;秒數減1
  425.         MOV              A, SS_D
  426.         CJNE      A, #0, D11              ;秒鐘數是否為0
  427.         MOV              A, MM_D        
  428.         CJNE      A, #0, D12              ;分鐘數是否為0
  429.   ;秒鐘數為0且分鐘數為0,則倒數終止
  430.         ACALL            TIME_OUT              ;倒數終了處理程序
  431.         JMP               LOOP      
  432.         RET  
  433.   ;-----------
  434.   D12:
  435.         MOV              SS_D,#59              ;秒鐘數賦值為59     
  436.         DEC              MM_D                  ;分鐘數減1

  437.   D11:
  438.         ACALL            DOWN_CONV                   ;顯示倒計時時間
  439.         RET
  440. ;----------------------------------   
  441.         END
  442. ;-----------------------------------------------------------------

復制代碼



單片機c語言源程序:
  1. // --------------------------------------------------------------------------------------
  2. // 文件名稱:SZ10-1.c
  3. // 程序功能:單片機時鐘                                            
  4. // --------------------------------------------------------------------------------------
  5.     #include <reg51.h>                   // 包含器件配置文件
  6.     #define uchar unsigned char
  7.     #define uint unsigned int
  8.     char DATA_7SEG[10]={0xC0,0xF9,0xA4,0xB0,0x99,
  9.              0x92,0x82,0xF8,0x80,0x90};  // 0~9的數碼管段碼            
  10.         uchar hour=0,min=0,sec=0;                     // 時、分、秒單元清0
  11.     uchar deda=0;                                            // 5ms計數單元清0  
  12.     bit d_05s=0;                                     // 0.5s標志   
  13.     uchar set=0;                                                 // 模式設定標志
  14.     uchar m=0;
  15.     uchar flag=0;                                             // RAM掉電標志
  16.     void delay(uint k);                                     // 延時函數
  17.     void conv();                                                    // 走時單元轉換
  18.     void disp();                                             // 走時時間顯示函數  
  19. //-----------------------
  20.     sbit K1=P2^4;                        // 按鍵K1引腳定義
  21.     sbit K2=P2^5;                        // 按鍵K2引腳定義
  22.     sbit K3=P2^6;                        // 按鍵K3引腳定義
  23.     sbit K4=P2^7;                        // 按鍵K4引腳定義
  24. //-----------------------  
  25.     sbit SPK=P3^7;                       // 蜂鳴器引腳定義
  26.     sbit SET_2=P2^2;
  27.     sbit M_D=P0^7;

  28. // ---------------------------- 定時器初始化函數----------------------------

  29. // 定時器T0初始化
  30.    void init_timer()
  31.     {
  32.      TMOD=0x01;                               // 設置定時器T0工作模式為1
  33.      TH0=-(4800/256);                          // 加載高字節(jié)計數初值   
  34.      TL0=-(4800%256);                          // 加載低字節(jié)計數初值   
  35.      IE=0x82;                                  // 啟用定時器T0中斷產生
  36.      TR0=1;                                    // 啟動定時器T0開始計時
  37.    }

  38. // ------------------------------- 中斷T0函數 ------------------------------

  39. // 5ms定時中斷
  40.    void T0_srv(void) interrupt 1
  41.    {
  42.      TH0=-(4800/256);                          // 重置定時器計時初始值   
  43.      TL0=-(4800%256);
  44.      deda++;                                   // 計數單元deda 值遞增
  45.    }                                   

  46. // ----------------------------- 走時單元轉換函數 -------------------------

  47.   // 時、分、秒單元及走時單元轉換
  48.    void conv()                                                   
  49.    {                                          
  50.     if(deda<=100)d_05s=0;                      // 秒位標志,每秒的后0.5s置0
  51.            else d_05s=1;                     // 秒位標志,每秒的前0.5s置1
  52.     if(deda>=200){sec++;deda=0;}              // 中斷200次秒加1,deda清0
  53.     if(sec==60){min++;sec=0;}                 // 秒滿60次后,分加1,秒清0
  54.     if(min==60){hour++;min=0;}               // 分滿60次后,時加1,分清0
  55.     if(hour==24){hour=0;}                     // 小時滿24后,小時清0 */
  56.   }

  57. // ------------------------------ 走時時間顯示函數 ------------------------

  58. // 走時時間顯示
  59.   void disp()
  60.   {
  61.     P0=DATA_7SEG[hour/10];P2=0xf7;delay(2);
  62.     P0=DATA_7SEG[hour%10];P2=0xfb;delay(2);
  63.     if(d_05s==1){if(SET_2==0)M_D=0;else M_D=1;}
  64.     delay(2);
  65.     P0=DATA_7SEG[min/10];P2=0xfd;delay(2);
  66.     P0=DATA_7SEG[min%10];P2=0xfe;delay(2);
  67.   }

  68. // ----------------------------- 調整走時時間函數 -------------------------

  69. /* 調整走時時間 */
  70.    void set_time()
  71.     {
  72.           uchar m;
  73.           //TR0=0;
  74.           if(K2==0)delay(1);                      // 按下K2鍵,消除抖動  
  75.     if(K2==0)hour++;                           // 小時數遞增
  76.           if(hour==24)hour=0;               // 小時數到24,從0開始
  77.           for(m=0;m<30;m++)                 // 循環(huán)30次
  78.                 {
  79.                   disp();                       // 調用disp()顯示函數
  80.                   if(SET_2==0)M_D=0;                   // 點亮U2小數點(秒點)
  81.                   else M_D=1;
  82.                   delay(1);                     // 調用delay(1)延時函數
  83.                 }               
  84.           if(K3==0)delay(1);                     // 按下K3鍵,消除抖動
  85.           if(K3==0)min++;                       // 分鐘數遞增
  86.           if(min==60)min=0;                        // 分鐘數到60,從0開始
  87.           for(m=0;m<30;m++)                 // 循環(huán)30次
  88.                 {
  89.                  disp();                        // 調取disp()顯示函數   
  90.                  if(SET_2==0)M_D=0;                    // 點亮U2小數點(秒點)
  91.                  else M_D=1;
  92.                  delay(1);                             // 調取delay(1)延時函數            
  93.         }

  94.   }

  95. // ------------------------------ 走時函數 ---------------------------------

  96. //走時
  97.    void time()              
  98.   {                       
  99.     conv();                                           // 走時單元轉換
  100.     disp();                                    // 走時時間顯示函數
  101.   }                        

  102. // ----------------------------- 按鍵模式函數 ------------------------------

  103.   // 掃描按鍵次數
  104.   void scan_key()
  105.   {
  106.     delay(1);                                 // 調用延時函數
  107.     if(K1==0) set++;                         // 按一下K1鍵,set 加1
  108.         if(set>=2)set=0;                          // 按兩次K1鍵,set 為0
  109.     if(set==1)flag=0x55;                     // set =1,flag等于55H   
  110.     F0:if(K1==0)goto F0;                       // 按鍵未釋放,在此等候   
  111.   }

  112. //------------------------------ 延時函數 ---------------------------------        

  113. //延時
  114.   void delay(uint k)                        // 總延時時間:1ms k
  115.    {
  116.     uint i,j;                           // 定義局部變量i、j  
  117.     for(i=0;i<k;i++){                         // 外層循環(huán)
  118.     for(j=0;j<121;j++)                       // 內層循環(huán)
  119.     {;}}
  120.    }

  121. //------------------------------- 發(fā)聲函數 --------------------------------

  122. // 發(fā)聲
  123. void  fs_d ()                                         
  124.     {   
  125.       unsigned int j,y;                 // 聲明無符號整型變量j, y        
  126.        {                    
  127.          for(y=0;y<1000;y++)            // 循環(huán)1000次,嘀響0.5s
  128.           {  
  129.             SPK=~SPK;                   // 反相輸出
  130.                 for(j=0;j<50;j++);          // 延時500μs
  131.            }  
  132.         delay(200);                     // 停0.2s            
  133.       }                                          
  134.    }
  135.   
  136. //--------------------------------- 主函數 --------------------------------

  137.   //主函數
  138.    void main()
  139.    {                             
  140.      init_timer();                      // 定時器T0初始化        
  141.      while(1)                                                  // 無限循環(huán)
  142.      {
  143.        if(K1==0)
  144.            {  
  145.              scan_key();                                   // 有按鍵,調用按鍵掃描函數   
  146.              fs_d ();
  147.            }           
  148.            switch(set)                                                // 根據set鍵值散轉
  149.         {                        
  150.           case 0:time();  break;                 // 走時時間程序         
  151.               case 1: set_time();break;     // 走時時間調整
  152.           default:break;                                // 其他,退出   
  153.         }                                                  
  154.        if(flag!=0x55)                                       // 判斷掉電標志            
  155.         {         
  156.          P0=0xc0; P2=0xc0; delay(200);        // 點亮4個數碼管  
  157.              P2=0xff; delay(400);               // 熄滅 4個數碼管                                 
  158.             }
  159.            }
  160.   }

  161. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

0.png

該系列源碼包含有很多非常經典,代碼風格十分規(guī)范,而且注釋詳細的單片機例程,還帶仿真,對于MCU學習特別是初學者是很有幫助的,全部源碼下載(共25個項目):http://www.torrancerestoration.com/bbs/dpj-79328-1.html

本例程下載(含proteus仿真工程文件與源碼):
單片機數碼管單片機時鐘實驗.rar (62.5 KB, 下載次數: 59)

回復

使用道具 舉報

ID:164479 發(fā)表于 2017-3-30 10:16 | 顯示全部樓層
學習一下
回復

使用道具 舉報

ID:81140 發(fā)表于 2017-6-17 21:39 | 顯示全部樓層
好資料            
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表