60秒倒计时程序代码
倒计时60秒程序(单片机C51)
倒计时60秒程序(单片机C51)#include#define uint unsigned int#define uchar unsigned charuchar code table[]={0xc0,0xf9,0xa4, 0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};sbit gew=P2^1;sbit shiw=P2^0;sbit k2=P1^0;uchar num,num1=60,num2,shi,ge;void Init(){TMOD=0X01; TH0=(65536-50000)%256; TL0=(65536-50000)%256;EA=1;ET0=1; TR0=1;}void delay(uint xms) //延时子函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void scankey() //键盘检测子函数{if(k2==0) //检测键是否被按下{delay(5); //延时消除抖动if(k2==0) //重新读取k2的值{num2++; //num2为按次数标志位while(!k2); //等待按键释放if(num2==1) //按键一次计时停止TR0=0;if(num2==2) //按键两次计时开始{TR0=1;}}}}void main() //主函数{Init(); //初始化子函数调用while(1){scankey(); //不断键盘扫描gew=0; //打开数码管个位位选P0=table[ge]; //数码管个位赋值delay(1); //延时送入数据的反应时间gew=1; //关闭数码管个位位选delay(1);shiw=0; //打开数码管十位位选P0=table[shi]; //送入数据delay(1);shiw=1; //关闭数码管十位位选delay(1);}}void Timer0() interrupt 1{TH0=(65536-50000)/256; //定时器重装初值TL0=(65536-50000)%256;num++;if(num==20) //定时器每进行一个周期num加1,运行20个周期即为1s{num=0; //到1秒,num清0重新开始num1--; //倒计时1秒if(num1==0)num1=60;shi=num1%10; //两位数分离赋给数码管十位显示ge=num1%10; //两位数分离赋给数码管个位显示}}。
vb倒计时源程序代码
Module Module1Sub Main()Dim a As DateDim h, m, s As IntegerDim n, i As LongDim x, z As LongDim y As LongConsole.WriteLine("本程序为倒计时程序,请分部输入需要倒数的小时数、分钟数、秒数")Console.WriteLine("请输入计时的小时数(大于等于0的整数):")h = Console.ReadLine()Console.WriteLine("请输入计时的总分钟数(大于等于0并且小于60的整数):")m = Console.ReadLine()Console.WriteLine("请输入计时的秒数(大于等于0的并且小于60的整数):")s = Console.ReadLine()Console.WriteLine("当前系统时间为:{0}", h)a = Now()Console.WriteLine("当前系统时间为:{0}", a)Console.WriteLine("")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")z = 0x = 60For i = 0 To h * 3600 + m * 60 + sFor n = 0 To 6000000For y = 0 To 25z = z + 1NextNextIf (h <= 0) And (m <= 0) And (s <= 0) Then Exit ForIf s > 0 Thens = s - 1Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)If (h <= 0) And (m <= 0) And (s <= 0) ThenConsole.WriteLine("倒计时完毕,随意输入字符将退出程序:")Exit ForEnd IfEnd IfIf s = 0 ThenIf m > 0 Thenm = m - 1s = 59Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)End IfIf m = 0 And h > 0 And s = 0 Thenh = h - 1m = 59s = 59Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)If (h <= 0) And (m <= 0) And (s <= 0) ThenConsole.WriteLine("倒计时完毕,随意输入字符将退出程序:")Exit ForEnd IfEnd IfEnd IfNextConsole.Read()End Sub End Module。
vb倒计时源程序代码
Module Module1Sub Main()Dim a As DateDim h, m, s As IntegerDim n, i As LongDim x, z As LongDim y As LongConsole.WriteLine("本程序为倒计时程序,请分部输入需要倒数的小时数、分钟数、秒数")Console.WriteLine("请输入计时的小时数(大于等于0的整数):")h = Console.ReadLine()Console.WriteLine("请输入计时的总分钟数(大于等于0并且小于60的整数):")m = Console.ReadLine()Console.WriteLine("请输入计时的秒数(大于等于0的并且小于60的整数):")s = Console.ReadLine()Console.WriteLine("当前系统时间为:{0}", h)a = Now()Console.WriteLine("当前系统时间为:{0}", a)Console.WriteLine("")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")Console.WriteLine(" **************倒计时开始***************** ")z = 0x = 60For i = 0 To h * 3600 + m * 60 + sFor n = 0 To 6000000For y = 0 To 25z = z + 1NextNextIf (h <= 0) And (m <= 0) And (s <= 0) Then Exit ForIf s > 0 Thens = s - 1Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)If (h <= 0) And (m <= 0) And (s <= 0) ThenConsole.WriteLine("倒计时完毕,随意输入字符将退出程序:")Exit ForEnd IfEnd IfIf s = 0 ThenIf m > 0 Thenm = m - 1s = 59Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)End IfIf m = 0 And h > 0 And s = 0 Thenh = h - 1m = 59s = 59Console.WriteLine(" 剩余:{0}小时{1}分{2}秒", h, m, s)If (h <= 0) And (m <= 0) And (s <= 0) ThenConsole.WriteLine("倒计时完毕,随意输入字符将退出程序:")Exit ForEnd IfEnd IfEnd IfNextConsole.Read()End Sub End Module。
用C语言实现60秒倒计时
用C语言实现60秒倒计时
以下是用C语言实现60秒倒计时的代码:
```c
#include <stdio.h>
#include <stdlib.h>
void sleep(int milliseconds)
clock_t startTime = clock(;
while (clock( < startTime + milliseconds);
int mai
int seconds = 60;
while (seconds > 0)
printf("%02d:%02d\n", seconds/60, seconds%60); sleep(1000); // 延时1秒
seconds--;
}
printf("倒计时结束!\n");
return 0;
```
这段代码的核心思想是通过循环,每隔一秒打印剩余的秒数,并通过
`sleep`函数实现延时一秒的效果。
当倒计时结束后,会输出"倒计时结束!"。
注意:在不同的操作系统或编译器中,`sleep`函数的实现可能有所
不同。
上述代码中的`sleep`函数是一个简单的实现,可以用于一般的情况,但如果有特殊要求,可能需要使用操作系统提供的更高级的延时函数。
单片机控制的60s倒计时
单片机汇编语言程序设计师技能考核内容题目一、单片机控制的60s倒计时要求:1.用单片机AT89C51的定时/计数器实现60s倒计时。
两位数码管静态显示倒计时秒值。
2.要求与P1口相接的数码管(左)显示十位数,与P2口相接的数码管(右)显示个位数,两个共阳数码管为静态显示,其中个位数数码管为总线接法。
特别提示:考生必须将所画的硬件原理图及Keil的项目工程保存在G盘且以考生姓名命名的文件夹中。
PROTEUS电路设计所需元器件及原理图如下(1)AT89C51.BUS:总线式单片机(2)RES:电阻;(3)7SEG-COM-AN-GRN:带公共端共阳七段绿色数码管(4)BUTTON:按钮(5)CAP、CAP-ELEC:电容、电解电容(6)CRYSTAL:晶振参考程序:ORG 0000HSJMP STARORG 001BHSJMP T1SORG 0030HSTAR: MOV R2,#60MOV R4,#20MOV IE,#88HMOV TMOD,#10HMOV TH1,#3CHMOV TL1,#0B0HSETB TR1MOV A,R2MOV B,#10DIV ABACALL SEG7MOV P1,AMOV A,BACALL SEG7MOV P2,ASJMP $T1S: MOV TH1,#3CHMOV TL1,#0B0HDJNZ R4,T1S0MOV R4,#20DJNZ R2,T1S1CLR TR1SJMP T1S1T1S0: RETIT1S1: MOV A,R2MOV B,#10DIV ABACALL SEG7MOV P1,AMOV A,BACALL SEG7MOV P2,ARETISEG7: INC AMOVC A,@A+PCRETDB 0C0H,0F9H,0A4H,0B0H DB 99H,92H,82H,0F8HDB 80H,90H,88H,83HDB 0C6H,0A1H,86H,8EHEND。
单片机控制的60s倒计时
单片机控制的60s倒计时一.实验目的1.用单片机AT89C51的定时/计数器实现60s倒计时。
两位数码管静态显示倒计时秒值。
2.用PROTEUS设计、仿真基于AT89C51单片机的60s倒计时。
二.PROTEUS电路设计(1)AT89C51.BUS:总线式单片机(2)RES:电阻;(3)7SEG-COM-AN-GRN:带公共端共阳七段绿色数码管(4)BUTTON:按钮(5)CAP、CAP-ELEC:电容、电解电容(6)CRYSTAL:晶振2. 放置元器件、放置电源和地、连线、元器件属性设置、电气检测图中与P1口相接的数码管(左)显示十位数,与P2口相接的数码管(右)显示个位数,两个共阳数码管为静态显示,其中个位数数码管为总线接法。
总线标注:由P2口的总线引脚引出总线,并标注为P2[0..7]。
单击电线标注按钮Label,单击该总线,在弹出的编辑对话框“Edit Wire Label”中的“String”一栏中输入标注名P2[0..7],如图所示PAT快速线标注:单击属性分配工具按钮或直接由键盘敲入快捷键“A ”,弹出如图所示的对话框,并按此图进行设置,设置完成后单击“OK”按钮退出。
其中“String”初值“Count”为0,增量“Increment”为1,即首次对电线单击,标注自动以P20开始,对电线每单击一次,便以P21、P22、…递增式自动标注。
在编辑区一次单击个位数数码管的限流电阻与总线P2[0...7]间的电线,由上向下,即数码管的a~g的限流电阻与总线的连接电线,便在各电线上自动标注为P20、P21……P26如图所示。
下图为60s倒计时的电路原理图三.源程序设计、生成目标代码文件1.流程图2.源程序设计3.生成目标代码四.PROTEUS仿真1.加载目标代码文件打开元器件单片机属性窗口,在“Program File”栏中添加上面编译好的目标代码文件,在“Clock Frequency”栏中输入晶振频率为12MHZ。
js代码实现点击按钮出现60秒倒计时
js代码实现点击按钮出现60秒倒计时⽐如,⼀些⽹站上的⼿机短信认证的功能,有类似实现点击按钮后,倒计时60秒才能再次点击发送的效果。
此例⼦⽤Javascript实现点击按钮后,倒计时60秒才能再次点击发送验证码的功能。
例⼦1:Javascript 实现点击按钮倒计时60秒⽅可再次点击发送的效果<input type="button" id="btn" value="免费获取验证码" /><script type="text/javascript">var wait=60;function time(o) {if (wait == 0) {o.removeAttribute("disabled");o.value="免费获取验证码";wait = 60;} else {o.setAttribute("disabled", true);o.value="重新发送(" + wait + ")";wait--;setTimeout(function() {time(o)},1000)}}document.getElementById("btn").onclick=function(){time(this);}</script>例⼦2:点击按钮出现60秒倒计时js代码<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>⽆标题⽂档</title><script type="text/javascript" src="js/jquery.js"></script></head><body><input type="button" id="btn" value="免费获取验证码" onclick="settime(this)" /><script type="text/javascript">var countdown=60;function settime(val) {if (countdown == 0) {val.removeAttribute("disabled");val.value="免费获取验证码";countdown = 60;} else {val.setAttribute("disabled", true);val.value="重新发送(" + countdown + ")";countdown--;}setTimeout(function() {settime(val)},1000)}</script></body></html>例⼦3:点击按钮后,60秒倒计时后才能继续可以点击,按钮上还能显⽰倒计时预想的效果图:这是微信公众平台上的代码function E() {var e = $("#mobile"), t = (new Date).getTime(), n = Math.floor((t - b) / 1e3);g && clearTimeout(g), n >= 60 ? (e.prop("readonly", !1), y = !0, $("#sendmobile").html("发送验证码").attr("disabled", !1).removeClass("btn_disabled")) : (e.prop("readonly", !0), y = !1, $("#sendmobile").attr("disabled", !0).addClass("btn_disabled").html("%s秒后可重}function S() {function e() {if (!y) return;var e = $.trim(n.val());l.mobile(e) ? t.attr("disabled", !1).removeClass("btn_disabled") : t.attr("disabled", !0).addClass("btn_disabled");}var t = $("#sendmobile"), n = $("#mobile");n.keyup(e).blur(e), e(), t.click(function() {var e;t.attr("disabled") !== "disabled" && (e = "+86" + $.trim(n.val()), b = (new Date).getTime(), E(), o.post({url: w ? "/cgi-bin/formbyskey" : "/acct/formbyticket",data: {form: "mobile",action: "set",f: "json",mobile: e},mask: !1}, function(e) {var t = e.BaseResp.Ret;if (t == 0) u.suc("验证码已经发送"); else {switch (t) {case -13:u.err("登录超时,请重新登录");break;case -35:u.err("该⼿机已经登记过2次,请使⽤别的⼿机号进⾏⽤户信息登记");break;default:u.err("验证码发送失败");}b = 0;}}));});}这段代码⼩编就是不知道怎么才能调⽤到⾃⼰的代码上来,经过⾼⼈指点有了⼀些头寻。
单片机设计60秒倒计时正计时+Proteus仿真
60秒倒计时设计一:1.目的课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练。
2.要求单片机控制的60s倒计时(1)用单片机AT89C51的定时器实现60s倒计时。
(2)用PROTEUS设计,仿真基于AT89c51单片机的60s倒计时实验。
3. 目标通过课程设计,使自己深刻理解并掌握基本概念,掌握单片机的基本应用程序设计及综合应用程序设计的方法。
2:方案选择图2.1:60秒倒计时总体电路设计本设计由硬件设计和软件设计两部分组成,总电路框图如图2.1所示。
具体设计:通过AT89C51型号单片机,由P1和P2两组I/O引脚分别控制两个7SEG–COM –ANODE型号数码管,分十位控制和个位控制,达到显示60秒倒计时的目的。
通过复位电路,在仿真过程中点击开关实现60复位3.1 AT89C51外形及引脚排列如图3.1所示图3.1:89C51的核心电路框图主要特性·与MCS-51 兼容·4K字节可编程闪烁存储器·寿命:1000写/擦循环·数据保留时间:10年·全静态工作:0Hz-24MHz·三级程序存储器锁定·128×8位内部RAM·32可编程I/O线·两个16位定时器/计数器·5个中断源·可编程串行通道·低功耗的闲置和掉电模式·片内振荡器和时钟电路管脚说明(1)电源及时钟引脚(4个)Vcc: 电源接入引脚Vss:接地引脚XTAL1:晶振震荡器接入的一个引脚(采用外部振荡器时,此引脚接地);XTAL2:晶体振荡器的另一个引脚(采用外部振荡器时,此引脚作为外部振荡器信号的输入端)。
(2)控制线引脚(4个)RST/Vpd:复位信号输入引脚/备用电源输入引脚;ALE:地址锁存允许信号输出引脚/编程脉冲输入引脚:EA:内外存储器选择引脚/片外EPROM编程电压输入引脚;PSEN:外部程序存储器选通信号输出引脚。
C51单片机60秒倒计时的模拟与仿真设计
C51单片机60秒倒计时的模拟与仿真设计C51单片机是一种非常常用的单片机型号,在许多嵌入式系统中都有广泛的应用。
60秒倒计时是一种简单但实用的计时功能,可以在各种场景下使用,比如比赛计时、实验计时等。
这里将介绍如何使用C51单片机来实现并仿真设计一个60秒倒计时。
接下来,我们详细说明60秒倒计时的设计步骤。
1.硬件连接:将4位共阳数码管的共阳极接到单片机的P1口(P1.0-P1.3),将数码管的a-g段分别接到单片机的P2口(P2.0-P2.6)。
在P1口和P2口之间加上适当的上拉电阻。
2.编写程序:使用Keil C51环境新建一个C语言项目,并编写以下程序:```c#include <reg51.h>sbit D1 = P2^0;sbit D2 = P2^1;sbit D3 = P2^2;sbit D4 = P2^3;void delay(unsigned int t)unsigned int i, j;for(i=0; i<t; i++)for(j=0; j<0x4e; j++); }void maiunsigned int i, j, k; while(1)for(i=5; i>=0; i--)for(j=9; j>=0; j--)for(k=9; k>=0; k--)D1=i;D2=j;D3=k/10;D4=k%10;delay(1000);}}}}```4.调试和仿真:将单片机开发板接上电源,程序将开始运行。
我们可以通过观察数码管的显示来判断程序是否正常运行。
在程序开始时,数码管将显示59:59~00:00的倒计时时间,每隔1秒钟更新一次。
经过60秒后,数码管将停留在00:00的状态。
使用C51单片机实现60秒倒计时模拟和仿真设计非常简单,只需几步即可完成。
这个简单的例子也可以帮助初学者更好地理解和掌握C51单片机的使用方法。
当然,实际应用中可能会有更复杂的需求,需要进一步扩展和优化程序,但整体框架和思路仍然是相似的。
60秒倒计时单片机
广东海洋大学学生实验报告书(学生用表)实验名称外中断优先级实验课程名称单片机技术及系统设计课程号学院(系) 信息学院专业电气工程及其自动化班级1081学生姓名沈志雄学号200811631122 实验地点科技楼403 实验日期实验五 60S倒计时实验一、实验目的:1.通过AT89C51的定时器实现60S倒计时,显示采用两位数码管动态显示。
2.用PROTEUS 设计,仿真基于AT89C51单片机的60S倒计时实验。
二、PROTEUS电路设计:三、实验仪器和设备GDOU-B-11-112PC机、WAVE软件、PROTEUS软件或TDN86/51教学实验系统一台四、源程序设计:根据电路图自行编写并调试。
ORG 0000HAJMP STARTORG 000BHAJMP BRT0ORG 0030HSTART:MOV P2,#02MOV R4,#09HMOV A,R4MOV DPTR,#TABLEMOVC A,@A+DPTRAA: MOV P1,ALCALL DELAYMOV P2,#01MOV R5,#05HMOV A,R5MOVC A,@A+DPTRBB: MOV P1,ALCALL DELAY ;初值59MOV TMOD,#01HMOV TH0,#3CHMOV TL0,#0B0HMOV IE,#82HMOV R0,#14HSETB TR0LOOP:SJMP $BRT0:DJNZ R0,NEXTCJNE R4,#00H,GG ;个位是否为0CJNE R5,#00H,HH ;十位是否为0ZZ: LCALL DDSJMP ZZ ;计数结束HH: DEC R5 ;十位减一MOV R4,#10 ;个位置10GG: DEC R4MOV R0,#14HRETINEXT:MOV TH0,#3CHMOV TL0,#0B0HLCALL DDRETIDELAY: ;2ms延时MOV R2,#2D2: MOV R3,#250D1: NOPDJNZ R3,D1DJNZ R2,D2RETDD:MOV P2,#02 ;动态显示MOV A,R4MOVC A,@A+DPTRMOV P1,ALCALL DELAYMOV P2,#01MOV A,R5MOVC A,@A+DPTRMOV P1,ALCALL DELAYRETTABLE: DB 0X40,0XF9,0X24,0X30,0X19,0X12,0X02,0XF8,0X00,0X10END实验总结:开始时,由于不知道怎么显示两位数,无法编写程序,后来在网上找到相关的显示方法和同学的帮助,最后还是做出了这个实验。
60秒秒钟程序
四、60秒秒钟程序SECOND EQU 30HSECONDK BIT P3.2 ;调节秒初值按钮SW1 BIT P3.3;加减计数SW2 BIT P3.4 ;暂停DISPBUF EQU 40H ;秒BCD码存储的起始位置DISPBIT EQU 48H ;DISPBIT用于判断数码管个数T2SCNTA EQU 49H ;用于定时循环次数T2SCNTB EQU 4AHTEMP EQU 4BH ;TEMP是用于付位选的起始值ORG 00HLJMP STARTORG 0BHLJMP INT_T0ORG 0040HSTART: MOV SECOND,#00HMOV DISPBIT, #00HMOV T2SCNTA , #00HMOV T2SCNTB , #00HMOV TEMP, #0FDHMOV TMOD, #01HMOV TH0, #(65536-2000) / 256MOV TL0, #(65536-2000) MOD 256SETB TR0SETB ET0SETB EAMOV 21H, #3CHLCALL DISPNK1:JB SECONDK, NK2LCALL DELY10MSJB SECONDK, NK2INC SECONDMOV A,SECONDCJNE A, #60, NS60MOV SECOND, #00HNS60: LCALL DISPJNB SECONDK, $NK2: LJMP NK1DELY10MS:MOV R6, #10 D1: MOV R7, #248DJNZ R7, $DJNZ R6, D1RETDISP:MOV A,#DISPBUF ;DISPBUF=40HADD A, #2 ;(A)=42HDEC AMOV R1, A;R1=(41H)MOV A, SECONDMOV B, #10DIV ABMOV @R1, A;(43H)=SECOND高DEC R1MOV A, BMOV @R1, A ;(42H)=SECOND低RETDISP1: LJMP DISPINT_T0:MOV TH0, #(65536-2000) / 256MOV TL0, #(65536-2000) MOD 256 MOV A, #DISPBUF ;(A)=#40hADD A, DISPBIT ;(A)=(40h)MOV R0, A;送SECOND高到R0 MOV A, @R0MOV DPTR, #TABLEMOVC A, @A+DPTR ;取SECOND高的字符MOV P0, A ;送出显示MOV A, DISPBIT ;取第一个数码管位选MOV DPTR, #TABMOVC A, @A+DPTRMOV P2, A ;送出位选INC DISPBIT ;送第二个位选MOV A, DISPBITCJNE A, #02,KNA;判断是否为最后个数码管的位选,不是就加1MOV DISPBIT, #00H ;是最后个数码管就清0KNA: JNB SW1, JIANJISHUJNB SW2, DONEINC T2SCNTA ;(49h)=#01MOV A, T2SCNTA ;不是(a)=#01hCJNE A, #25, DONE ;判断是否为25?MOV T2SCNTA, #00H ;是(49H)=#00 INC T2SCNTB ;(4ah)=#01hMOV A, T2SCNTB ;(A)=#01HCJNE A, #05H, DONE ;判断是否为5,不是则返回MOV T2SCNTB, #00H ;是(4AH)=#00 INC SECOND ;SECOND加1MOV A, SECONDCJNE A, #60, NEXTT ;是否为60S MOV SECOND, #00H ;是则清0 SECOND JIANJISHU:JNB SW2,DONEINC T2SCNTA ;(49h)=#01MOV A, T2SCNTA ;不是(a)=#01hCJNE A, #25,DONE ;判断是否为25?MOV T2SCNTA, #00H ;是(49H)=#00INC T2SCNTB ;(4ah)=#01hMOV A, T2SCNTB ;(A)=#01HCJNE A, #05H, DONE ;判断是否为5,不是则返回MOV T2SCNTB, #00H ;是(4AH)=#00 MOV A, SECONDCJNE A, #00H, JIANMIAOLJMP DONEJIANMIAO:DEC SECONDLCALL NEXTTNEXTT: LCALL DISP ;否则显示DONE: RETITABLE:DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7 FH,6FHTAB: DB 0FBH,0FDHEND。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
START0: MOV AL,90H ;8255的控制字写入
MOV DX,P_CTL
OUT DX,AL
MOV AL,01H ;熄灭报警灯
MOV DX,PB8255
JNZ WWW
JMP WARNING
QQQ: JMP BEGIN
WWW: JMP START0
DELAY PROC NEAR ;数码显示延时
PUSH CX
MOV CX,0A0H
LOOP $
POP CX
RET
DELAY ENDP
CODE ENDS
END START
MOV AL,0FEH
MOV DX,PA
OUT DX,AL
MOV DX,PB
MOV AL,0C0H
OUT DX,AL
CALL DELAY
MOV AL,00H ;报警灯亮
MOV DX,PB8255
OUT DX,AL
MOV DX,PA8255
IN AL,DX
TEST AL,01H ;是否复位
IN AL,DX
TEST AL,01H ;检测是否复位
JNZ QQQ
TEST AL,02H ;检测是否开始
JZ ZT60 ;未开始继续暂停循环
JMP BACK60 ;开始跳回BACK60继续循环
ZT59: MOV AL,0FDH
MOV DX,PA
OUT DX,AL
MOV AL,[BX]
PC EQU 0FF23H ;键入口
PA8255 EQU 0FF28H
PB8255 EQU 0FF29H
PC8255 EQU 0FF2AH
P_CTL EQU 0FF2BH
DATA1: DB 92H,99H,0B0H,0A4H,0F9H,0C0H ;6~0的字形码
MOV DX,PA
OUT DX,AL
MOV AL,82H
MOV DX,PB
OUT DX,AL
CALL DELAY
MOV AL,0FEH
MOV DX,PA
OUT DX,AL
MOV DX,PB
MOV AL,0C0H
OUT DX,AL
CALL DELAY
MOV DX,PA8255
MOV DX,PB
OUT DX,AL
CALL DELAY ;数码显示延时
MOV AL,0FEH ;个位数码管字位口写入
MOV DX,PA
OUT DX,AL
MOV DX,PB
MOV AL,0C0H ;写入0的字形码
OUT DX,AL
CALL DELAY
LOOP T60
LEA BX,DATA1
CALL DELAY
LOOP T59
CMP AL,0C0H
JNZ CHANGE2
MOV AL,[BX]
CMP AL,0C0H ;检测是否倒计时结束
JNZ CHANGE1 ;未结束跳至CHANGE1继续倒计时
JMP WARNING ;结束跳至报警
ZT60: MOV AL,0FDH ;暂停时的数码显示循环
MOV DX,PA8255
IN AL,DX
TEST AL,01H
JNZ QQQ
TEST AL,02H
JZ ZT59
JMP BACK59
WARNING:MOV AL,0FDH
MOV DX,PA
OUT DX,AL
MOV AL,0C0H
MOV DX,PB
OUT DX,AL
CALL DELAY
DEC BX
CHANGE1:LEA SI,DATA2
DEC SI
INC BX
CHANGE2:INC SI
MOV CX,330H
T59: ;59S~0S时的数码显示循环
ZT2: MOV DX,PA8255
IN AL,DX 9
TEST AL,01H
OUT DX,AL
MOV DX,PA8255
IN AL,DX
TEST AL,02H ;检测是否开始计时
JNZ BEGIN ;开始时跳至BEGIN
JMP START0 ;未开始跳至START0重新循环检测
BEGIN: MOV CX,330H ;延时时间控制
T60: ;60S时的数码显示循环
ZT1: MOV DX,PA8255
IN AL,DX
TEST AL,02H ;检测是否暂停
JZ ZT60
TEST AL,01H ;检测是否复位
JNZ BEGIN
BACK60: MOV AL,0FDH ;十位数码管字位口写入
MOV DX,PA
OUT DX,AL
MOV AL,82H ;写入6的字形码
JNZ BEGIN
BACK59: MOV AL,0FDH
MOV DX,PA
OUT DX,AL
MOV AL,[BX]
MOV DX,PB
OUT DX,AL
CALL DELAY
MOV AL,0FEH
MOV DX,PA
OUT DX,AL
MOV DX,PB
MOV AL,[SI]
OUT DX,AL
CODE SEGMENT
ASSUME CS:CODE
ORG 2DF0H
START: JMP START0
PA EQU 0FF21H ;字位口
PB EQU 0FF22H ;字形口
MOV DX,PB
OUT DX,AL
CALL DELAY
MOV AL,0FEH
MOV DX,PA
OUT DX,AL
MOV DX,PB
MOV AL,[SI]
OUT
DX,AL
CALL DELAY