用8255实现电子钟功能

电子钟

大作业内容
利用 8253 和 8259 芯片实现实时电子时钟的功能;利用 8255 控制七段数码
管完成定时扫描显示。显示格式为 xx 时 xx 分 xx 秒,每隔 1s,时间值改一次。
开关 1 可选择时、分、秒,开关 2 可对所选的时、分、秒进行加 1,小时加至 23
后清 0,分、秒加至 59 后清 0。

大作业要求
1、查阅资料,掌握共阳极七段数码管的工作原理。
2、分析实验原理,设计实验方案,绘出实验连线图,搭建仿真实验电路。
3、绘制实验程序流程图。
4、编写实验程序,检查无误后,编译、链接并进行仿真实验。
5、运行实验程序,验证程序功能。

扩展要求:
能够使电子钟定时闹钟,例如在 06:30:00 时,点亮 LED 灯进行闹钟报警。

实现代码如下:

TCONTRO   EQU 0A006H ;8253控制字寄存器
TCON0     EQU 0A000H ;计数器0
TCON1     EQU 0A002H ;计数器1
TCON2     EQU 0A004H ;计数器2

ICW1    EQU   13H  ;8259上升沿触发,单片8259A,要写ICW4
ICW2    EQU   20H  ;IR0的中断向量码为20H
ICW4    EQU   03H  ;一般嵌套,非缓冲方式,自动EOI
OCW1  EQU   00H  ;允许中断
A8259  EQU   0C000H ;8259端口地址
B8259  EQU   0C002H;8259ICW2、ICW3等的地址

ABC8255	EQU	  80H;8255工作在方式0,A口和B口输出,C口也输出
A8255       EQU   8000H;8255A口地址
B8255       EQU   8002H;8255B口地址
C8255	EQU	  8004H;8255C口地址

CODE 	SEGMENT 
		ASSUME 	CS:CODE,DS:DATA,SS:STACK
ORG		800H
START:	  MOV   	AX,DATA	                        
		  MOV   	DS,AX
		  MOV	AX,STACK
		  MOV	SS,AX
		  MOV      SP,64H;定义栈顶位置,避免系统找不到栈
		  
		  
		  MOV	DX,TCONTRO ;8253初始化
		  MOV	AL,36H;计数器0工作在方式3
		  OUT	DX,AL
		  
		  MOV 	DX,TCON0
		  MOV 	AL,0E8H
		  OUT 	DX,AL
		  MOV 	AL,03H
		  OUT 	DX,AL;给计数器0设初值为1000
		  
		  MOV	DX,TCONTRO
		  MOV	AL,76H ;计数器1工作在方式3
		  OUT 	DX,AL
		  
		  MOV	DX,TCON1
		  MOV 	AL,0E8H
		  OUT 	DX,AL
		  MOV 	AL,03H
		  OUT 	DX,AL;给计数器1设初值为1000,OUT1的输出频率为1HZ
		  
		  MOV   DX, A8259;写ICW,8259初始化
		  MOV   AL, ICW1
		  OUT   DX, AL

		  MOV   DX, B8259;写ICW2,ICW4,OCW1
		  MOV   AL, ICW2
		  OUT   DX, AL

		  MOV   AL, ICW4
		  OUT   DX, AL

		  MOV   AL, OCW1
		  OUT   DX, AL 
                  PUSH DS;在写中断前把DS保护起来,避免覆盖中断向量表
		  MOV   AX ,0
		  MOV   DS ,AX
		  MOV   SI , 80H ;建立中断向量表
		  
		   MOV     AX,OFFSET HINT0  ;循环调整标志位COUNT的值为012之一,0代表调整HOUR,1代表调整MIN,2代表调整SEC
		   MOV     DS:[SI],AX ;存储中断一的IP偏移地址     
		   ADD     SI,2            
		   MOV     AX,CS           
		   MOV     DS:[SI],AX ;存储中断程序地址  ,CS基地址          
      
		   ADD  	SI,2 
		   MOV   	AX, OFFSET HINT1 ;选定相应的时 分 秒 数据段
		   MOV    	DS:[SI],AX  ;存储中断二的IP偏移地址     
		   ADD     	SI,2            
		   MOV     AX,CS           
		   MOV     DS:[SI],AX   ;存储中断程序地址  ,CS基地址 
		   
		   ADD  	SI,2 
		   MOV   	AX, OFFSET HINT2 ;中断三,接入OUT1,每次来一个高脉冲给秒加1,并且调整整个时分秒显示,使其显示合理
		   MOV    	DS:[SI],AX  ;存储中断三的IP偏移地址     
		   ADD     	SI,2            
		   MOV   	AX,CS           
		   MOV    	DS:[SI],AX   ;存储中断程序地址  ,CS基地址 
		   POP DS
		  
		   MOV     DX,8006H                      ;8255初始化
		   MOV     AX,80H                          ;工作方式0
		   OUT      DX,AX
		   STI;开中断

