单片机定时器汇编程序
单片机延时500ms程序汇编
单片机延时500ms程序汇编一、概述在单片机编程中,延时操作是非常常见且重要的一部分。
延时可以使程序在执行过程中暂停一段时间,以确保输入输出设备能够正常工作,或者是为了保护其他设备。
本文将介绍如何使用汇编语言编写单片机延时500ms的程序。
二、延时原理在单片机中,延时操作通常通过循环来实现。
每个循环需要一定的时间,通过控制循环次数和循环体内的指令数量,可以实现不同长度的延时。
在汇编语言中,可以使用计数器来控制循环次数,从而实现精确的延时操作。
三、汇编语言编写延时程序接下来,我们将使用汇编语言编写延时500ms的程序。
1. 设置计数器初值在程序的开头我们需要设置计数器的初值,这个初值需要根据单片机的工作频率和所需的延时时间来计算。
假设单片机的工作频率为1MHz,那么在循环500次后,就能够达到500ms的延时。
我们需要将计数器的初值设为500。
2. 循环计数接下来,我们进入一个循环,在循环中进行计数操作。
每次循环结束时,都需要检查计数器的值,当计数器减至0时,表示已经达到了500ms的延时时间,可以退出循环。
3. 优化程序为了提高程序的执行效率,可以对计数器进行优化。
例如可以通过嵌套循环的方式,减少循环的次数,从而提高延时的精度和稳定性。
四、程序示例下面是一个简单的示例程序,演示了如何使用汇编语言编写延时500ms的程序。
```org 0x00mov r2, #500 ; 设置计数器初值为500delay_loop:djnz r2, delay_loop ; 进行计数ret ; 延时结束,退出程序```五、结语通过以上的示例程序,我们可以看到如何使用汇编语言编写单片机延时500ms的程序。
当然,实际的延时程序可能会更加复杂,需要根据具体的单片机型号和工作频率进行调整,但是思路是相似的。
在实际的编程中,需要根据具体的需求和硬件环境来进行调整和优化,以实现更加稳定和精确的延时操作。
希望本文对单片机延时程序的编写有所帮助,也欢迎大家在评论区提出宝贵意见和建议。
单片机定时器程序编写
单片机定时器程序编写单片机的定时器要用到中断机制,所以在编写程序时要先开启中断,设置中断优先级和中断服务函数,然后再配置定时器。
以下是编写单片机定时器程序的步骤:1.开启中断:要想使用定时器,必须开启单片机的中断功能,可使用如下命令开启:` __enable_irq(;`。
该函数将开启全局中断。
2.设置中断优先级:中断优先级用于解决多个中断同时发生时的执行顺序问题。
一般来说,定时器中断的优先级比较低,因为可能同时有其他更重要的中断需要执行。
`NVIC_SetPriority(TIMER某_IRQn, 2);`。
上面命令将设置定时器的中断优先级为2。
3.定义中断服务函数:中断服务函数是中断发生时自动执行的一段程序。
每种中断都需要一个相应的中断服务函数。
```。
void TIMER某_IRQHandler(void)。
//中断处理程序。
}。
```。
上面代码定义了一个定时器中断服务函数。
4.配置定时器:配置定时器的过程包括选择时钟源、设定计数值、选择计数方向等。
这里我们选择外部时钟源和计数器模式。
```。
//打开定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM某, ENABLE);。
//定时器参数设置。
TIM_TimeBaseInitTypeDef TIM_InitStruct;。
TIM_InitStruct.TIM_Prescaler = 16; // 预分频值。
TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式。
TIM_InitStruct.TIM_Period = 999; // 溢出值。
TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;。
TIM_TimeBaseInit(TIM某, &TIM_InitStruct); // 设置定时器参数。
51单片机定时器实验报告
51单片机定时器实验实验内容:实验内容:(1)编写程序使定时器0或者定时器1工作在方式1,定时50ms触发蜂鸣器。
C语言程序#include<reg52.h>#define uint unsigned int#define ucahr unsigned charsbit FM=P0^0;void main(){TMOD=0x01;TH0=(65535-50000)/256;TH0=(65535-50000)%256;EA=1; //开总中断ET0=1; //开定时器0中断TR0=1;while(1);}void T0_time()interrupt 1 {TH0=(65535-50000)/256; TH0=(65535-50000)%256; FM=~FM;}汇编程序ORG 0000HJAMP MAINORG 000BHLJMP INT0_INTORG 0100HMIAN: SETB EASETB ET0AJMP $INT0_INT:MOV R2,#0FAHMOV R3,#0C8HDJNZ R3,$DJNZ R2,INT0_INTRETI(2)编写程序使定时器0或者定时器1工作在方式1,定时500ms使两位数码管从00、01、02……98、99每间隔500ms加1显示。
#include<reg52.h>#define uint unsigned int#define ucahr unsigned charuint num,num1;sbit FM=P0^7;int shi,ge,a;void delay(uint);void shumaguan();unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83, 0xc6,0xa1,0x86,0x8e}; //共阳极数码管0-F编码表void main(){TMOD=0x01;TH0=(65535-50000)/256; TH0=(65535-50000)%256; EA=1; //开总中断ET0=1; //开定时器0中断TR0=1;while(1){shumaguan();}}void T0_time()interrupt 1 {TH0=(65535-50000)/256; TH0=(65535-50000)%256;num1++;if(num1==10) {num1=0;num++;shi=num/10;ge=num%10;if(num==100) {num=0;}}}void shumaguan() {P3=0x01;P2=table[shi];delay(5);P3=0x02;P2=table[ge]; delay(5);void zuoyi(){a=~P3;a=a<<1;P3=~a;if(P3==0xfb){P3=0xfe;}}void delay(uint x) {int i,j;for(i=0;i<x;i++)for(j=0;j<110;j++);}(3)编写程序使定时器0或者定时器1工作在方式2,自动重装载模式,定时500ms 使两位数码管从00、01、02……98、99每间隔500ms加1显示。
闹钟+定时器主程序代码(STM8 单片机)
}
}
//**********************校时函数****************************//
void adjust_times(void)
{
if(ok==0)
{
display(days);
if(lr==0)ud=&A;
unsigned char days[8];//存放当前日期
unsigned char T1=100;//200x10ms=1s秒计算
unsigned char T2=0;//20x10ms=200ms
unsigned char c=0;//用于记录闹钟个数
unsigned char hour=8,minute,second;
unsigned char hour_[5],minute_[5],second_[5]={1,2,3,4,5};
unsigned char sec_time[8];
unsigned char clocks[5][8];//可存5个闹钟信息
unsigned char times[8];//存放当前时间
run=0;
sec1=0;
sec2=0;
esc=0;
}
}
//**********************闹钟设置****************************//
void set_clock(void)
{
unsigned char i,j;
display(times);
if(lr==0)ud=&G;//指针指向G
if(lr==1)ud=&H;
51单片机定时器计数器汇编实验报告
批阅长沙理工大学实验报告年级光电班号姓名同组姓名实验日期月日指导教师签字:批阅老师签字:内容一、实验目的四、实验方法及步骤二、实验原理五、实验记录及数据处理三、实验仪器六、误差分析及问题讨论单片机定时器/计数器实验一、实验目的1、掌握51单片机定时器/计数器的基本结构。
2、掌握定时器/计数器的原理及编程方法。
二、实验仪器1、装有keil软件的电脑2、单片机开发板三、实验原理51单片机有2个16位的定时器/计数器,分别是T0和T1,他们有四种工作方式,现以方式1举例。
若定时器/计数器0工作在方式1,计数器由TH0全部8位和TL0全部8位构成。
方式1作计数器用时,计数范围是:1-65536(2^16);作定时器用时,时间计算公式是:T=(2^16-计数初值)×晶振周期×12。
四、实验内容1、计算计数初值单片机晶振频率为6MHz,使用定时器0产生周期为120000μs等宽方波连续脉冲,并由P1.0输出。
设待求计数初值为x,则:(2^16-x)×2×10^-6 = 120000×10^-6解得x=5536。
二进制表示为:00010101 10100000B。
十六进制为:高八位(15H),低八位(A0H)。
2、设置相关控制寄存器TMOD设置为xxxx0001B3、程序设计ORG 0000HAJMP MAINORG 30HMAIN: MOV P1,#0FFH ;关闭所有灯ANL TMOD,#0F0H ;置定时器0工作方式1ORL TMOD,#01H ;不影响T1的工作MOV TH0,#15H ;设置计数初始值MOV TL0,#0A0HSETB EA ;CPU开中断SETB ET0 ;定时器0开中断SETB TR0 ;定时器开始运行LOOP: JBC TF0,INTP ;如果TF0=1,则清TF0并转到INTPAJMP LOOP ;然跳转到LOOP处运行INTP: MOV TH0,#15H ;重新设置计数初值MOV TL0,#0A0HCPL P1.0 ;输出取反AJMP LOOPEND AJMP LOOPEND4、实验仿真新建工程项目文件中,并为工程选择目标器件为AT公司的AT89S51。
STC15F2K60S2单片机定时器编程
STC15F2K60S2单片机定时器编程一、STC15F2K60S2 单片机定时器概述STC15F2K60S2 单片机内部集成了 5 个定时器,分别是 2 个 16 位的定时器/计数器 T0 和 T1,2 个 8 位的定时器 T2 和 T3,以及 1 个独立波特率发生器定时器T4。
这些定时器都具有不同的特点和应用场景。
T0 和 T1 是传统的 16 位定时器/计数器,可以工作在定时模式和计数模式。
在定时模式下,通过设置定时器的初值和溢出周期,可以实现精确的定时功能;在计数模式下,可以对外部脉冲进行计数。
T2 和 T3 是 8 位定时器,具有自动重载功能,使用起来更加方便。
T4 是独立波特率发生器定时器,主要用于串行通信中的波特率设置。
二、定时器的工作模式1、定时模式在定时模式下,定时器对内部的系统时钟进行计数。
通过设置定时器的初值和溢出周期,可以实现不同时长的定时功能。
例如,如果系统时钟频率为 12MHz,要实现 1ms 的定时,我们可以计算出定时器的初值为 65536 1000,然后将初值写入定时器的寄存器中。
2、计数模式在计数模式下,定时器对外部引脚输入的脉冲进行计数。
当计数值达到设定的阈值时,产生溢出中断。
三、定时器的相关寄存器1、定时器控制寄存器(TCON)TCON 寄存器用于控制定时器的启动、停止、溢出标志等。
例如,TR0 和 TR1 位分别用于控制 T0 和 T1 的启动和停止,TF0 和 TF1 位则分别表示 T0 和 T1 的溢出标志。
2、定时器模式寄存器(TMOD)TMOD 寄存器用于设置定时器的工作模式和计数方式。
例如,可以通过设置 TMOD 寄存器的某些位来选择定时器是工作在定时模式还是计数模式,以及是 8 位模式还是 16 位模式。
3、定时器初值寄存器(TH0、TL0、TH1、TL1、TH2、TL2、TH3、TL3)这些寄存器用于存储定时器的初值。
在定时模式下,通过设置初值可以控制定时器的溢出周期;在计数模式下,初值则决定了计数的阈值。
PIC单片机定时器代码
PIC 单片机定时器代码#include <pic.h>/*#define PORTAIT(add,bit)((unsigned)(&add)*8+(bit))static bit PORTA_0 @PORTAIT(PORTA,0);//PIC16F84Astatic bit PORTA_1 @PORTAIT(PORTA,1);static bit PORTA_2 @PORTAIT(PORTA,2);static bit PORTA_3 @PORTAIT(PORTA,3);static bit PORTA_4 @PORTAIT(PORTA,4);*/unsigned int ttr=0;// 无符号整型变量ttr ,并赋值0unsigned char x=0,y=0,sign_a=0;// 无符号字符型变量void key_server(); // 键值服务函数void display(unsigned int x);// 带形参的显示函数void display_set(unsigned int x);// 键值显示函数void delay_1m(); // 按键延时函数-1mvoid delay(unsigned long int k ) // 延时函数{unsigned long int i; // 无符号字符型变量ifor(i=0;i<=k;i++) // rov 语句continue; // 继续循环}void display(unsigned int x)// 带形参X 的显示函数(开始){unsigned int d=49,unit_bit,ten_bit,hund_bit,thou_bit;// 无符号整型变量 d 和位(个、十、百、千) unsigned char SEG7[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 并初始化unit_bit=x%10; // picc 编译器可识别的个位ten_bit=x/10%10; // picc 可识别的十位hund_bit=x/100%10; // picc 可识别的百位thou_bit=x/1000%10; // picc 可识别的千位while(d>0) // while 语句{PORTA=0x1f; //关显示PORTB=SEG7[unit_bit]; // 个位段码送 B 口RA3=0; // 显示个位delay(200); // 延时RA3=1; // 关个位显示delay(2); // 延时PORTB=SEG7[ten_bit]; //十位段码送 B 口RA2=0; // 显示十位delay(200); // 延时RA2=1; // 关十位显示delay(2); // 延时PORTB=SEG7[hund_bit]; //百位段码送 B 口RA1=0; // 显示百位delay(200); // 延时RA1=1; // 关百位显示delay(2); // 延时PORTB=SEG7[thou_bit]; // 千位段码送 B 口RA0=0; // 显示千位delay(200); /// 延时RA0=1; // 关百位显示delay(2); // 延时d--; // d 从2900 开始自减量if( RA4==0) // K1 按下?{ // 未按下退出执行上程序while(1){if( RA4==1) //按下,执行以下程序{sign_a=1; d=0;break; // 跳出循环} } } } } void main( ) // 主程序{TRISB=0x00; // A 口初始化TRISA=0x10;PORTB=0x40; INTCON=0x00;//PORTA=0x10;ttr=0; // 给ttr 赋值0while(1) // while 循环语句开始{while(x<24) // 限制时钟最大为24(时) {y=0; //给y赋值0while(y<60) // 限制时钟最大60(分){ttr=x*100+y; // 算术运算符表达式display(ttr); // 调显示函数key_server(); // 调键值服务程序y++; //分(y)自增量ttr=0; // 给ttv 赋值0}x++; //时(X)自增量}x=0; //给X 赋值0y=0; // 给Y 赋值0}}void key_server()// 键值服务程序{unsigned char k=0; // 记录按键次数变量unsigned int value=0; // 存储显示值变量while(sign_a==1){display_set(value); // 调键值显示函数if((RA4==0)&&(k==0)) //第一次按下K1 {while(1) // 设定时钟的分值{y++; // K1 未放开,分从0~59 累加if(y>59)y=0; // 分值大于59,Y 清0 value=x*100+y;//将X (时)和Y (分)按显示格式display_set(value); // 整合计算,再显示delay_1m(); // 按键延时,以便观察if(RA4==1) // 如果K1 放开{ // 进入小时设定,K=1k=1; // 小时设定开始break; // 跳出分钟设定循环}}}if((RA4==0)&&(k==1))// 第二次按下K1{ // K=1 ,进入小时设定循环x++;// 24 小时制,K1 未放开,X 一直累加到23 if(x>23) // X>23 ,X 清0x=0;value=x*100+y;// 整合计算设定值display_set(value); // 调键值显示delay_1m(); // 延时display_set(value); // 调键值显示while(1) // 重复{x++;if(x>23)x=0;value=x*100+y;display_set(value);delay_1m();display_set(value);if(RA4==1) // 如果K1 放开{sign_a=0; // 清0 设定时间标志位y=y-1;break; // 跳出设定循环返回}}}}}void display_set(unsigned int x)// 键值显示程序{thou_bit;unsigned char SEG7[10]={ 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 这里的注释与显示displa 的函数相似unit_bit=x%10;ten_bit=x/10%10;hund_bit=x/100%10;thou_bit=x/1000%10;while(d>0){PORTA=0x1F; //63;PORTB=SEG7[unit_bit];RA3=0;delay(200);RA3=1;delay(2);PORTB=SEG7[ten_bit];RA2=0;delay(200);RA2=1;delay(2);PORTB=SEG7[hund_bit];RA1=0;delay(200);RA1=1;delay(2);PORTB=SEG7[thou_bit];RA0=0;delay(200);RA0=1;delay(2);d--;}}void delay_1m()//按键K1,延时函数开始{unsigned long int k; // 说明语句for(k=0;k<4;k++) // for 语句{display_set(x*100+y); // 调键值显示函数。
C51单片机 定时器可调时钟 程序
void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数
unsigned char KeyScan(void);//键盘扫描
void Init_Timer0(void);//定时器初始化
{
case 0xfe:return 1;break;
case 0xfd:return 2;break;
case 0xfb:return 3;break;
case 0xf7:return 4;break;
case 0xef:return 5;break;
case 0xdf:return 6;break;
minute++;
if(minute==60)//分钟到60,小时加1
{
minute=0;
hour++;
if(hour==24)//小时到24,回零
hour=0;
}
}
}
}
/*------------------------------------------------
按键扫描函数,返回扫描键值
------------------------------------------------*/
break;
case 4:minute--;if(minute==255)minute=59; //分钟减1
break;
default:break;
}
if(UpdateTimeFlag==1)
{
UpdateTimeFlag=0;
TempData[0]=dofly_DuanMa[hour/10]; //时//数据的转换,因我们采用数码管0பைடு நூலகம்9的显示,将数据分开
单片机实验二 定时器实验程序
sbit L3=P0^7;
unsigned char keynum;
unsigned int lasttime=100;
bit bset=0;
unsigned char keyscan();
void display();
unsigned char getkey();
void set();
code unsigned char table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71};
sbit H1=P3^6;
sbit H2=P3^7;
sbit L1=P0^5;
void main()
{
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
P1M1=0x00;
P1M0=0xff;
while(1)
{
keynum=keyscan();
display();
set();
}
}
void timer0() interrupt 1
{
P1=0X00;
W1=1;
W2=0;W3=1;W4=1;
P1=table[(unsigned char)(lasttime%1000/100)]|a;
}
else if(ct1<60)
{
P1=0X00;
W2=1;
W3=0;W4=1;W1=1;
P1=table[(unsigned char)(lasttime%1000%100/10)]|a;
单片机汇编程序51电子时钟.doc
单片机汇编程序 51电子时钟电子钟设计实验报告一)实验目的:1、进一步掌握定时器的使用和编程方法。
2、进一步掌握中断处理程序的编程方法。
3、进一步掌握数码显示电路的驱动方法。
4、进一步掌握键盘电路的驱动方法。
5、进一步掌握软件数据处理的方法。
二)内容要求:1、利用CPU的定时器和数码显示电路,设计一个电子时钟。
格式如下:XX XX XX 由左向右分别为:时、分、秒。
2、电子时钟有秒表功能。
3、并能用键盘调整时钟时间。
4、电子时钟能整点报时、整点对时功能。
5、能设定电子时钟的闹铃。
三)主要元件:电阻4.7K 10个 2K 1个四位共阳数码管1个二位共阳数码管1个按钮开关4个万用板(中板)1个 9012PNP 7个排线排阵若干电线一捆蜂鸣器1个最小系统一个四)系统说明:按P1.0键,如果按下的时间小于1秒进入省电模式(数码管不显示,开T0计时器),如果按下的时间大于1秒则进入时间调整.。
在时间调整状态:再按P1.0,如果按下时间大于0.5秒转调小时状态,按下时间小于0.5秒加1分钟操作。
在小时调整状态再按P1.0键,如果按下时间大于0.5秒退出时间调整,如果按下时间小于0.5秒加1小时操作。
按P1.1键,进入闹铃调分状态,按P1.2分加1,按P1.0分减1。
若再按P1.3,则进入调整状态,按P1.2时加1,按P1.0分时。
按P1.1键,闹铃有效,显示式样变为00:00:—0;再按P1.1键,闹铃无效,显示式样变为00:00:—。
按P1.3键,调整闹钟时间结束。
按P1.2键,进入秒表计时功能,按P1.2键暂停或清零,按P1.1键退出秒表回到时钟状态。
而且本系统还有整点报时功能,以及按键伴有声音提示。
五)程序流程图:开始 TO中断初始化保护现场进入功能调用显示定时初值校正程序子程序N Y键按下, 1S到,Y N加1S处理整点到NY恢复现场,中断返回按时间鸣叫次数主程序流程图 T0中断计时程序流程图T1中断保护现场T1中断服务程序流程图秒表/闪烁,时钟调时闪烁加10MS处理闪烁处理恢复现场,中断返回六)电路图七)程序清单:中断入口程序 ;; DISPFIRST EQU 30H BELL EQU P1.4CONBS EQU 2FHOUTPX EQU P2 ;P2位选OUTPY EQU P0 ;P0段选INP0 BIT P1.0INP1 BIT P1.1INP2 BIT P1.2ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;QQQQ:MOV A,#10HMOV B,79HMUL ABADD A,78HMOV CONBS,ABSLOOP:LCALL DS20MSLCALL DL1SLCALL DL1SLCALL DL1SDJNZ CONBS,BSLOOPCLR 08HAJMP START;; 主程序 ;;START:MOV R0,#00H ;清70H-7AH共11个内存单元MOV R7,#80H ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用) MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50MS×20)MOV DISPFIRST ,#70HSTART1: LCALL DISPLAY ;调用显示子程序JNB INP0,SETMM1 ;P1.0口为0时转时间调整程序JNB INP1,FUNSS ; 秒表功能,P1.1按键调时时作减1加能JNB INP2,FUNPT ;STOP,PUSE,CLRJNB P1.3,TSFUNSJMP START1 ;P1.0口为1时跳回START1SETMM1: LJMP SETMM ;转到时间调整程序SETMM FUNSS: LCALL DS20MSJB INP1,START1WAIT11: JNB INP1,WAIT11CPL 03HMOV DISPFIRST,#00H :显示秒表数据单元MOV 70H,#00HMOV 71H,#00HMOV 76H,#00HMOV 77H,#00HMOV 78H,#00HMOV 79H,#00HAJMP START1FUNPT: LCALL DS20MSJB INP2,START1WAIT22: JNB INP2,WAIT21CLR ET0CLR TR0WAIT33: JB INP2,WAIT31 LCALL DS20MSJB INP2,WAIT33WAIT66: JNB INP2,WAIT61 MOV R0,#70H ;清70H-79H共10 个内存单元MOV R7,#0AH ;CLEARP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARP ;WAIT44: JB INP2,WAIT41 LCALL DS20MSJB INP2,WAIT44WAIT55: JNB INP2,WAIT51 SETB ET0SETB TR0AJMP START1WAIT21: LCALL DISPLAY AJMP WAIT22WAIT31: LCALL DISPLAY AJMP WAIT33WAIT41: LCALL DISPLAYAJMP WAIT44WAIT51: LCALL DISPLAYAJMP WAIT55WAIT61: LCALL DISPLAYAJMP WAIT66 TSFUN:LCALL DS20MSWAIT113:JNB P1.3,WAIT113JB 05H,CLOSESPMOV DISPFIRST,#50HMOV 50H,#0CHMOV 51H,#0AHDSWAIT:SETB EALCALL DISPLAYJNB P1.2,DSFINCJNB P1.0,DSDECJNB P1.3,DSSFU AJMP DSWAITCLOSESP:CLR 05HCLR BELLAJMP START1 DSSFU:LCALL DS20MS JB P1.3,DSWAIT LJMP DSSFUNN DSFINC:LCALL DS20MS JB P1.2,DSWAIT DSWAIT12:LCALL DISPLAY JNB P1.2,DSWAIT12 CLR EAMOV R0,#53H LCALL ADD1MOV A,R3CLR CCJNE A,#60H,ADDHH22ADDHH22:JC DSWAITACALL CLR0AJMP DSWAITDSDEC:LCALL DS20MSLCALL DISPLAYDSWAITEE:LCALL DISPLAYJNB P1.0,DSWAITEECLR EAMOV R0,#53HLCALL SUB1LJMP DSWAIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0JB 03H,FSSMOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0 MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志JB 03H,OUTT0 ;秒表时最大数为99CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;LCALL BAOJPOP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断RETI ;中断返回 ;秒表计时程序(10MS加1),低2位为0.1、0.01秒,中间2位为秒,最高位为分。
单片机10秒倒计时c语言汇编语言程序
单片机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:感谢大家的阅读,本文由我司收集整编。
基于单片机的定时器设计汇编
基于单片机的定时器设计摘要:生活处处都有单片机,家里的所有电器只要是智能控制的都是单片机控制、现在智能手机中arm处理器也是一种高级单片机。
本文是对实时控制中的,实时显示这一功能进行进一步的研究。
实时控制系统,相对于其他的控制系统,最重要的一点就是实时。
文中的实时,指的是对时间的显示。
时间的显示包括对时、分的显示。
这些时间的显示,可以按照自己的需求进行进一步的设定。
这个实时系统,可以是通过串口接收的上位机,接收上位机中的信号,根据需求来进行时间的显示,帮助系统实现实时的效果。
同时,它可进行时间的独立显示。
利用STC89C51RC单片机作为本系统的中控模块。
上电后,按下功能键进入调时状态,通过各单元电路将按键部分设定的时间通过定时时间显示部分中的LED数码管显示出来。
中途可重新设置定时数值,复位部分除上电初实现复位外,也可人工复位。
关键词:实时;单片机;数码管;按键复位。
Based on single chip microcomputer timer designAbstract:Life is a single chip, all appliances at home as long as the intelligent control is now SCM control Intelligent mobile phone ARM processor is a kind of advanced single chip microcomputer.This article is in real-time control, real-time display this function for further studies. Real-time control system, relative to other control system, the most important thing is that in real time. In this paper, the real-time, refers to the display of time. The display includes pair, the display of the time. The display of the time, can according to your needs further. The real-time system, can be via a serial port to receive the upper machine, receiving signals in the PC, according to the demand for time display, help system to realize real time effect. At the same time, it can be independent of time.Using 89C51 microcontroller as the system control module. After power on, press the function key to transfer state, through each unit circuit timing LED digital display part of the display through the key part of the set time. You may re set the timer values, reset parts in addition to power up reset, the buttons can be reset at any time.Key Words : microcontrolle;digital tube;The Key to return.目录1引言 (1)1.1课题的来源和意义 (1)1.2定时器的应用 (1)1.3电子定时器的发展前景 (1)1.4 确定设计方案 (2)2 51单片机内部结构及计数原理 (2)2.1 51单片机内部机构 (2)2.2计数原理 (2)3 系统硬件配件设计 (4)3.1 芯片的选择 (4)3.2 交流控制接口电路 (5)3.3显示电路 (5)3.4 继电器 (5)3.5数码管 (6)4 硬件电路设计 (7)4.1 中继触发电路 (7)4.2继电器开关电路 (8)4.3时钟电路 (9)5 软件设计 (10)5.1 实现功能 (10)结论 (11)参考文献 (13)致谢 (14)附录1:程序 (15)附录2:系统仿真原理图 (21)1 引言我们在日常生活中,经常碰到一些需要定时的事情,例如:印相或放大照片,需要定在零点几秒的时间,洗衣机洗涤衣物需要定在几分钟到几十分钟的时间,电风扇需要定在数十分钟的时间。
51单片机定时器计数器汇编实验
实验三、定时器/计数器实验报告一、实验内容1、编写单片机程序,用T0作定时器产生周期为1秒的方波(用查询方式编程),从P3.6,P3.7口输出,将P3.7接到示波器显示该方波波形;用T1作计数器对从P3.6输出的方波进行计数,计数结果通过P1口输出到发光二极管显示。
(计算机仿真)2、编写单片机程序,用T0作定时器产生周期为1秒的方波(用查询方式编程),从P3.6,P3.7口输出,将P3.6输出的方波接到P3.5口通过T1作计数器对该方波进行计数,计数值由LED显示,用存储示波器显示P3.7输出的方波。
(实验台验证)3、设计一个60秒计时器,秒计时结果用两位LED数码管显示。
(计算机仿真)二、实验仿真图(1)脉冲计数实验程序ORG 0000HBEGIN:MOV TMOD,#51H MOV TL0,#0F0HMOV TH0,#0DBHMOV TH1,#00HMOV TL1,#00HMOV P1,#00HMOV P0,#00HMOV P2,#00HMOV R3,#00HMOV R4,#00HSETB TR0SETB TR1S1: MOV R1,#33HMOV A,R4MOV R5,TL1ADD A,R5MOV P1,AMOV R2,TL1CJNE R2,#10,S2MOV TH1,#00HMOV TL1,#00HINC R3MOV A,R3MOV DPTR,#TAB1MOVC A,@A+DPTRMOV P2,AMOV P0,#3FHMOV A,R3MOV B,#0AHMUL ABMOV R4,AMOV P1,R4AJMP NEXTS2: MOV R1,#33HMOV DPTR,#TAB1MOV A,TL1MOVC A,@A+DPTRMOV P0,AAJMP NEXT LOOP: JBC TF0,NEXT AJMP LOOPNEXT: MOV TL0,#0F0HMOV TH0,#0DBHDJNZ R1,LOOPCPL P3.6CPL P3.7AJMP S1TAB1:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;(SW3,SW4为:00) END(2)60秒定时器实验程序ORG 0000HBEGIN:MOV TMOD,#51HTL0,#0F0HMOVMOVTH0,#0DBHTH1,#00HMOVTL1,#00HMOVR3,#00HMOVP0,#00HMOVP2,#00HMOVSETBTR0TR1SETBS1: MOV R1,#33HR2,TL1MOVR2,#10,S2CJNETH1,#00HMOVTL1,#00HMOVR3INCR3,#06H,S4CJNER3,#00HMOVS4: MOV A,R3DPTR,#TAB1MOVA,@A+DPTRMOVCP2,AMOVMOVP0,#3FHNEXTAJMPS2: MOV R1,#33HDPTR,#TAB1MOVA,TL1MOVA,@A+DPTRMOVCMOVP0,ANEXTAJMPLOOP: JBC TF0,NEXTLOOPAJMPNEXT: MOV TL0,#0F0HTH0,#0DBHMOVR1,LOOPDJNZP3.6CPLCPLP3.7S1AJMPTAB1:DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH END。
单片机定时器实验程序
定时器#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intUchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e, 0x79,0x71}; //0~F的共阴极字段码表uchar chocode[]={0xfe,0xfd,0xfb,0xf7}; //位选码表uchar N,M;sbit P3_5=P3^5; //位定义sbit P3_6=P3^6;sbit P3_7=P3^7;sbit P0_4=P0^4;sbit P3_3=P3^3;sbit P3_4=P3^4;sbit P0_7=P0^7;//===================================延时1毫秒======================void Delay1ms(){unsigned char i, j;_nop_();i = 2;j = 199;do{while (--j);} while (--i);}//==================================延时300毫秒=====================void Delay300ms(){unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);}//=====================================数码管显示==================void display(uchar N,M){P0=chocode[3];P1=table[M];Delay1ms();P1=0;P0=chocode[2];P1=table[N];Delay1ms();P1=0;P0=chocode[1];P1=table[0];Delay1ms();P1=0;P0=chocode[0];P1=table[0];Delay1ms();P1=0;}//========================扫描键盘,设置倒计时初值=============== void Scan_Key(void){uchar m;bit FLAG0=0;P3_6=0;P3_7=1;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N++;FLAG0=1;if(M==10){N++;M=0;}break;case 0xb0: M++;FLAG0=1;if(M==10){M=0;N++;}break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_6=1;P3_7=0;P0=0xff;m=P0;switch(m&0xf0){case 0xd0: N--;FLAG0=1;break;case 0xb0: M--;FLAG0=1;break;default: break;}if(FLAG0){while((P0|0x0f)!=0xff) //松手检测{display(N,M);}}else{display(N,M);}P3_7=1;P3_6=0;}//==========================主函数==============================main(){P1=0x0;while(1){uchar i;Scan_Key(); //扫描键盘,确定倒计时初值P0=0xff;if(P0_7==0) //检测是否开始倒计时{while((P0|0x0f)!=0xff) //松手检测{display(N,M);}while(1) //定时开始{for(i=0;i<120;i++) //循环定时120次,实现定时1秒钟{TMOD=0x01;TH0=0xd8;TL0=0xf0;TR0=1;display(N,M);do{display(N,M);} while(TF0==0);//检测是否完成一次定时}if((M|N)==0) //定时到,所有灯闪烁{while(1){P0=0xff;P2=0x00;P0_4=0;P3_3=0;P3_4=0;P3_5=0;Delay300ms();P2=0xff;P0_4=1;P3_3=1;P3_4=1;P3_5=1;Delay300ms();}}if(M==0){M=9;N--;}else M--;}}}}。
51单片机定时器设置
51单片机定时器设置51单片机,也被称为8051微控制器,是一种广泛应用的嵌入式系统。
它具有4个16位的定时器/计数器,可以用于实现定时、计数、脉冲生成等功能。
通过设置相应的控制位和计数初值,可以控制定时器的启动、停止和溢出等行为,从而实现精确的定时控制。
确定应用需求:首先需要明确应用的需求,包括需要定时的时间、计数的数量等。
根据需求选择合适的定时器型号和操作模式。
设置计数初值:根据需要的定时时间,计算出对应的计数初值。
计数初值需要根据定时器的位数和时钟频率进行计算。
设置控制位:控制位包括定时器控制寄存器(TCON)和中断控制寄存器(IE)。
通过设置控制位,可以控制定时器的启动、停止、溢出等行为,以及是否开启中断等功能。
编写程序代码:根据需求和应用场景,编写相应的程序代码。
程序代码需要包括初始化代码和主循环代码。
调试和测试:在完成设置和编程后,需要进行调试和测试。
可以通过观察定时器的状态和输出结果,检查定时器是否按照预期工作。
计数初值的计算要准确,否则会影响定时的精度。
控制位的设置要正确,否则会导致定时器无法正常工作。
需要考虑定时器的溢出情况,以及如何处理溢出中断。
需要考虑定时器的抗干扰能力,以及如何避免干扰对定时精度的影响。
需要根据具体应用场景进行优化,例如调整计数初值或控制位等,以达到更好的性能和精度。
51单片机的定时器是一个非常实用的功能模块,可以用于实现各种定时控制和计数操作。
在进行定时器设置时,需要注意计数初值的计算、控制位的设置、溢出处理以及抗干扰等问题。
同时需要根据具体应用场景进行优化,以达到更好的性能和精度。
在实际应用中,使用51单片机的定时器可以很方便地实现各种定时控制和计数操作,为嵌入式系统的开发提供了便利。
在嵌入式系统和微控制器领域,51单片机因其功能强大、使用广泛而备受。
其中,定时器中断功能是51单片机的重要特性之一,它为系统提供了高精度的定时和计数能力。
本文将详细介绍51单片机定时器中断的工作原理、配置和使用方法。
单片机汇编中断程序(定时器中断)
单片机汇编中断程序(定时器中断)
;首相,介绍一下51 单片机的定时计数器,51 有两个定时计数器,分别为
T0,T1,基本一样,
;有一点不同,下面我们介绍定时计数器T0
;了解8051 的timer0 中断的程序写法,用中断法产生定时
;上面显示的是proteus 仿真图,下面的是源程序
;说明:(源程序中的终端入口地址很重要(这个是固定的),程序中断时,
会在对应中断固定的
;入口地址进入,因为规定的相隔入口间的空进有限,只能用跳转指令跳转,最终用RETI 强制返回
;这个程序把所有的中断入口地址都写上了,没有用到的,用RETI 直接屏蔽)
;运行结果是使led 灯明一下,暗一下。
COUNT EQU9217;对于11.0592 的晶振来说,延时10ms
LEDEQUP1.1
ORG0000H
LJMP RESET;开始时跳转转到初始化程序中
ORG0003H;外部中断0
RETI
ORG000BH;定时器/计数器T0 入口地址
LJMP INT_TIMER0;跳转到定时器/计数器中断服务程序中去
ORG0013H;外部中断1。
单片机定时器实验程序
void tim(void) interrupt 1 using 1
{
ET0=0; TR0=0;
//关闭中断 保证程序顺利运行
TH0=0xd8; //重新赋值
TL0=0xf0;
count++;
if (count==100)
{
count=0;
time--; //second 秒减 1
if(time==0) //second
void DelayMS(uint xms)
{
uint i,j;
for(i=xms;i>0;i--) for(j=300;j>0;j--);
}
/******************************************************************/
/*
显示函数 1
*/
/******************************************************************/
T1_init();
//P0=0xff;
while(1) { keyscan(); // k = key(); switch(k) { case KM: { Display1(); break; }
//无任何按键按下 默认为 0 返回
case 1: { time+=10; time=time%99; Display1(); k=KM; break; }
void T1_init()
{ TMOD |=0x01;//定时器设置 10ms in 12M crystal,工作在模式 1,16 位定时 TH0=0x0dc; TL0=0x00; EA=1; //开总中断 //IE= 0x82; //打开中断
c语言单片机定时器计数器程序
C语言单片机定时器计数器程序1. 简介C语言是一种被广泛应用于单片机编程的高级编程语言,它可以方便地操作单片机的各种硬件模块,包括定时器和计数器。
定时器和计数器是单片机中常用的功能模块,它们可以用来实现精确的时间控制和计数功能。
本文将介绍如何使用C语言编程实现单片机的定时器计数器程序。
2. 程序原理在单片机中,定时器和计数器通常是以寄存器的形式存在的。
通过对这些寄存器的操作,可以实现定时器的启动、停止、重载以及计数器的增加、减少等功能。
在C语言中,可以通过对这些寄存器的直接操作来实现对定时器和计数器的控制。
具体而言,可以使用C语言中的位操作和移位操作来对寄存器的各个位进行设置和清零,从而实现对定时器和计数器的控制。
3. 程序设计在编写单片机定时器计数器程序时,首先需要确定定时器的工作模式,包括定时模式和计数模式。
在定时模式下,定时器可以按照设定的时间间隔生成中断,从而实现定时功能;在计数模式下,定时器可以根据外部的脉冲信号进行计数。
根据不同的应用需求,可以选择不同的工作模式,并根据具体情况进行相应的配置。
4. 程序实现在C语言中,可以通过编写相应的函数来实现对定时器和计数器的控制。
需要定义相关的寄存器位置区域和位掩码,以便于程序对这些寄存器进行操作。
编写初始化定时器的函数、启动定时器的函数、停止定时器的函数、重载定时器的函数等。
通过这些函数的调用,可以实现对定时器的各种操作,从而实现定时和计数功能。
5. 示例代码以下是一个简单的单片机定时器计数器程序的示例代码:```c#include <reg52.h>sbit LED = P1^0; // 定义LED连接的引脚void InitTimer() // 初始化定时器{TMOD = 0x01; // 设置定时器0为工作在方式1TH0 = 0x3C; // 设置初值,定时50msTL0 = 0xAF;ET0 = 1; // 允许定时器0中断EA = 1; // 打开总中断void Timer0_ISR() interrupt 1 // 定时器0中断服务函数{LED = !LED; // 翻转LED状态TH0 = 0x3C; // 重新加载初值,定时50msTL0 = 0xAF;}void m本人n(){InitTimer(); // 初始化定时器while(1){}}```以上代码实现了一个简单的定时器中断程序,当定时器计数到50ms 时,会触发定时器中断,并翻转LED的状态。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MOV 32H,#0H
MOV 31H,#0H
MOV 30H,#0H
LOOP0: LCALL DISPLAY
JB P3.4,LOOP0 ;判启动
LCALL DISPLAY
MOV A,36H
MOV P0,A
SETB P2.7
LCALL DELAY
MOV P0,#0FFH
CLR P2.7
RET
DELAY: MOV R6,#2
SETB P2.6
NOP
CLR P2.6
MOV A,36H
MOV P0,A
SETB P2.7
LCALL DELAY
MOV P0,#0FFH
CLR P2.7
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
NOP
CLR P2.6
MOV A,36H
MOV P0,A
SETB P2.7
RR A
MOV 36H,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
ORL A,#80H
MOV P0,A
SETB P2.6
SETB P2.7
LCALL DELAY
MOV P0,#0FFH
CLR P2.7
RR A
MOV 36H,A
INC R0
MOV A,@R0
ORG 0000H
AJMP MAIN
ORG 002BH
LJMP CTC2
ORG 0050H
MAIN: MOV SP,#7FH
MOV TH0,#0DCH
MOV TL0,#00H
RR A
MOV 36H,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
NOP
CLR P2.6
MOV RCAP2H,#0DCH
MOV RCAP2L,#00H
MOV T2CON,#00H
SETB ET2
SETB EA
MOV 35H,#0H
MOV 34H,#0H
END
JB P3.6,X1 ;判复位0秒
LCALL DISPLAY
JB P3.6,X1
LJMP MAIN
CTC2: PUSH PSW ;百分之一秒(10ms)到
PUSH ACC
LOOP: MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
SETB P2.6
NOP
CLR P2.6
MOV A,36H
MOV P0,A
DEL1: MOV R5,#250
DJNZ R5 ,$
DJNZ R6,DEL1
RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,ELAY
MOV P0,#0FFH
CLR P2.7
RR A
MOV 36H,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV 33H,#0H
INC 34H
MOV A,34H
CJNE A,#10,ADDONE1
MOV 34H,#0H
INC 35H
MOV A,35H
CJNE A,#06H,ADDONE1
JB P3.4,LOOP0
SETB TR2
LOOP1: LCALL DISPLAY
JB P3.5,LOOP1 ;判暂停
LCALL DISPLAY
JB P3.5,LOOP1
CLR TR2
X1: LCALL DISPLAY
MOV P0,#0FFH
CLR P2.7
RR A
MOV 36H,A
INC R0
MOV A,@R0
MOVC A,@A+DPTR
MOV P0,A
MOV 31H,#0H
INC 32H
MOV A,32H
CJNE A,#10,ADDONE1
MOV 32H,#0H
INC 33H
MOV A,33H
CJNE A,#6,ADDONE1
ADDONE: INC 30H
MOV A,30H
CJNE A,#10,ADDONE1
MOV 30H,#0H
INC 31H
MOV A,31H
CJNE A,#10,ADDONE1
ORL A,#80H
MOV P0,A
SETB P2.6
NOP
CLR P2.6
MOV A,36H
MOV P0,A
SETB P2.7
LCALL DELAY
NOP
CLR P2.6
MOV A,36H
MOV P0,A
SETB P2.7
LCALL DELAY
MOV P0,#0FFH
CLR P2.7
MOV 35H,#0H
ADDONE1:CLR TF2
POP ACC
POP PSW
RETI
DISPLAY:MOV R0,#30H
MOV DPTR,#TAB
MOV 36H,#0DFH