找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5475|回复: 2
打印 上一主题 下一主题
收起左侧

单片机数码管单片机时钟实验 C语言和汇编语言2个程序 还带Proteus仿真

[复制链接]
跳转到指定楼层
楼主
基于51单片机数码管显示的单片机时钟仿真原理图(proteus工程文件可到本帖附件下载):



单片机汇编语言程序:
  1. ;-----------------------------------------------------------------
  2. ;文件名称:SZ10-3.ASM
  3. ;程序功能:带倒计时的闹钟
  4. ;----------------------------------------------------------------
  5. ;******************* 闹钟(含插入倒计时)程序部分 *******************

  6. ;----- -------- 程序初始化 -------------
  7. ; 定义存放计时单元地址
  8.          ALB           EQU           20H.0     ;闹铃设置标志   
  9.          BUF           EQU           30H       ;30~33H 连续4个字节存放显示器数据
  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. ;程序开始执行地址
  30.          ORG       0H                     ;程序代码由地址0开始
  31.          JMP       MAIN
  32.          ORG       0BH                   ;定时器T0中断地址设置
  33.          JMP       TO_SRV

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

  35.   MAIN:                                           ;主程序
  36.          CLR       ALB                   ;清除闹铃标志   
  37.          ACALL     BZ                     ;蜂鸣器连续两次鸣响
  38.          ACALL     BZ         
  39.          ACALL     LED_BL                ;LED 闪动,表示程序开始执行
  40.          ACALL     INIT                   ;初始变化量
  41.          ACALL           INIT_TIMER            ;设置定时器

  42. ;加载显示器初值数据
  43.          MOV       A, #0C0H  
  44.          MOV       P0, A   

  45.   ;无穷循环
  46.   LOOP:                  
  47.          ACALL    CONV         
  48.          ACALL    TIME_PRO              ;检查闹铃时间   
  49.          ACALL    DISP                   ;扫描显示  

  50.   ;设置走时时间
  51.          JB         K1, M1                 ;未按下K1键,则继续扫描
  52.          ACALL     LED_BL                ;LED闪动
  53.          ACALL     SET_TIME              ;设置目前时间
  54.          JMP        LOOP                  ;跳转到LOOP处运行
  55.   
  56.   ;设置闹铃时间
  57.   M1:    JB        K2,  M2               ;未按下K2键,则继续扫描
  58.          ACALL     LED_BL     
  59.          ACALL     SET_ATIME            ;设置闹铃时间
  60.          JMP        LOOP                 ;跳转到LOOP处运行
  61.   
  62.   ;设置倒计时间
  63.   M2:    JB        K3, M3                 ;未按下K3键,则继续扫描
  64.         ;…………………………
  65.               ACALL    LED_BL
  66.               ACALL    DOWN_ATIME  ;设置倒计时间
  67.         ;…………………………
  68.           JMP             LOOP                   ;跳转到LOOP处运行
  69.   
  70.   M3:    JB              K4, M4                  ;未按下K4键,则继续扫描
  71.          CPL             ALB         
  72.          JNB              ALB, M31
  73.       
  74.   ;闹铃启动连续3次发出响声
  75.          ACALL     BZ
  76.          ACALL     BZ
  77.          ACALL     BZ
  78.          JMP       LOOP                   ;跳转到LOOP处运行

  79.   M31:
  80.          ACALL     BZ                      ;闹铃停止,发出一声响
  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               ;指向显示器显示缓冲区起始地址
  157.         MOV               R2,  #4                  ;循环执行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                      ;显示器显示缓冲区地址加1
  170.         DJNZ             R2, S1                  ;判断是否继续执行循环
  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键,则继续扫描
  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处执行

  190.   L1:   JB        K3, L2                  ;未按下K3键,则继续扫描
  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键,则继续扫描
  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键,则继续扫描
  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键,则继续扫描
  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键,则继续扫描
  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              ;调用执行检查闹铃时间处理子程序
  334.   BK:
  335.         RET

  336. ;---------- 执行闹铃时间处理子程序 -----------

  337.   TIME_OUT:                                ;所设置的闹铃数据到了
  338.    X1:  ACALL           LED_BL                ;LED闪动
  339.          ACALL           BZ                     ;蜂鸣器发声
  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,则继续扫描
  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,则继续扫描
  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                       ;循环执行
  382.   ;------------
  383.   S2:   JB               K4, S0                   ;未按下K4键,则继续扫描
  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);                          // 加载高字节计数初值   
  34.      TL0=-(4800%256);                          // 加载低字节计数初值   
  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++)                 // 循环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++)                 // 循环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++){                         // 外层循环
  118.     for(j=0;j<121;j++)                       // 内层循环
  119.     {;}}
  120.    }

  121. //------------------------------- 发声函数 --------------------------------

  122. // 发声
  123. void  fs_d ()                                         
  124.     {   
  125.       unsigned int j,y;                 // 声明无符号整型变量j, y        
  126.        {                    
  127.          for(y=0;y<1000;y++)            // 循环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)                                                  // 无限循环
  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黑下载附件…………
复制代码



该系列源码包含有很多非常经典,代码风格十分规范,而且注释详细的单片机例程,还带仿真,对于MCU学习特别是初学者是很有帮助的,全部源码下载(共25个项目):http://www.51hei.com/bbs/dpj-79328-1.html

本例程下载(含proteus仿真工程文件与源码):
单片机数码管单片机时钟实验.rar (62.5 KB, 下载次数: 59)

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:164479 发表于 2017-3-30 10:16 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:81140 发表于 2017-6-17 21:39 | 只看该作者
好资料            
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表