PRINT:	   XOR	AX,AX
		   XOR      BX,BX;清零,避免可能的影响
		   MOV 	CX,8;循环显示8次,对于晶体管的八个位
		   LEA 	DI,HOURH;初始时让指针DI指向HOURH
		   LEA	SI,NUM;SI用于判断要显示什么数
		   
PRINT1:	   MOV	DX,A8255
		   MOV	AL,WEI
		   OUT	DX,Al  
		   ROL	AL,1;左移,为显示下一个数做准备
		   MOV	WEI,AL
		   MOV	DX,B8255
		   MOV	BL,[DI]
		   MOV	AL,[SI+BX];取相应数字的显示代码
		   OUT	DX,Al;显示选好的数字代码
		   INC	DI;指向下一个要显示的数字所在的存储单元
		   CALL	DELAY
		   MOV 	AL,0FFH;清空显示,很重要,没有此操作会发生数字之间的重叠现象
		   OUT 	DX,AL
		   LOOP 	PRINT1
		   MOV	DX,C8255
		   MOV	AL,0H
		   OUT	DX,AL
		   MOV	AL,SECL;开始判断此时时间是不是063000
		   CMP	AL,0H
		   JZ		JSECH
		   JMP	PRINT

JSECH:	   MOV	AL,SECH
		   CMP	AL,0H
		   JZ		JMINL
		   JMP	PRINT
		   
JMINL:	   MOV	AL,MINL
		   CMP	AL,0H
		   JZ		JMINH
		   JMP	PRINT

JMINH:	   MOV	AL,MINH
		   CMP	AL,03H
		   JZ		JHOURL
		   JMP	PRINT

JHOURL:	   MOV	AL,HOURL
		   CMP	AL,06H
		   JZ		JHOURH
		   JMP	PRINT

JHOURH:	   MOV	AL,HOURH
		   CMP	AL,0H
		   JZ		ALARM
		   JMP	PRINT

ALARM:	   MOV	DX,C8255
		   MOV	AL,01H
		   OUT	DX,AL
		   CALL	DELAY
		   JMP	PRINT
		   
HINT0:	  ;根据按动开关的次数修正COUNT的值
		  PUSH	AX
		  PUSH	DX
		  MOV	AL,COUNT
		  INC		AL
		  CMP	AL,03H
		  JZ		TCOUNT
		  MOV 	COUNT,AL
		  
END0:	   POP	DX
		   POP	AX
		 
		   IRET ;中断返回指令		  

TCOUNT:	   MOV   	AL,0H;若COUNT加一后是3则给它清零
		   MOV	COUNT,AL
		   JMP	END0
	   
HINT1:	   ;修改选定的区域,选定时则修改时。。。。。。
		   PUSH	AX
		   PUSH	DX
		   MOV	AL,COUNT
		   CMP	AL,0;如果count是0就调节时
		   JZ		AHOURL
		   CMP	AL,1;如果count是1就调节分
		   JZ		AMINL
		   CMP	AL,2;如果count是2就调节秒
		   JZ		ASECL
		   
END1:	   POP	DX
		   POP	AX
		   
		   IRET;中断返回指令

AHOURL:	   MOV	AL,HOURL
		   INC	AL
		   CMP	AL,0AH
		   JZ		AHOURH1
		   CMP	AL,04H
		   JZ		AHOURH2
		   MOV	HOURL,AL
		   JMP	END1
		   
AHOURH1:   MOV	AL,0H
		    MOV	HOURL,AL
		    MOV	AL,HOURH
		    INC	AL
		    MOV	HOURH,AL
		    JMP	END1

AHOURH2:   MOV	AH,HOURH;判断时是否到了24
		   CMP	AH,02H
		   JZ		AHOURH3;时的双位清零
		   MOV	HOURL,AL
		   MOV	HOURH,AH
		   JMP	END1

AHOURH3:  MOV	AL,0H;时到达24时,清零
		   MOV	HOURL,AL
		   MOV	HOURH,AL
		   JMP	END1

AMINL:	   MOV	AL,MINL
		   INC	AL
		   CMP	AL,0AH
		   JZ		AMINH1
		   MOV	MINL,AL
		   JMP	END1
		   
