单片机课程设计 秒表设计

作者&投稿:潭爽 (若有异议请与网页底部的电邮联系)
单片机秒表课程设计,急求!!!!~

原理图如下,

程序如下:
;=================================================
;寄存器分配定义
;=================================================
LED_BUFEQU 50H ;显示数据首址
COUNTER_INT EQU 3BH ;中断计数器
SECOND EQU 3DH ;秒单元
;=================================================
;常数定义
;=================================================
CN_COUNT_INT EQU 100 ;10ms * 100 = 1S
SET_MODELEQU 0FFH ;完全译码模式
SET_BRIGHT EQU 04H ;占空比为15/32;显示亮度;
SET_LIMITEQU 01H ;2位显示方式;
SET_NORMAL EQU 01H ;测试模式
SET_STARTEQU 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
JBKEYRESET,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
JBKEYSTART,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

这个用到定时器和控制ram rom功能 具体可联系我

#include<reg51.h>#include<stdio.h>#define dat P0
#define uchar unsigned char#define uint unsigned int
sbit seg1 = P2^0;sbit seg2 = P2^1;sbit seg3 = P2^2;sbit seg4 = P2^3;
uchar a,b,c,d;uint timeout=0,us=0,ms=0;uchar code table[]={0xC0,0xF9,0xA4,0xB0, 0x99,0x92,0x82,0xF8, 0x80,0x90,0x88,0x83, 0xC6,0xA1,0x86,0x8E}; //共阳
/*uchar code table[]={0x3f,0x06,0x5b,0x4f, //0~3 0x66,0x6d,0x7d,0x07, //4~7 0x7f,0x6f,0x77,0x7c, //8~b 0x39,0x5e,0x79,0x71}; //共阴 */
void delay(uint z){while(z--);}
void display(){ dat = table[a]; seg1 = 0; delay(1000); seg1 = 1; dat = 0xff; dat = table[b]-0x80; seg2 = 0; delay(1000); seg2 = 1; dat = 0xff; dat = table[c]; seg3 = 0; delay(1000); seg3 = 1; dat = 0xff; dat = table[d]; seg4 = 0; delay(1000); seg4 = 1; dat = 0xff; }
void InitTimer0(void){ TMOD = 0x01; TH0 = (65536-10000)/256; TL0 = (65536-10000)%256; EA = 1; ET0 = 1; TR0 = 1;}
void main(void){ InitTimer0(); while(1) { d = us%10; c = us/10; b = ms%10; a = ms/10; display(); }}
void Timer0Interrupt(void) interrupt 1{ TH0 = (65536-10000)/256; TL0 = (65536-10000)%256; //add your code here! timeout++; if(timeout==1) { timeout = 0; us++; if(us==100) { us = 0; ms++; { if(ms==100) { ms = 0; } } } }}




千山区17367474563: 单片机秒表功能设计 -
本凡斯特: 采用51的单片机即可实现.用定时器计时,每秒进位,输出到LED数码管上显示即可.利用一个外部中断,按键决定何时显示秒和分(也可在LED上同时显示分和秒).

千山区17367474563: 单片机电子秒表课程设计 -
本凡斯特: ORG 0000H LJMP MAIN ORG 0003H ;外部中断INT0中断入口 LJMP KAISHI ORG 000BH ;定时器T0中断入口 LJMP UPDATE ORG 0013H ;外部中断INT1中断入口 LJMP TINGZHI MAIN: MOV DPTR, #TAB ;存入表头地址 MOV TMOD, #01H ...

千山区17367474563: 急求单片机课程设计电子秒表
本凡斯特: 秒表的设计程序用89C51,外接晶振,复位电路,二个数码管,二个按键,做一个电子秒表, 具体要求为用按键起停电子表,可用按键设计倒计时时间(如10S,20S,60S), 并启动倒计时功能.能用按键选择以上两功能之一. 三、程序代码: ...

千山区17367474563: 单片机 电子秒表的设计 -
本凡斯特: 首先,你选择一个合适的晶振,算好延迟多长时间能到1毫秒 其次,选好用单片机哪个口作为复位、启动、停止、暂停、继续、连接数码管及数码管的位选等 再就是画一画电路图了,Protel DXP里弄一弄,就好了 等PCB做好了以后,焊好就能用了,电路图我可以给你一个类似的设计图

千山区17367474563: 单片机秒表设计!! -
本凡斯特: #include <reg51.h> #include <intrins.h> unsigned char data dis_digit; unsigned char key_s, key_v; unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off unsigned char dis_buf[...

千山区17367474563: 单片机的秒表设计的程序 -
本凡斯特: 这个程序本身思路都已经非常清晰了呀,主要就是再把流程优化下即可了.定时器T0只负责产生秒信号,用两个计数单元来计数需要显示的内容,在低位秒信号满100后清零同时把高位单元加一,还有就是对按键的处理和显示的处理问题上,比如两个键同时按下如何处理,显示是用锁位来实现,还是不停的动态扫描实现等等

千山区17367474563: 51单片机完成简易秒表的设计 -
本凡斯特: 设计思路:1.定时器计时 设置秒表最小单位(如ms)设置定时器的寄存器初始值,定时器溢出显示等.2.键盘扫描 可设置中断也可直接键盘扫描,因键较少可以不必接成矩阵.可以只用三个键来实现. 键1:功能选择,包括功能设置、准备计时等 键2:计时开始,向上调整时间 键3:计时停止,向下调整时间3.显示 看单片机引脚多少,可以直接静态显示,可以用移位寄存器增加管脚功能.

千山区17367474563: 用51单片机做秒表设计 -
本凡斯特: 遇到懒学生了,这个不就是一个定时器加显示吗,有什么难的,自己翻翻微机原理书就可以做 了,也就四五十行汇编语言就行了,用C就更加简单,具体的方法:用定时器定时0.2ms,定时到了就给固定的一个变量加1,然后判断这个变量是不是到了500,到了就清零然后把秒的变量加1,就是1s了,(分和时也是如此,秒为60,秒清零,分加1);主程序就只管显示和按键,按键随便用中断还是查询,我建议你查询,因为程序简单,显示程序就是查个表,自己把数码显示的断码表编好就可以了,把秒的数值查表对应显示,完了就查询按键,按键累加,值为0是没按,1是按1次,2是按2次,3是按3次,同时清零,很简单的

千山区17367474563: AT89C51单片机设计一个简易秒表? -
本凡斯特: 定时器10ms中断 检测按键且10ms位加一 若10ms=10,100ms位加一 若10ms=10,1000ms位加一 以此内推 显示最好用LCD的 用数码管的也行 有疑问mail:290765583@163.com

千山区17367474563: 用51单片机设计一个秒表,计时范围从00:00 - 59:59. -
本凡斯特: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网