单片机秒表课程设计,急求!!!!

2024-11-25 10:57:20
推荐回答(4个)
回答1:

原理图如下,

程序如下:

;=================================================

;寄存器分配定义

;=================================================

LED_BUF EQU 50H ;显示数据首址

COUNTER_INT EQU 3BH ;中断计数器

SECOND     EQU 3DH     ;秒单元

;=================================================

;常数定义

;=================================================

 CN_COUNT_INT  EQU  100     ;10ms * 100 = 1S

 SET_MODEL EQU 0FFH ;完全译码模式

 SET_BRIGHT EQU 04H ;占空比为15/32;显示亮度;

 SET_LIMIT EQU 01H ;2位显示方式;

 SET_NORMAL EQU 01H ;测试模式

 SET_START EQU 01H ;进入启动工作方式?

;=================================================

;管脚分配定义

;=================================================

 m7219_DIN BIT P3.0

 m7219_LOAD BIT P3.1

 m7219_CLK BIT P3.2

 

 KEYSTART BIT P1.0

 KEYRESET BIT P1.1

;============================================

;模拟主程序

;===========================================


org 0000h

ajmp main

    ORG 000BH

    LJMP Timer0Interrupt

    

org 0030h

main: 

mov sp,#70h


lcall Init_M7219

lcall InitTimer0

; MOV SECOND,#95H  ;TEST

Loop:

CALL disp

key_reset:

SETB KEYRESET

JB KEYRESET,key_start

; DELAY

NOP

NOP

NOP

JB KEYRESET,key_start

JNB KEYRESET,$

CLR  TR0

MOV A,#0

MOV SECOND,A

MOV led_buf,A

    MOV LED_BUF+1,A

JMP key_SCAN_END

key_start:

SETB KEYSTART

JB KEYSTART,key_SCAN_END

; DELAY

NOP

NOP

NOP

JB KEYSTART,key_SCAN_END

JNB KEYSTART,$

SETB  TR0

key_SCAN_END:


JMP loop

;===========================================

InitTimer0:;10ms一次中断

    MOV TMOD,#01H

    MOV TH0,#0D8H

    MOV TL0,#0F0H

    SETB EA

    SETB ET0

    RET

;===========================================

Timer0Interrupt:

    PUSH DPH

    PUSH DPL

    PUSH ACC

    MOV TH0,#0D8H

    MOV TL0,#0F0H

    ;========================

    INC COUNTER_INT

MOV  A,COUNTER_INT        ;10ms 计数值加1

CJNE  A,#CN_COUNT_INT,Timer0Interrupt_EXIT

MOV  COUNTER_INT,#0

MOV A,SECOND

CJNE  A,#99H,Timer0Int_sec

CLR TR0;关闭计时

JMP Timer0Interrupt_EXIT  

Timer0Int_sec:

ADD A,#01     ;秒加1   

DA A

MOV  SECOND,A

SWAP A

ANL A,#0fH

MOV led_buf,A

MOV A,SECOND

ANL A,#0FH

    MOV LED_BUF+1,A

    ;========================

Timer0Interrupt_EXIT:    

    POP ACC

    POP DPL

    POP DPH

    RETI

;====================================================

; function:Init_M7219 ;初始化max719

; input: ------------

; output: ----------  

; usage: a,b

;====================================================

Init_M7219:   ;初始化Max7219

MOV a,#0bh  ;设置扫描界限

MOV b,#set_limit ;设置位数

lcall w_7219

MOV a,#09h  ;设置译码模式

MOV b,#set_model ;00h非译码模式;ffh为BCD译码模式

lcall w_7219

MOV a,#0ah  ;设置亮度

MOV b,#set_bright ;15/32亮度

lcall w_7219

MOV a,#0fh  ;设置工作方式

MOV b,#set_normal ;正常工作方式

lcall w_7219

MOV a,#0ch  ;进入启动工作方式

MOV b,#set_start

lcall  w_7219

RET


;===================================================

; function:disp  ;显示子程序

; input: r0

; output: -----------

; usage: r0,r3,r4,a,b

;===================================================

disp:

MOV r0,#led_buf

MOV r4,#01h

MOV r3,#set_limit

INC r3

disp1:

MOV a,@r0

MOV b,a

MOV a,r4

lcall w_7219

INC r0

INC r4

djnz r3,disp1

RET 


;===================================================

; function:w_7219 ;显示驱动程序;

; input: a  ;传送7219的地址

;        b  ;传送7219的数据

; output:-------------

; usage: a,r2

;====================================================

w_7219:

CLR M7219_clk

CLR M7219_din

CLR  M7219_load ;置load=0

lcall  sd_7219  ;传送7219的地址

MOV a,b 

lcall sd_7219  ;传送数据

setb M7219_load  ;数据装载

CLR M7219_din

RET

;=================================================

; function:sd_7219  ;向7219传送数据或地址子程序

; input:    a

; output:   max7219

; usage:   a, r2

;==================================================

sd_7219:   ;向7219送地址或数据

MOV r2,#08h  

c_sd: 

CLR C

CLR M7219_clk

RLC a

MOV M7219_din,c ;准备数据

NOP

setb M7219_clk ;上升沿将数据传入

NOP

NOP

CLR M7219_clk

djnz r2,c_sd

RET


 END

回答2:

已经过去好多天了,还需要答案吗?

回答3:

交流
球球我吧

回答4:

汇编还是C?