单片机C语言0到100计时
- 格式:docx
- 大小:17.80 KB
- 文档页数:5
pic单片机计时秒表程序设计(时钟显示范围00.00~99.99秒,分辨度为0.01秒)作者:来源:本站原创点击数:1676 更新时间:2008年07月12日//此程序实现计时秒表功能,时钟显示范围00.00~99.99秒,分辨度:0.01秒#include "p18f458.h"unsigned char s[4]; //定义0.01 秒、0.1 秒、1秒、10秒计时器unsigned char k,data,sreg;unsigned int i;const table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90};//不带小数点的显示段码表const table0[10]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};//带小数点的显示段码表void clkint(void);//TMR0初始化子程序void tmint(){T0CON=0XCF; //设定TMR0L工作于8位定时器方式//内部时钟,TMR0不用分频INTCON=0X20; //总中断禁止,TMR0中断允许,清除TMR0的中断标志INTCON2bits.TMR0IP=1; //TMR0中断高优先级RCONbits.IPEN=1; //使能中断优先级}//系统其它部分初始化子程序void initial(){TRISA=0x00; //A口设置为输出TRISB=0XF0; //RB1输出,RB4输入TRISC=0x00; //SDO引脚为输出,SCK引脚为输出TRISE=0x00; //E口设置为输出SSPCON1=0x30; //SSPEN=1;CKP=1,FOSC/4 SSPSTAT=0xC0; //时钟下降沿发送数据PIR1=0; //清除SSPIF标志data=0X00; //待显示的寄存器赋初值PORTBbits.RB1=0;PORTAbits.RA3=0;PORTE=0; //将K1,K2,K3,K4四条列线置0}//SPI传输数据子程序void SPILED(char data){SSPBUF=data; //启动发送do{;}while(PIR1bits.SSPIF==0);PIR1bits.SSPIF=0;}//显示子程序,显示4位数void dispaly(){PORTAbits.RA5=0; //准备锁存for(k=0;k<4;k++){data=s[k];if(k==2) data=table0[data]; //个位需要显示小数点else data=table[data];SPILED(data); //发送显示段码}for(k=0;k<4;k++){data=0xFF;SPILED(data); //连续发送4个DARK,使显示好看一些}PORTAbits.RA5=1; //最后给锁存信号,代表显示任务完成}//软件延时子程序void DELAY(){for(i = 3553; --i ;)continue;}//键扫描子程序void KEYSCAN(){while(1){dispaly(); //调用一次显示子程序while(PORTBbits.RB4==0){DELAY(); //若有键按下,则软件延时break;}if (PORTBbits.RB4==0) break; //若还有键按下,则终止循环扫描,返回}}//等键松开子程序void keyrelax(){while(1){dispaly(); //调用一次显示子程序if (PORTBbits.RB4==1) break; //为防止按键过于灵敏,每次等键松开才返回}}/*高优先级中断向量*/#pragma code InterruptVectorHigh=0x08void InterruptVectorHigh (void){_asmgoto clkint //跳到中断程序_endasm}//中断服务程序#pragma code#pragma interrupt clkintvoid clkint(){TMR0=0X13; //对TMR0写入一个调整值。
#include<reg52.h>typedef unsigned intuint;typedef unsigned char uchar;sbit LED_Bit1 = P2^4;sbit LED_Bit2 = P2^5;sbit LED_Bit3 = P2^6;sbit LED_Bit4 = P2^7;sbit Key0=P3^4;sbit Key1=P3^5;sbit Key2=P3^6;sbit Key3=P3^7;sbit Buzzer=P2^3;int point;intnum=0;int alarm=1;uint count=0;uint second=0;uint min=0;uint hour=6;uint count1=0;uint second1=0;uint year=2011;uint month=1;uint day=1;uint hour1=6;uint min1=0;uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};void Delay(uint m){uintx,y;for(x = m;x> 0;x--)for(y = 110;y > 0;y--);}voidLED_DynamicDisplay(uchar Bit1,uchar Bit2,uchar Bit3,uchar Bit4) {LED_Bit1 = 0;LED_Bit2 = 1;LED_Bit4 = 1;if(point==2||point==7||point==9){if(count<50)P0 = table[Bit1]&0x7f;elseP0=table[Bit1];}elseP0=table[Bit1];Delay(1);P0 = 0xFF;LED_Bit1 = 1;LED_Bit2 = 0;LED_Bit3 = 1;LED_Bit4 = 1;if(point>=1&point<=10&point!=5&point!=9&point!=10) P0=table[Bit2]&0x7f;else{if (count<50)P0 = table[Bit2] & 0x7f;elseP0=table[Bit2];}Delay(1);P0 = 0xFF;LED_Bit1 = 1;LED_Bit2 = 1;LED_Bit3 = 0;LED_Bit4 = 1;if(point==3||point==8||point==10){if(count<50)P0 = table[Bit3]&0x7f;elseP0=table[Bit3];}elseP0=table[Bit3];Delay(1);P0 = 0xFF;LED_Bit2 = 1;LED_Bit3 = 1;LED_Bit4 = 0;P0 = table[Bit4];Delay(1);P0 = 0xFF;}voidTimer_Init(void){TMOD=0x11;TH1=(65536-10000)/256;TL1=(65536-10000)%256;TH0=(65536-10000)/256;TL0=(65536-10000)%256;TR0=1;TR1=1;ET1=1;ET0=1;EA=1;}uchar LED=0x00;void timer0(void) interrupt 3 using 1 {count++;TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(Buzzer==0){if(count%50 == 0)LED =~LED;}if(Buzzer==1)LED=0x00;}void timer1(void) interrupt 1 using 1 {if(point==1)count1++;TH0 = (65536 - 10000)/256;TL0 = (65536 - 10000)%256;}{if(Key0 == 0){Delay(5);if(Key0 == 0){//alarm=~alarm; while(!Key0);}}if(Key1 == 0){Delay(5);if(Key1 == 0){second1=0;count1=0;TH0= (65536 - 10000)/256; TL0= (65536 - 10000)%256; while(!Key1);}}if(Key2==0){Delay(5);if(Key2==0){point++;/*if(point==1){ET0=0;}*/if(point==11)point=0;}while(!Key2);}if(Key3==0){Delay(5);if(Key3==0){if(point==0) alarm=~alarm; if(point==9) hour1++;if(point==10) min1++;if(point==2) hour++;if(point==3) min++;if(point==1) ET0=~ET0; if(point==5) year++;if(point==7) month++;if(point==8) day++;while(!Key3); }}}void time() {if(count>=100) {second++; count=0;}if(second>=60) {min++; second=0;}if(min>=60) {hour++;min=0;}if(hour>=24) {hour=0;day++;}if(month<=7&month%2==1||month>=8&month%2==0) {if(day>=32){month++;day=0;}}else if(year%4==0&year%400!=0&month==2){if(day>=30){month++;day=0;}}else if(year%4!=0&month==2){if(day>=29){month++;day=0;}}else{if(day>=31){month++;day=0;}}if(month>=12){year++;month=0;}if(year>=9999)year=0;if(count1>=100){second1++;count1=0;}if(second1>=60){second1=0;}if(hour1>=24)hour1=0;if(min1>=60)min1=0;if(alarm>=2)alarm=0;}int main(){Timer_Init();while(1){P1=~LED;Keyscan();time();if(point==1){time();LED_DynamicDisplay(second1/10,second1%10,count1/10,count1%10); }else if(point==4||point==5){time();LED_DynamicDisplay(year/1000,year/100%10,year/10%10,year%10);}else if(point==6||point==7||point==8){time();LED_DynamicDisplay(month/10,month%10,day/10,day%10);}else if(point==9||point==10)。
Fax:86-0731-******* Mail:dsc52@ Web: 源点教育项目报告一、功能要求:(1)、电路图对学员要求是一样,完整电路图请见原理图。
(2)、由图1所示:正常显示(上电显示)如下:星期时分两红灯亮秒闪(3)、●按下key1第一次,显示如下:年月{阳历}日{阳历}两红灯亮两灯亮●再按下key1,则回到正常显示,依次类推。
(4)、在任何显示状态下,按下key1超过2秒,则进入设置状态,同时显示“时、分、秒”闪烁。
此时按下key2,“秒”闪,进入设置状态。
再按下key2,“分”闪,进入设置状态。
再按下key2,“时”闪,进入设置状态。
再按下key2,显示“星期、月{阳历}、日{阳历}”,同时“日{阳历}”闪,进入设置状态。
再按下key2,“月{阳历}”闪,进入设置状态。
再按下key2,“星期”闪,进入设置状态。
再按下key2,显示“年(四个数码管显示)”,同时“年”闪,进入设置状态。
再按下key2,则回到“秒”重复设计置。
注:进入设置状态时,key3作减键,key4作加键,并且key3,key4具有连动功能(如果key3或者key4按下持续1秒后,以0.5秒时间连减或者连加)(5)、在(2)的任何状态下,按下key5,则回正常显示。
(6)、在正常显示状态下:按下key5超过2秒,则进入闹钟设置状态。
Fax:86-0731-******* Mail:dsc52@ Web: 再按key5则回正常显示。
三、扩展功能要求。
(1)、按下key6,把闹钟时间存于AT24C16里。
(2)、由图1所示:正常显示(上电显示)如下:星期时分两红灯亮秒闪(3)、●按下key1第一次,显示如下:年月{阳历}日{阳历}两红灯亮两灯亮●按下key1第二次,显示如下:年月{阴历}日{阴历}两红灯闪两灯闪●再按下key1,则回到正常显示,依次类推。
(4)、在任何显示状态下,按下key1超过2秒,则进入设置状态,同时显示“时、分、秒”闪烁。
9创新实践实训报告学院信息电子技术学院专业电子信息工程班级14学籍号姓名指导教师蒋野2017年06月29日单片机控制秒表电路一、电路工作原理1.工作原理用STC89C52设计一个2位的LED数码显示作为“秒表”:显示时间为00—99秒,每秒自动加1,另设计一个“暂停”键S2和一个“继续”键S3。
为使本设计系统更加完善,可以引入一个“复位”键S1,以方便对系统的控制。
如图。
本系统采用STC89C51单片机为中心器件,利用其定时器/计数器定时计数的原理,结合硬件电路如电源电路,晶振电路,复位电路和显示电路,以及一些按键电路等来设计计数器,将软硬件有机结合起来,其中软件系统采用汇编语言编写程序,包括显示程序,计数程序,中断,硬件系统利用Protues强大的功能来实现,简单易于观察,在仿真中就可以观察到实际的工作状态。
2.元器件作用(1)STC89C52单片机在电子行业中有着广泛的应用。
AT89C52有40个引脚,32个外部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2 个读写口线,STC89C52可以按照常规方法进行编程,也可以在线编程。
其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的 Flash存储器可有效地降低开发成本。
(2)时钟电路作用是为电路提供唯一的时钟信号。
(3)复位电路外接一个开关,控制电路复位,接通电源电路直接复位,如果没有开关亦可将复位电路引出导线接电源后断开。
(4)本设计要求使用共阳极的数码管,如下是共阳极的数码管的0-9编码:0xc0,0x92,0x82,0xf8,0x80,0x90,0xf9,0xa4,0xb0,0x99.(5)控制电路:S2按下电路停止计时,S3按下电路恢复计时。
二、程序流程图开始显示“00”开启中断,并允许T1,T2中断TH1、TL1初始化每隔1秒按键S2T1停止暂停计数S3T2恢复恢复计数主程序流程图三、检测安装与调试1.元件检测序号名称型号(标称值)测量值误差备注1电阻1K78022%2电阻10K10.780.07%3电容33pF323%4电容10uF910%5晶振12M12M0共阳极数码管检测管脚序号利用万用表二极管档红表笔接一个抵住两个管脚,利用另一个接触其他,找出1,2两个管脚,继续分别找出A,D,C,D,E,F,G,Dp管脚。
姓名班级指导老师时间信息工程学院图1 硬件电路连接图(二)显示电路两位数码管循环显示00~99电路数码管只要就是用于数字得显示.数码管有共阴与共阳得区分,单片机都可以进行驱动,但就是驱动得方法却不同。
两位数码管循环电路就是由电阻、二极管与数码管组成,电源+5V通过560得电阻直接给数码管得7个段位供电,P0、0—P0、7对应了两个接数码管得A,B,C,D,E,F,G与小数点位,P2、6接显示个位数得数码管得3、8引角,P2、7则接十位数得。
P2、6与P2、7端口分别控制数码管得十位与个位得供电,当相应得端口变成低电平时,驱动相应得三极管会导通,+5V通过二极管与驱动三极管给数码管相应得位供电,这时只要P0口送出数字得显示代码,数码管就能正常显示需要得数字。
图2 十位显示动态数码管(共阳数码管)图3 个位显示静态数码管(共阴数码管)(三)时钟电路时钟电路得晶振频率越高,系统得时钟频率越高,单片机得运行速度也越快。
晶振频率根据设计需要设为12MHz,又根据谐振性质,电路中得电容应选择为30pF左右。
图4 时钟电路(四)复位电路MCS—51单片机得复位就是靠外部电路实现得。
MCS—51单片机工作之后,只要在她得RST引线上加载10ms以上得高点平,单片机就能有效地复位。
MCS-51单片机通常采用上电自动复位与按键复位两种方式。
最简单得复位电路如图5:图5 复位电路上电瞬间,RC电路充电,RST引线出现正脉冲,只要RST保持10ms以上得高电平,就能使单if(i++==100)//如果i=0{i=0;count++;P0=CODE[count/10];P2=~CODE[count%10];if(count==99)count=0; //如果到了99,则重新从0开始计数}}结果与分析(可以加页):(一)调试结果1.初始状态图7:初始状态结果图2.开始计时后按下按键暂停图8:中间状态图示(二)问题分析及解决措施1、一开始时没有分清楚数码管就是共阴数码管还就是共阳数码管,C语言程序中默认数码管就是共阴,所以两个P接口得值都就是按照共阴去写得,导致数码管选段及位显有问题,后来经过老师得指点,将共阳数码管P2得接口改成了共阴。
#include <REGX51.H>#include <ABSACC.h>#define Font_code XBYTE[0xefff] //字符码写地址#define reg_code XBYTE[0xdfff] //字位码写地址#define s_1_con_key P3_2#define m_1_con_key P3_3#define h_1_con_key P3_4#define w_1_con_key P3_5#define p1 P1sbit BELL=P1^0;//sbit p10=P1^0;//sbit p20=P1^1;//sbit p30=P1^2;//sbit p40=P1^3;//sbit p50=P1^4;//sbit p60=P1^5;//sbit p70=P1^6;//sbit p80=P1^7;//字型码const unsigned char seg_design[11]={0x3F,/*0*/0x06,/*1*/0x5B,/*2*/0x4F,/*3*/0x66,/*4*/0x6D,/*5*/0x7D,/*6*/0x07,/*7*/0x7F,/*8*/0x6F,/*9*/0x40,/*-*/};//字位码const unsigned char bit_design[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};code unsigned char sszymmh[]={ 6,2,3, 5,2,1, 3,2,2, 5,2,2, 1,3,2, 6,2,1, 5,2,1,6,2,4, 3,2,2, 5,2,1, 6,2,1, 5,2,2, 3,2,2, 1,2,1,6,1,1, 5,2,1, 3,2,1, 2,2,4, 2,2,3, 3,2,1, 5,2,2,5,2,1, 6,2,1, 3,2,2, 2,2,2, 1,2,4, 5,2,3,3,2,1,2,2,1, 1,2,1, 6,1,1, 1,2,1, 5,1,6, 0,0,0} ;// 音阶频率表高八位code unsigned char FREQH[]={0xF2,0xF3,0xF5,0xF5,0xF6,0xF7,0xF8,0xF9,0xF9,0xFA,0xFA,0xFB,0xFB,0xFC,0xFC,//1,2,3,4,5,6,7,8,i0xFC,0xFD,0xFD,0xFD,0xFD,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFE,0xFF,} ;// 音阶频率表低八位code unsigned char FREQL[]={0x42,0xC1,0x17,0xB6,0xD0,0xD1,0xB6,0x21,0xE1,0x8C,0xD8,0x68,0xE9,0x5B,0x8F,//1,2,3,4,5,6,7,8,i0xEE,0x44, 0x6B,0xB4,0xF4,0x2D,0x47,0x77,0xA2,0xB6,0xDA,0xFA,0x16,};unsigned char bit_con;unsigned int ms_1_con; //毫秒计数器unsigned char s_1_con; //秒计数器unsigned char m_1_con; //分计数器unsigned char h_1_con=12;//时计数器unsigned char w_1_con=6; //周计时器unsigned char d_1_con=1;unsigned char mon_1_con=1;unsigned int y_1_con=2011;unsigned char s1; //秒计数器unsigned char m1; //分计数器unsigned char h1; //时计数器unsigned char Display_Buffer[8]; //显示缓冲区unsigned int k1=0;unsigned int k2=0;unsigned char timer0h,timer0l,time,led=1,j=0;unsigned char flagd=0;void delay_nms(unsigned int n);void Calculation_display(void);void time_set(void);void time_set1(void);void time_set2(void);void InitTimer0(void){TMOD = 0x01; // 方式1,16位计数器方式TH0 = 0xFC; //定时初值=65536-n n=1000,定时周期是1ms TL0 = 0x18;EA = 1; //开总中断使能ET0 = 1; //允许定时器T0溢出中断TR0 = 1; //T0 运行}void delay(unsigned char t){unsigned char t1;unsigned long t2;for(t1=0;t1<t;t1++){for(t2=0;t2<4000;t2++){;}}TR0=0;}void song(){TH0=timer0h;TL0=timer0l;TR0=1;delay(time);}void sing(){unsigned char k,i=0;time=1;while(time){if(k1==0) break;InitTimer0();Calculation_display();if(k2==0)time_set();else if(k2==1)time_set1();elsetime_set2();p1=~seg_design[8];k=sszymmh[i]+7*sszymmh[i+1]-1;timer0h=FREQH[k];timer0l=FREQL[k];time=sszymmh[i+2];i=i+3;song();}}void main(void){InitTimer0();while(1){Calculation_display();delay_nms(100);if(k2==0)time_set();else if(k2==1)time_set1();elsetime_set2();sing();k1=0;InitTimer0();}}void Timer0Interrupt(void) interrupt 1 using 1 {TH0 = 0xFC;TL0 = 0x18;ms_1_con++;//采用定时扫描方式bit_con++;if(bit_con > 7) bit_con = 0;reg_code = 0x00; //先消隐显示Font_code = Display_Buffer[bit_con];reg_code = bit_design[bit_con];if(k1==1){TR0=0;BELL=!BELL;TH0=timer0h;TL0=timer0l;TR0=1;}}void delay_nms(unsigned int n) //延时N ms{unsigned char a,b;unsigned int c;for(c=n;c>0;c--)for(b=142;b>0;b--)for(a=2;a>0;a--);}void Calculation_display(void){unsigned char day;if(ms_1_con > 999) //1000ms定时到{ms_1_con = 0;s_1_con++;if(s_1_con > 59){s_1_con = 0;m_1_con++;if(m_1_con > 59){m_1_con = 0;h_1_con++;k1=1;if(h_1_con > 23){h_1_con = 0;w_1_con++;if(w_1_con>7)w_1_con=1;switch(mon_1_con){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day=31;break;case 2:day=28;break;case 4:case 6:case 9:case 11:day=30;break;}d_1_con++;if(d_1_con>day){mon_1_con++;d_1_con=1;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}}}}}p1=~seg_design[w_1_con];if(k2==0){if(ms_1_con<500){Display_Buffer[2] = seg_design[10];Display_Buffer[5] = seg_design[10];}else{Display_Buffer[2] = !seg_design[10];Display_Buffer[5] = !seg_design[10];}Display_Buffer[6] = seg_design[s_1_con/10];//秒十位Display_Buffer[7] = seg_design[s_1_con%10]; //秒个位Display_Buffer[3] = seg_design[m_1_con/10]; //分十位Display_Buffer[4] = seg_design[m_1_con%10]; //分个位Display_Buffer[0] = seg_design[h_1_con/10]; //时十位Display_Buffer[1] = seg_design[h_1_con%10]; //时个位}if(k2==1){Display_Buffer[3] = seg_design[y_1_con%10]; //年个位Display_Buffer[2] = seg_design[(y_1_con/10)%10]; //年十位Display_Buffer[1] = seg_design[((y_1_con/100)%10)]; //年百位Display_Buffer[0] = seg_design[y_1_con/1000]; //年千位Display_Buffer[6] = seg_design[d_1_con/10]; //日十位Display_Buffer[7] = seg_design[d_1_con%10]; //日个位Display_Buffer[4] = seg_design[mon_1_con/10]; //月十位Display_Buffer[5] = seg_design[mon_1_con%10]; //月个位}if(k2==2){Display_Buffer[2] = seg_design[10];Display_Buffer[5] = seg_design[10];Display_Buffer[6] = seg_design[s1/10]; //秒十位Display_Buffer[7] = seg_design[s1%10]; //秒个位Display_Buffer[3] = seg_design[m1/10]; //分十位Display_Buffer[4] = seg_design[m1%10]; //分个位Display_Buffer[0] = seg_design[h1/10]; //时十位Display_Buffer[1] = seg_design[h1%10]; //时个位}if(s1==s_1_con&&m1==m_1_con&&h1==h_1_con)k1=1;}void time_set(void){unsigned char day;if(!s_1_con_key){s_1_con++;if(s_1_con > 59){s_1_con = 0;m_1_con++;if(m_1_con > 59){m_1_con = 0;h_1_con++;if(h_1_con > 23){h_1_con = 0;w_1_con++;if(w_1_con>7)w_1_con=1;d_1_con++;switch(mon_1_con){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day=31;break;case 2:day=28;break;case 4:case 6:case 9:case 11:day=30;break;}if(d_1_con>day){mon_1_con++;d_1_con=1;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}}}}}if(!m_1_con_key){m_1_con++;if(m_1_con > 59){m_1_con = 0;h_1_con++;if(h_1_con > 23){h_1_con = 0;w_1_con++;if(w_1_con>7)w_1_con=1;d_1_con++;switch(mon_1_con){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day=31;break;case 2:day=28;break;case 4:case 6:case 9:case 11:day=30;break;}if(d_1_con>day){mon_1_con++;d_1_con=1;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}}}}if(!h_1_con_key){h_1_con++;if(h_1_con > 23){h_1_con = 0;w_1_con++;if(w_1_con>7)w_1_con=1;d_1_con++;switch(mon_1_con){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day=31;break;case 2:day=28;break;case 4:case 6:case 9:case 11:day=30;break;}if(d_1_con>day){mon_1_con++;d_1_con=1;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}}}if(!w_1_con_key){k2=1;}}void time_set1(void){unsigned char day;switch(mon_1_con){case 1:case 3:case 5:case 7:case 8:case 10:case 12:day=31;break;case 2:day=28;break;case 4:case 6:case 9:case 11:day=30;break;}if(!s_1_con_key){d_1_con++;w_1_con++;if(w_1_con>7)w_1_con=1;if(d_1_con>day){mon_1_con++;d_1_con=1;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}}if(!m_1_con_key){mon_1_con++;w_1_con=(w_1_con+day%7)%7;if(mon_1_con>12){y_1_con++;mon_1_con=1;}}if(!h_1_con_key){y_1_con++;if(y_1_con>9999){w_1_con=(w_1_con+365%7)%7;y_1_con=0;}}if(!w_1_con_key){k2=2;}}void time_set2(void){if(!s_1_con_key){s1++;if(s1>59)s1=0;}if(!m_1_con_key){m1++;if(m1>59)m1=0;}if(!h_1_con_key){h1++;if(h1>23)h1=0;}if(!w_1_con_key){k2=0;}}。
单片机10秒倒计时c语言汇编语言程序(2)数码管动态显示(循环显示0~9,时间间隔为1 秒,1 秒的时间间隔用定时器T0 实现)①汇编语言:ORG 0000HAJMP MAINORG 000BHAJMP INTT0ORG 0030HMAIN:CLR P2.7MOV DPTR,#TABCLR AMOV R2,#0HMOVR3,#0HMOV TMOD,#01HMOV TH0,#4CHMOV TL0,#00HSETB EASETB ET0SETB TR0HERE: CJNE R2,#14H,HEREMOV R2,#0HPUSH ACCMOVC A,@A+DPTRMOV P0,APOP ACCINC AINC R3 CJNE R3,#0AH,HEREMOV R3,#00H ;此处用DJNZ 更方便,只不过R3 的初始值;要设置为0AH,同时取消INC R3 指令(此行上面第二行)CLR AAJMP HEREORG80HINTT0:MOV TH0,#4CHMOV TL0,#00HINC R2RETITAB: DB0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90HEND②C 语言#include#define uint unsigned int#define uchar unsigned charsbit p27=P2;//数码管位选端定义uchar c,i;//数码管译码表unsigned char code NumDecode[] ={0XC0,//;00XF9,//;10XA4,//;20XB0,//;30X99,//;40X92,//;50X82,//;60XF8,//;70X80,/ /;80X90,//;9};void main(){i=0;//10 秒计时设置c=0;//中断次数计数p27=1;//数码管位选端关闭TMOD=1;//设置定时器0 为工作方式1TH0=(65536-46080)/256;//定时50ms 高8 位求模TL0=(65536-46080)%256;//定时50ms 低8 位求余EA=1;//开总中断ET0=1;//定时器0 中断TR0=1;//启动定时器0while(1){if(c==20)//50ms 中断20 次{c=0;i++;//倒计时总数每秒减1}if(itips:感谢大家的阅读,本文由我司收集整编。