您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页单片机课程设计数字钟的设计

单片机课程设计数字钟的设计

来源:华佗小知识
实验任务

(1. 开机时,显示12:00:00的时间开始计时; (2. P0.0/AD0控制“秒”的调整,每按一次加1秒; (3. P0.1/AD1控制“分”的调整,每按一次加1分; (4. P0.2/AD2控制“时”的调整,每按一次加1个小时;

2. 电路原理图

P0_0~P0_3要加上拉电阻。

图4.20.1

3. 系统板上硬件连线

(1. 把“单片机系统”区域中的P1.0-P1.7端口用8芯排线连接到“动态数码显示”区域中的A

-H端口上;

(2. 把“单片机系统:区域中的P3.0-P3.7端口用8芯排线连接到“动态数码显示”区域中的S1

-S8端口上; (3. 把“单片机系统”区域中的P0.0/AD0、P0.1/AD1、P0.2/AD2端口分别用导线连接到“式

键盘”区域中的SP3、SP2、SP1端口上;

4. 相关基本知识

(1. 动态数码显示的方法 (2. 式按键识别过程

(3. “时”,“分”,“秒”数据送出显示处理方法

5. 程序框图

6. 汇编源程序

SECOND EQU 30H MINITE EQU 31H HOUR EQU 32H HOURK BIT P0.2 MINITEK BIT P0.1 SECONDK BIT P0.0 DISPBUF EQU 40H DISPBIT EQU 48H T2SCNTA EQU 49H T2SCNTB EQU 4AH TEMP EQU 4BH

ORG 00H LJMP START ORG 0BH LJMP INT_T0

START: MOV SECOND,#00H MOV MINITE,#00H MOV HOUR,#12 MOV DISPBIT,#00H MOV T2SCNTA,#00H MOV T2SCNTB,#00H MOV TEMP,#0FEH

LCALL DISP ;2KB范围内长调用 MOV TMOD,#01H

MOV TH0,#(65536-2000) / 256 ;2ms MOV TL0,#(65536-2000) MOD 256 SETB TR0 SETB ET0 SETB EA

WT: JB SECONDK,NK1 ;SECONDK是1转NK1,即按键SP1按下时转. LCALL DELY10MS JB SECONDK,NK1 INC SECOND MOV A,SECOND CJNE A,#60,NS60 MOV SECOND,#00H NS60: LCALL DISP JNB SECONDK,$ NK1: JB MINITEK,NK2 LCALL DELY10MS JB MINITEK,NK2 INC MINITE MOV A,MINITE CJNE A,#60,NM60 MOV MINITE,#00H NM60: LCALL DISP JNB MINITEK,$ NK2: JB HOURK,NK3 LCALL DELY10MS JB HOURK,NK3 INC HOUR MOV A,HOUR CJNE A,#24,NH24 MOV HOUR,#00H NH24: LCALL DISP

JNB HOURK,$

NK3: LJMP WT DELY10MS:

MOV R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET

DISP: ;将得出的时间存入40H (DISPBUF)之后的地址 MOV A,#DISPBUF ADD A,#8 DEC A MOV R1,A MOV A,HOUR MOV B,#10 DIV AB

MOV @R1,A ;累加器送内部RAM单元 @R1与R1区分?:@R1——R1为地址,@R1指向其内容。

R1 ——R1为变量,

DEC R1 MOV A,B MOV @R1,A DEC R1

MOV A,#10 ;输出符号“—” MOV@R1,A DEC R1

MOV A,MINITE MOV B,#10 DIV AB

MOV @R1,A DEC R1 MOV A,B MOV @R1,A DEC R1 MOV A,#10 MOV@R1,A DEC R1

MOV A,SECOND MOV B,#10 DIV AB

MOV @R1,A DEC R1 MOV A,B MOV @R1,A DEC R1 RET INT_T0:

MOV TH0,#(65536-2000) / 256 MOV TL0,#(65536-2000) MOD 256 MOV A, #0FFH MOV P3,A

MOV A,#DISPBUF

ADD A,DISPBIT ;地址加,并将时间的各位送到P1。 MOV R0,A MOV A,@R0

MOV DPTR,#TABLE MOVC A,@A+DPTR MOV P1,A

MOV A,DISPBIT MOV DPTR,#TAB MOVC A,@A+DPTR MOV P3,A INC DISPBIT MOV A,DISPBIT CJNE A,#08H,KNA MOV DISPBIT,#00H

KNA: INC T2SCNTA ;******时间的增加与进位****** MOV A,T2SCNTA CJNE A,#100,DONE MOV T2SCNTA,#00H INC T2SCNTB MOV A,T2SCNTB

CJNE A,#05H,DONE MOV T2SCNTB,#00H INC SECOND MOV A,SECOND CJNE A,#60,NEXT MOV SECOND,#00H INC MINITE MOV A,MINITE CJNE A,#60,NEXT MOV MINITE,#00H INC HOUR MOV A,HOUR CJNE A,#24,NEXT MOV HOUR,#00H NEXT: LCALL DISP DONE: RETI

TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H ;40H代表符号“—” TAB: DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,07FH END

7. C语言源程序

#include

unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; unsigned char dispbitcode[]={0xfe,0xfd,0xfb,0xf7, 0xef,0xdf,0xbf,0x7f};

unsigned char dispbuf[8]={0,0,16,0,0,16,2,1}; //初始化使显示时间的位全为12:00:00,其他都不点亮; 当将dispbitcode[2] 和dispbitcode[3]对应的16改为X(10~15中的一个),并将其指向dispcode[16]即0x00改为dispcode[X]即0x40。时分秒的间隔就为“—”。 unsigned char dispbitcnt; unsigned char second; unsigned char minite; unsigned char hour; unsigned int tcnt;

unsigned char mstcnt; unsigned char i,j; void main(void) {

TMOD=0x02; TH0=0x06; TL0=0x06; TR0=1; ET0=1; EA=1; hour=12; while(1) {

if(P0_0==0)

{

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_0==0) {

second++; if(second==60) {

second=0; }

dispbuf[0]=second%10; dispbuf[1]=second/10; while(P0_0==0); } }

if(P0_1==0) {

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_1==0) {

minite++; if(minite==60) {

minite=0; }

dispbuf[3]=minite%10; dispbuf[4]=minite/10; while(P0_1==0); } }

if(P0_2==0) {

for(i=5;i>0;i--) for(j=248;j>0;j--); if(P0_2==0) {

hour++; if(hour==24) {

hour=0; }

dispbuf[6]=hour%10; dispbuf[7]=hour/10; while(P0_2==0); } } } }

void t0(void) interrupt 1 using 0 {

mstcnt++; if(mstcnt==8) {

mstcnt=0;

P3=0xff; //关闭所有显示 P1=dispcode[dispbuf[dispbitcnt]]; P3=dispbitcode[dispbitcnt]; dispbitcnt++; if(dispbitcnt==8) {

dispbitcnt=0; } } tcnt++;

if(tcnt==4000) {

tcnt=0; second++; if(second==60) {

second=0; minite++; if(minite==60) {

minite=0; hour++; if(hour==24) {

hour=0; } } }

dispbuf[0]=second%10; dispbuf[1]=second/10; dispbuf[3]=minite%10; dispbuf[4]=minite/10; dispbuf[6]=hour%10; dispbuf[7]=hour/10; } }

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务