AMINH1:	   MOV	AL,0H
		   MOV	AH,MINH
		   INC	AH
		   CMP	AH,06H
		   JZ		AMINH2
		   MOV	MINL,AL
		   MOV	MINH,AH
		   JMP	END1
		   
AMINH2:	   MOV	AH,0H
		   MOV	MINH,AH
		   MOV	MINL,AH
		   JMP	END1
		   
ASECL:	   MOV	AL,SECL
		   INC	AL
		   CMP	AL,0AH
		   JZ		ASECH1
		   MOV	SECL,AL
		   JMP	END1
		   
ASECH1:	   MOV	AL,0H
		   MOV	AH,SECH
		   INC	AH
		   CMP	AH,06H
		   JZ		ASECH2
		   MOV	SECL,AL
		   MOV	SECH,AH
		   JMP	END1
		   
ASECH2:	   MOV	AH,0H
		   MOV	SECH,AH
		   MOV	SECL,AH
		   JMP	END1
		   
HINT2:	   PUSH	AX
		   PUSH	DX
		   MOV	AL,SECL
		   INC 	AL
		   CMP	AL,0AH
		   JZ		TSECH;转入秒低位重置函数
		   MOV	SECL,AL
		   
END2:	   POP	DX
		   POP	AX

		   IRET ;中断返回指令
	           
TSECH:	   MOV	AL,0H;将秒低位重置为0
		   MOV	SECL,AL;将秒低位装入存储器
		   MOV      AL,SECH
		   INC        AL
		   CMP     	AL,06H
		   JZ         TMINL;转入分的低位重置函数
		   MOV     SECH,AL;将秒高位存起来
		   JMP      END2
		   
TMINL:	   MOV	AL,0H;将秒高位重置为0
		   MOV	SECH,AL
		   MOV	AL,MINL
		   INC	AL
		   CMP	AL,0AH;
		   JZ		TMINH;转入分的高位重置函数
		   MOV	MINL,AL;
		   JMP	END2
		   
TMINH:	   MOV	AL,0H;将分低位重置为0
		   MOV	MINL,AL
		   MOV	AL,MINH
		   INC	AL
		   CMP	AL,06H
		   JZ		THOURL
		   MOV	MINH,AL
		   JMP	END2
		   		   
THOURL:	   MOV	AL,HOURL
		   INC	AL
		   CMP	AL,0AH;
		   JZ		THOUR1;转入时的低位重置函数
		   CMP	AL,04H
		   JZ		THOUR2;转入时的高与地位重置函数
		   MOV	HOURL,AL
		   JMP	END2

THOUR1:	   MOV	AL,0H;将时的低位置零
		   MOV	HOURL,AL
		   MOV	AL,HOURH;给时的高位进位
		   INC	AL
		   MOV	HOURH,AL
		   JMP	END2

THOUR2:	   MOV	AH,HOURH;判断时是否到了24
		   CMP	AH,02H
		   JZ		THOUR3;时的双位清零
		   MOV	HOURL,AL
		   MOV	HOURH,AH
		   JMP	END2

THOUR3:	   MOV	AL,0H;时到达24时,清零
		   MOV	HOURL,AL
		   MOV	HOURH,AL
		   MOV	MINH,AL
		   JMP	END2
DELAY:  
		   PUSH CX
		   MOV CX,5
DELAY1:	
		   NOP
		   LOOP DELAY1
		   POP CX
		   RET
	

CODE	ENDS

DATA	SEGMENT
WEI 		DB 	01H;用于选通哪一位数显示,显示一次左移一次
COUNT 	DB	0H;标志位,用于确定调节的是时、分、秒,按一次SW1加一,到2归零
HOURH	DB	0H;存放时的高位
HOURL	DB	0H;存放时的低位
	        DB    0AH;横线位置为num偏移10
MINH	DB	0H;存放分的高位
MINL	DB	0H;存放分的低位
	        DB    0AH;横线位置为num偏移10
SECH	DB	0H;存放秒的高位
SECL	DB	0H;存放秒的低位
NUM         DB    0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H     ;共阳极对应的数字显示,0~9
                DB 	0BFH;横线段码
DATA 	ENDS


STACK   SEGMENT 
STA     DB  200 DUP(0)
TOP     EQU LENGTH STA
STACK   ENDS



		END START 
                   
		  

电路连接为:
SW1用于选择要调整的是时、分还是秒,SW2用于调整SW1选定的区域,LED用于实现闹钟功能
鉴于私信和评论中有许多同学需要源码,现将代码文件夹分享于此:
链接:https://pan.baidu.com/s/1fokrFT94BG_pDRj23kObgA?pwd=us35
提取码:us35

  • 13
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值