30秒倒计时 c语言51单片机实现
- 格式:doc
- 大小:89.00 KB
- 文档页数:5
基于51单片机的篮球24秒倒计时器#include <reg51.h>#define uchar unsigned charsbit wei0=P1^0;sbit wei1=P1^1;sbit wei2=P1^2;sbit gnd=P2^5;sbit key2=P2^0;uchar count;//用于记录发生了多少次中断的计数器uchar sec=240;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//注:用code是把后面的数据存在程序存贮器中,如果不用code,数据就会存在随机存贮器中。
void delayms(int x){int y,z;for(y=x;y>0;y--)for(z=110;z>0;z--);}void display(int dat){uchar bai,shi,ge;bai=dat/100;shi=dat%100/10;ge=dat%10;wei0=0;P0=table[bai];delayms(1);wei0=1;wei1=0;P0=table[shi]&0x7f;delayms(1);wei1=1;wei2=0;P0=table[ge];delayms(1);wei2=1;P0=0xff; //这一句和下一句是为了降低数码管亮度,同学们不必写。
delayms(20);}void keyscan(){if(key2==0){delayms(5);//延时消抖while(!key2);//松手检测TR0=~TR0;}}void main(){gnd=0;TMOD=0x01;//启用定时器0的工作方式1TH0=(65536-50000)/256;//装初值TL0=(65536-50000)%256;//装初值EA=1;//打开总中断ET0=1;//打开定时器0;TR0=0;//启动定时器0;while(1){keyscan();/*if(count==2){count=0;sec--;if(sec==0)sec=240;}*/ display(sec);}}void timer0 () interrupt 1//定时器0的中断优先等级是1 {TH0=(65536-50000)/256;//重新装初值TL0=(65536-50000)%256;//重新装初值count++;if(count==2){count=0;sec--;if(sec==0)sec=240;}// display(sec); }。
#include<reg51.h>typedef unsigned char uint8;typedef unsigned int uint16;/*七段共阳管显示定义*/uint8 code dispcode[ ]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};/*定义并初始化变量*/uint8 seconde=59;uint16 mstcnt=0;/*函数声明*/void delay(uint8 k ); //延时子程序void time_pro( ); //时间处理子程序void display( ); //显示子程序/*****************************//*延时子程序*//****************************/void delay (uint8 k){uint8 j;while((k--)!=0){for(j=0;j<125;j++){;}}}/**************************//*时间处理子程序*//**************************/void time_pro( void){if(seconde==0)//秒钟设为59进制{ seconde=59; }}/*****************************//* 显示子程序*//*****************************/void display(void){P1=dispcode[seconde/10]; //显示秒的十位delay(4);P2=dispcode[seconde%10]; //显示秒的个位delay(4);}/**************************//*1s定时定时*//**************************/void timer0(void) interrupt 1 using 0//定时器0方式1,250us中断一次{TH0=0xff;TL0=0x19;TMOD = 0x01;mstcnt++;if(mstcnt==4000){seconde--;mstcnt=0; //注意对计数单元的清零}}/**************************//*主函数*//**************************/void main(void){ P1=0xff; //初始化p0口,全设为1使数码管P2=0xff; //初始化p2口,全设为1使数码管TMOD = 0x01; //time0为定时器,方式1TH0=0xff; //预置计数初值TL0=0x19;EA=1;ET0=1;TR0=1;while (1){time_pro( ); //时间处理display( ); //显示时间}}。
广州理工学院《单片机原理与应用》课程设计报告设计课题:基于C51的倒计时器设计学院:电气与电子工程学院班级:姓名:学号:指导教师:日期:2020.11.6---2020.11.19评分:摘要本系统采用STC89C52单片机,设计一款可调倒计时器,该倒计时器数字可以通过按键加KEY1/减KEY2自由设定数字,4位数码管显示计时数字,可选择倒计时范围在(1-9999),设定时间后,按下按键KEY3开始倒计时,当倒计时为0时,蜂鸣器接收到信号,发出警报声。
关键词:STC89C52;数码管显示;可控倒计时器A B S T R AC TS TC89C52m i c ro c on t rol l er i s ap pl i e d i n t hi s s ys t e m, de s i gn ana d j u s t ab l e t i m e r, t h ec ou nt do wn t i m er n um b er c a n f r e el y t h r ou gh t h eb ut t o ns t o a dd KEY1/m i n us K E Y2N u m b e rs, t h e fo ur d i gi t a l t u b e d i s pl a y t i m i n g Nu m b e r s,c an ch oo s e t he c o unt do w n r a n ge i n (1-9999), s e t t i n g t i m e,p r ess t h e b ut t on K EY3s t ar t t h e c ou nt do wn,wh e n t h e c o un td ow n t o z er o, b uz ze r t o re c e i v e si gn al s, s e nd s out t he a l a r m.K E Y W O R DSSTC89C52; Digital tube display; Controlled countdown timer目录概述 (1)一、方案设计 (2)1.1设计任务及其要求 (2)1.2器材选定 (2)二、硬件设计 (3)2.1复位电路 (3)2.2按键电路 (3)2.3时钟振荡电路 (4)2.4单片机最小系统模块电路 (4)三、软件设计 (5)3.1程序流程图 (5)3.2设置数值加减程序 (6)3.3设置倒计时程序 (6)3.4设置蜂鸣器程序 (7)3.5总程序 (7)四、调试与实现 (11)4.1实物连线 (12)4.2连线步骤 (13)4.3模块测试 (14)4.4功能实现 (14)五、课程设计体会与总结 (15)5.1总结 (15)参考文献 (15)附录 (16)附录表1 倒计时器元件清单 (16)概述本项目是由单片机通过执行设定设定的程序,设计的一款可调倒计时器,该倒计时器数字可以通过按键加KEY1/减KEY2自由设定数值,由4位数码管显示计时数值,选择在(1-9999)的倒计时范围内,设定时间,按下按键KEY3开始倒计时,当倒计时为0时,蜂鸣器接收到信号,发出警报声。
倒计时器只要修改此文档15页源程序的(如下图)的到计时初值即可实现想要的倒计时。
比如30分钟倒计时修改分钟十位和各位即可。
一、设计要求:由单片机接收小键盘阵列设定倒计时时间,倒计时的范围最大为60分钟,由LED 显示模块显示剩余时间,显示格式为 XX(分):XX(秒).X,精确到0.1s的整数倍。
倒计时到,由蜂鸣器发出报警。
绘制系统硬件接线图,并进行系统仿真和实验。
画出程序流程图并编写程序实现系统功能。
二、设计的作用目的:此次设计是我们更进一步了解基本电路的设计流程,提高自己的设计理念,丰富自己的理论知识,巩固所学知识,使自己的动手动脑能力有更进一步提高,为自己今后的学习和工作打好基础,为自己的专业技能打好基础。
通过解决实际问题,巩固和加深“单片机原理与应用”课程中所学的理论知识和实验能力,基本掌握单片机应用电路的一般设计方法,提高电子电路的设计和实验能力,加深对单片机软硬知识的理解,获得初步的应用经验,为以后从事生产和科研工作打下一定的基础。
本次设计注重对单片机工作原理以及键盘控制及显示原理的理解,以便今后自己在单片机领域的学习和开发打下基础,提高自己的动手能力和设计能力,培养创新能力,丰富自己的理论知识,做到理论和实践相结合。
本次设计的重要意义还在于对单片机的内部结构和工作状态做更进一步的了解,同时还对单片机的接口技术,中断技术,存储方式和控制方式作更深层次的了解。
三、具体设计:1.问题分析:在电子技术飞速发展的今天,电子产品的人性化和智能化已经非常成熟,其发展前景仍然不可估量。
如今的人们需求的是一种能给自己带来方便的电子产品,当然最好是人性化和智能化的,如何能做到智能化呢?单片机的引入就是一个很好的例子。
单片机又称单片微型计算机,也称为微控制器,是微型计算机的一个重要分支,单片机是20世纪70年代中期发展起来的一种大规模集成电路芯片,是集CPU,RAM,ROM,I/O接口和中断系统于同一硅片上的器件。
天津工业大学电子CAD课程设计报告书三、总体方案)本设计由硬件设计和软件设计两部分组成,总电路如图1所示,硬件设计主要包括单片机芯片选择,数码管选择及晶振,电容,电阻等元器件的选择及其参数的确定;软件设计主要是实现30秒倒计时程序的编写,包括利用中断实现1秒的定时及30秒的倒计时。
具体设计:通过AT89C51型号单片机,由P0 I/O引脚分别控制7SEG–MPX2–CA型号数码管,通过单片机的和控制选通数码管控制十位和个位,达到显示30秒倒计时的目的。
30秒倒计时,到0时1KHZ 声音报警,LED 2 秒闪烁一次。
4 秒后声光停图1 30秒倒计时总体电路设计硬件设计方法AT89C51的芯片概述AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k BytesISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S52可为许多嵌入式控制应用系统提供高性价比的解决方案。
AT89C单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
其工作电压在-5V,一般我们选用+5V电压。
外形及引脚排列如图2所示:AT89C51主要特性图2:AT89C51的核心电路框图。
LED数码管显示器概述本设计中采用的是7SEG–MPX2 –CA型号7段共阳数码管,它是一种半导体发光器件,其基本单元是发光二极管。
实物如图3所示:图3 7SEG–MPX2–CA型号数码管图5 程序框图软件设计方法;定时/计数器初值计算(1)本电路应用TIMER0 MODE 16位计数器的计时中断法。
(2)12M的晶振每秒可以产生1M个机器周期,1秒等于1000000微秒,而每一计时脉冲是1微秒,因此需输入100000个计时脉冲,方可达到1秒的时间。
C51倒计时程序设计一、总体设计方案总体方案设计:用51单片机控制C语言编写设计时、分、秒计时器,8位数码管显示功能,显示格式:“时-分-秒”;总体设计构思:由C语言编写51单片机控制的时、分、秒计时器首先需要设计好硬件电路,根据电路要求编写程序:步骤:(1)采用定时器控制,精确计时,实现时、分、秒的功能;(2)用八位数码管(共阳)显示;(3)编写程序(设初值为23时59分59秒),用Proteus设计仿真电路验证!程序设计:(1)主函数:初始化中断,循环调用显示等待中断;程序模块:T0中断函数、数码管显示函数仿真构成:8位一体的数码管、STC89C51、排阻RP1等二、模块设计方案初始化定义◆文件包含◆常量定义◆变量定义◆数据表格定义#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar codetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};定时计数器及其中断初始化 设置定时器工作方式(TMOD)定时器赋初值(THx,TLx)开总中断(EA=1)开定时计数器中断(ETx=1)启动定时器(TRx=1)void timer0init(void){TMOD=0x01;TH0=(65536-50000)/256;/TL0=(65536-50000)%256;EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0}延时函数()定时计数器中断函数 重装初值对溢出中断计数,并判断是否有20次 时间减1,并判断是减到了0显示函数✧输出秒位位码✧输出秒位段码✧输出分位位码✧输出分位段码✧输出时位位码✧输出时位段码void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==20){temp=0;if(sec==0){if(min==0){if(hour==0){hour=23;}else hour--;min=59;}else min--;sec=59;}else sec--;}else temp++;}主函数●调用初始化函数对定时计数器进行初始化●调用显示函数显示时间仿真电路设计图片三、程序代码/*倒计时及显示程序,适用于寻迹小车实验板*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intuchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳七段编码uchar temp=0;//定义定时器溢出计数变量,每隔50ms产生1次溢出,temp加1uchar hour=23,min=59,sec=59;//定义倒计时变量,当temp计数加20(20x50ms=1s)时,time减1/*--定时计数器T0及其中断初始化函数--*/void timer0init(void){TMOD=0x01;//设置定时器0为工作方式1TH0=(65536-50000)/256;//16位计数初值除以256得到高8位初值TL0=(65536-50000)%256;//16位计数初值除以256的余数得到低8位初值EA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0}/*----------延时函数---------------*/void delay(uint n){uint i,j;for(i=n;i>0;i--)for(j=124;j>0;j--);}/*定时计数器中断程序,每当定时计数器溢出时触发中断,执行该程序*/void time0() interrupt 1{TH0=(65536-50000)/256;//重装初值TL0=(65536-50000)%256;if(temp==20){temp=0;if(sec==0){if(min==0){if(hour==0){hour=23;}else hour--;min=59;}else min--;sec=59;}else sec--;}else temp++;}/*--------------显示函数------------*/void display(void){P1=0xfe;//输出个位的位码P0=table[sec%10]; //输出时间个位的段码delay(5); //亮5msP1=0xfd;//输出十位的位码P0=table[sec/10]; //输出时间十位的段码delay(5); //亮5msP1=0xf7;//输出个位的位码P0=table[min%10]; //输出时间个位的段码delay(5); //亮5msP1=0xfb;P0=0xbf;delay(5);P1=0xef;//输出十位的位码P0=table[min/10]; //输出时间十位的段码delay(5); //亮5msP1=0xbf;//输出个位的位码P0=table[hour%10]; //输出时间个位的段码delay(5); //亮5msP1=0xdf;P0=0xbf;delay(5);P1=0x7f;//输出十位的位码P0=table[hour/10]; //输出时间十位的段码delay(5); //亮5ms}/*----------主函数-----------------*/void main(void){timer0init();//调用初始化函数对定时计数器进行初始化while(1){display();//调用显示函数显示时间}}四、调试结果五、设计总结关于这次设计应该做一个总结,因为这次项目不是一个人做的,而是我们寝室四个人一起做的,有难度,更有配合的默契。
《30秒倒计时计时器》课程设计专业班级:电子信息科学与技术3班姓名:韩飘飘(080212131)熊元甲(080212132)蔡正军(080212133)指导教师:郭玉设计时间:2013-2014学年第二学期物理与电气工程学院2014年5月28日目录题目,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,1目录,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,2第一章方案论证,,,,,,,,,,,,,,,,,,,,,,,,,,,,3 1.1课程设计的目的和要求,,,,,,,,,,,,,,,,,,,,3 1.2总体设计,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4 第二章硬件设计,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4 2.1CPU部分,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,4 2.2 LED数码管显示器概述,,,,,,,,,,,,,,,,,,,,5 2.3其他元器件介绍及参数选择,,,,,,,,,,,,,,,,,7第三章软件设计,,,,,,,,,,,,,,,,,,,,,,,8第四章4.1实验调试及结果(照片),,,,,,,,,,,,,,94.2 心得体会,,,,,,,,,,,,,,,,,,,,,,,,,,,,9附录A:软件程序,,,,,,,,,,,,,,,,,,,,,,,,,10附录B:参考文献,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,12第一章方案论证1.1课程设计目的和要求(1)目的课程设计是单片机课程教学的最后一个环节,是对学生进行全面的系统的训练。
进行课程设计可以让学生把学过的比较零碎的知识系统化,真正的能够把学过的知识落到实处,能够开发简单的系统,也进一步激发了学生再深一步学习的热情,因此课程设计是必不可少的,是非常必要的。
课程设计是提高学生单片机技术应用能力以及文字总结能力的综合训练环节,是配合单片机课程内容掌握、应用得的专门性实践类课程。
基于51单片机的电子钟C语言程序#include<reg51.h>#include<absacc.h>#define uchar unsigned char#define uint unsigned int/*七段共阴管显示定义*/uchar codedispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF,0xDF};/*定义并初始化变量*/uchar seconde=0;uchar minite=0;uchar hour=12;uchar mstcnt=0;sbit P1_0=P1^0; // second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义/*函数声明*/void delay(uint k ); //延时子程序void delay1(uchar h );void time_pro( ); //时间处理子程序void display( ); //显示子程序void keyscan( ); //键盘扫描子程序/*****************************//*延时子程序*//****************************/void delay1 (uchar h){uchar j;while((h--)!=0){for(j=0;j<125;j++){;}}}void delay (uint k){uint a,b,c;for(c=k;c>0;c--)for(b=38;b>0;b--)for(a=130;a>0;a--);}/**************************//*时间处理子程序*//**************************/void time_pro( void){if(seconde==60) //秒钟设为60进制 { seconde=0;minite++;if( minite==60) //分钟设为60进制{ minite=0;hour++;if(hour==24) //时钟设为24进制{hour=0; }}}}/*****************************//* 显示子程序*//*****************************/void display(void){P2=0xfe;P0=dispcode[hour/10]; //显示小时的十位 delay1(4);P2=0xfd;P0=(dispcode[(hour%10)])|0X80; //显示小时的个位 delay1(4);P2=0xfb;P0=dispcode[minite/10]; //显示分的十位 delay1(4);P2=0xf7;P0=(dispcode[minite%10])|0X80; //显示分的个位 delay1(4);P2=0xef;P0=dispcode[seconde/10]; //显示秒的十位delay1(4);P2=0xdf;P0=dispcode[seconde%10]; //显示秒的个位delay1(4);}/*******************************//*键盘扫描子程序*//*******************************/void keyscan (void){if(P1_0==0) //按键1秒的调整{delay(2);if(P1_0==0)//delay(300);{seconde++;if(seconde==60){seconde=0; }}}if(P1_1==0) //按键2分的调整{delay(2);if(P1_1==0)// delay(300);{minite++;if(minite==60){minite=0;}}}if(P1_2==0) //按键3小时的调整{delay(2);if(P1_2==0)//delay(300);{hour++;if(hour==24){hour=0; }}}}void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次{TH0=0x3c;TMOD = 0x11;mstcnt++;if(mstcnt==20){seconde++;mstcnt=0; //注意点。
51单片机倒计时源程序#include<reg52.h> //51头文件//#include<472405468.h>//51头文件#define uchar unsigned char //宏定义#define uint unsigned int //宏定义#define s0 P2^0 // 时加键#define s1 P2^1 // 分加键#define s2 P2^2 // 倒时加键//0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6F #define s3 P2^3 // 倒分加键#define s4 P2^4 // 倒秒加键#define s5 P2^5 // 开始倒计时键总共6个按键uint tt1,tt0;uchar num=0;uchar biaozhi=11;uchar up;uchar z,han,jun,qiang,cishu,count,num1; //函数变量声明char shi,fen,miao,pao_miao; //定义有符号变量声明chardao_shi=23,dao_miao=59,dao_fen=59,dao_paomiao=99;sbit sky1=P1^0; //断控sbit sky2=P1^1; //位控sbit feng=P1^2; //控蜂鸣器const uchar code TAB[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴极显示代码//****************** 函数声明 *****************************void feng_ming_qi(uchar); //报时函数void init(); //定时器的初始化(T1)void fenjie(); //函数声明void delay(uchar); //延时函数声明void dao_fenjie(); //倒计时显示函数uchar key_scan(); //按键调试函数//************************************************************void delay(uchar z) //一毫秒延时函数{uchar x,y;for(x=0;x<z;x++)for(y=0;y<110;y++);}void init()//TR1初始化{TMOD=0x22; // TMOD=0x20; 开定时 1TH1=0x06; //T1 250微妙TL1=0x06; //装初值EA=1; //打开总中断TR1=1; ////初始化先打开定时器1ET1=1;feng=0;///////////////////////////////////////////////TH0=0x06; //T0 也是 250 微妙中断一次TL0=0x06; //装初值//EA=1; //打开总中断TR0=0; //初始化先关闭定时器0ET0=1; // IEIP=0x20;}/////////////////////////////////////////////////////////////////// /////////////////////////void dao_fenjie() //分解倒秒,倒分,倒时。
#include<reg52.h>#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; //两位数分离赋给数码管个位显示}}。
#include<reg52.h>#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; //两位数分离赋给数码管个位显示 }}(注:文档可能无法思考全面,请浏览后下载,供参考。