
要分析一个单片机 C 语言程序设计的秒表程序,需要考虑以下几个方面:
硬件平台:需要了解秒表程序所运行的单片机类型,以及硬件平台上可用的硬件资源,如定时器、显示器等。
时间计数方式:需要确定秒表程序使用的时间计数方式,是通过定时器实现周期性计时,还是通过程序每隔一段时间手动计时。
显示方式:需要确定秒表程序的显示方式,是通过数码管显示时间,还是通过 LCD 显示屏显示时间。
程序流程:需要分析秒表程序的主要流程,包括初始化、计时、显示等步骤。
程序细节:需要关注秒表程序中的细节,如处理溢出、计时格式
S_SEG SEGMENT STACK
DB 256 DUP()
S_SEG ENDS
D_SEG SEGMENT
COUNT DB 0 ;计时单元,初值为0
TENM DB ‘ 0’ ;10分计时单元,初值为0
MINUTE DB ‘0:’ ;分计时单元,初值为0
TENS DB ‘0’ ;10秒计时单元,初值为0
SECOND DB ‘0’ ;秒计时单元,初值为0
HAOM DB ‘0’ ;10毫秒计时单元,初值为0
HAO DB ’8’,’$’ ;毫秒计时单元,初值为8
D_SEG ENDS
C_SEG SEGMENT
ASSUME CS:C_SEG ,SS:S_SEG
START: MOV AX,D_SEG
MOV DS,AX
CLI ;先关中断,以获得INT1CH
MOV AX,351CH ;调用35H号系统功能
INT 21H ;返回ES:BX=中断向量(段:偏移)
PUSH BX ;栈中保存INT1CH原中断向量
PUSH ES
STI ;开中断,以使键盘工作
MOV AH,1 ;等待键按下
INT 16H
CLI ;关中断
MOV DX,SEG TIMER ;置新中断向量
MOV DS,DX
MOV DX,OFFSET TIMER ;DS:DX=新中断向量(段:偏移)
MOV AX,251CH
INT 21H
STI ;再开中断,以使键盘和INT1CH工作
CHECK: MOV AH ,1 ;检查有无键代码
INT 16H
JZ DISPLAY1 ;无码可读,就跳转显示(DISPLAY系统保留)]
MOV AH ,0 ;无码可读,就要读取它
INT 16H
CMP AL ,51H ;是’Q’吗
JE OVER ;是,返回DOS
DISPLAY1: MOV AX,D_SEG ;不是,就显示
MOV DS ,AX
ASSUME DS:D_SEG
LEA DX ,TENM ;DS:DX=显示字符串地址
MOV AH ,9 ;显示 mm :ssmsms
INT 21H
JMP CHECK ;返回CHECK,循环继续
OVER: CLI
POP DS ;由栈中取回INT1CH原向量
POP DX
MOV AX ,251CH ;设置INT1CH,恢复原向量
INT 21H
STI ;开中断
MOV AX ,4C00H ;返回DOS
INT 21H
;以下为使用INT 1CH的中断服务子程序
TIMER PROC FAR
PUSH AX
MOV AX , D_SEG
MOV DS , AX
ASSUME DS :D_SEG
INC COUNT ;计时单元增1
CMP COUNT , ‘2’ ;到110毫秒否
JL EXIT ;不到,则返回
MOV COUNT , ‘0’ ;到,则计时单元清0
INC HAOM ;10毫秒计时单元增1
CMP HAOM ,’9’ ;到1秒否
JLE EXIT ;不到,则返回
INC SECOND ;到,则秒计时单元增1
MOV HAOM , ‘0’ ;10毫秒计时单元清0
CMP SECOND ,‘9’ ;到10秒否
JLE EXIT ;不到,则返回
MOV SECOND ,‘0’ ;到,则秒计时单元清0
INC TENS ;10秒计时单元增1
CMP TENS ,‘6’ ;到60秒否
JL EXIT ;不到,则返回
MOV TENS ,‘0’ ;到 ,则10秒计时单元清0
INC MINUTE ;分计时单元清0
CMP MINUTE ,‘9’ ;到10分 否
JLE EXIT ;不到,则返回
MOV MINUTE ,‘0’ ;到,则分计时单元清0
INC TENM ;10分计时单元增1
CMP TENM ,‘6’ ;到60分否
JL EXIT ;不到,则返回
MOV TENM ,‘0’ ;到,则10分计时单元清0,重新开始计时
EXIT: POP AX
IRET
TIMER ENDP
C_SEG ENDS
END START
CLK: CLK为时钟信号;
CLR: 为异步复位信号;
PAUSE: 为暂停信号;
MSH,MSL: 百分秒的高位和低位;
SH,SL: 秒信号的高位和低位;
MH,ML: 分钟信号的高位和低位。 /
module paobiao(CLK,CLR,PAUSE,MSH,MSL,SH,SL,MH,ML);
input CLK,CLR;
input PAUSE;
output[3:0] MSH,MSL,SH,SL,MH,ML;
reg[3:0] MSH,MSL,SH,SL,MH,ML;
reg cn1,cn2; //cn1为百分秒向秒的进位,cn2为秒向分的进位
//百分秒计数进程,每计满100,cn1产生一个进位
always @(posedge CLK or posedge CLR)
begin
if(CLR) begin //异步复位
{MSH,MSL}<=8'h00;
cn1<=0;
end
else if(!PAUSE) //PAUSE为0时正常计数,为1时暂停计数
begin
if(MSL==9) begin
MSL<=0;
if(MSH==9)
begin MSH<=0; cn1<=1; end
else MSH<=MSH+1;
end
else begin
MSL<=MSL+1; cn1<=0;
end
end
end
//秒计数进程,每计满60,cn2产生一个进位
always @(posedge cn1 or posedge CLR)
begin
if(CLR) begin //异步复位
{SH,SL}<=8'h00;
cn2<=0;
end
else if(SL==9) //低位是否为9
begin
SL<=0;
if(SH==5) begin SH<=0; cn2<=1; end
else SH<=SH+1;
end
else
begin SL<=SL+1; cn2<=0; end
end
//分钟计数进程,每计满60,系统自动清零
always @(posedge cn2 or posedge CLR)
begin
if(CLR)
begin {MH,ML}<=8'h00; end //异步复位
else if(ML==9) begin
ML<=0;
if(MH==5) MH<=0;
else MH<=MH+1;
end
else ML<=ML+1;
end
endmodule
给一个数字跑表的程序给你参考,你可以加到你的程序去
以上就是关于如何分析单片机C语言程序设计10秒的秒表的程序全部的内容,包括:如何分析单片机C语言程序设计10秒的秒表的程序、汇编语言编写一个简单的电子秒表、哪位大大帮我看下这段Verilog代码哪里有问题啊~等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)