单片机定时器汇编程序.
- 格式:doc
- 大小:13.00 KB
- 文档页数:2
单片机延时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); // 设置定时器参数。
单片机定时器实验报告篇一:单片机实验报告——定时器实验四定时器实验自动化121班 36 张礼一.实验目的掌握定时器的工作原理及四种工作方式,掌握定时器计数初始值的计算,掌握如何对定时器进行初始化,以及程序中如何使用定时器进行定时。
二.实验仪器单片机开发板一套,计算机一台。
三.实验任务编写程序,使用单片机开发板上8位共阴极数码管的其中一位来显示0~9这九个字符,先从“0”开始显示,数字依次递增,当显示完“9”这个字符后,又从“0”开始显示,循环往复,每1秒钟变换一个字符,1秒钟的定时时间必须由定时器T0(或T1)提供。
开发板上的8位共阴极数码管与单片机的输入输出端口P1的硬件接线如图4-1所示,单片机P1口的8条数据线通过J3端子同时连接到 2片74HC573D锁存器的输入端,数码管的各个同名端分别连接后再与锁存器U2的8个输出端相连,每一位数码管的位选端分别与锁存器U3的8个输出端相连。
两片锁存器的输出使能端OE都恒接地,使得锁存器的内部数据保持器输出端与锁存器的输出端保持接通。
而U2的锁存使能端LE由P2.1控制,所以P2.1是段锁存;U3的锁存使能端LE由P2.0控制,所以P2.0是位锁存。
当锁存使能端为“1”时,则锁存器输入端的数据传送到输出端;当锁存使能端为“0”时,锁存器输入端的数据则不能传送到输出端;因此段码和位码通过锁存器分时输出。
汇编语言程序流程如图4-2:四.实验步骤:1.数码管的0~9的字型码表如下:2.参考图4-2所给的程序流程图编写实验程序。
(注:以下程序为两位60秒计数程序)#include sbit wei=P2^0; sbit duan=P2^1;char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};int i,j,k,num,shi,ge; void delay(int a) {for(i=0;i void display(int shi,int ge){wei=1;P1=0xfe;wei=0;duan=1;P1=table[shi];duan=0;wei=1; delay(5);P1=0xfd;wei=0; duan=1;P1=table[ge];duan=0; }void main() {TMOD=0x01;TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; num=0; while(1) {delay(5);display(shi,ge); } }void T0_time() interrupt 1 {TH0=(65536-45872)/256; TL0=(65536-45872)%256; k++; if(k==20) { k=0; num++;if(num==60)num=0; shi=num/10; ge=num%10; } }3.实验接线,如图4-1。
单片机定时器实验报告篇一:单片机实验报告——定时器实验四定时器实验自动化121班 36 张礼一.实验目的掌握定时器的工作原理及四种工作方式,掌握定时器计数初始值的计算,掌握如何对定时器进行初始化,以及程序中如何使用定时器进行定时。
二.实验仪器单片机开发板一套,计算机一台。
三.实验任务编写程序,使用单片机开发板上8位共阴极数码管的其中一位来显示0~9这九个字符,先从“0”开始显示,数字依次递增,当显示完“9”这个字符后,又从“0”开始显示,循环往复,每1秒钟变换一个字符,1秒钟的定时时间必须由定时器T0(或T1)提供。
开发板上的8位共阴极数码管与单片机的输入输出端口P1的硬件接线如图4-1所示,单片机P1口的8条数据线通过J3端子同时连接到 2片74HC573D锁存器的输入端,数码管的各个同名端分别连接后再与锁存器U2的8个输出端相连,每一位数码管的位选端分别与锁存器U3的8个输出端相连。
两片锁存器的输出使能端OE都恒接地,使得锁存器的内部数据保持器输出端与锁存器的输出端保持接通。
而U2的锁存使能端LE由P2.1控制,所以P2.1是段锁存;U3的锁存使能端LE由P2.0控制,所以P2.0是位锁存。
当锁存使能端为“1”时,则锁存器输入端的数据传送到输出端;当锁存使能端为“0”时,锁存器输入端的数据则不能传送到输出端;因此段码和位码通过锁存器分时输出。
汇编语言程序流程如图4-2:四.实验步骤:1.数码管的0~9的字型码表如下:2.参考图4-2所给的程序流程图编写实验程序。
(注:以下程序为两位60秒计数程序)#include sbit wei=P2^0; sbit duan=P2^1;char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};int i,j,k,num,shi,ge; void delay(int a) {for(i=0;i void display(int shi,int ge){wei=1;P1=0xfe;wei=0;duan=1;P1=table[shi];duan=0;wei=1; delay(5);P1=0xfd;wei=0; duan=1;P1=table[ge];duan=0; }void main() {TMOD=0x01;TH0=(65536-45872)/256; TL0=(65536-45872)%256; EA=1; ET0=1; TR0=1; num=0; while(1) {delay(5);display(shi,ge); } }void T0_time() interrupt 1 {TH0=(65536-45872)/256; TL0=(65536-45872)%256; k++; if(k==20) { k=0; num++;if(num==60)num=0; shi=num/10; ge=num%10; } }3.实验接线,如图4-1。
批阅长沙理工大学实验报告年级光电班号姓名同组姓名实验日期月日指导教师签字:批阅老师签字:内容一、实验目的四、实验方法及步骤二、实验原理五、实验记录及数据处理三、实验仪器六、误差分析及问题讨论单片机定时器/计数器实验一、实验目的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。
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); // 调键值显示函数。
ORG 0000H AJMP MAIN ORG 002BH LJMP CTC2 ORG 0050H MAIN: MOV SP,#7FH MOV TH0,#0DCH MOV TL0,#00H MOV RCAP2H,#0DCH MOV
RCAP2L,#00H MOV T2CON,#00H SETB ET2 SETB EA MOV 35H,#0H MOV
34H,#0H MOV 33H,#0H MOV 32H,#0H MOV 31H,#0H MOV 30H,#0H LOOP0: LCALL DISPLAY JB P3.4,LOOP0 ;判启动 LCALL DISPLAY JB P3.4,LOOP0 SETB TR2 LOOP1: LCALL DISPLAY JB P3.5,LOOP1 ;判暂停 LCALL DISPLAY JB
P3.5,LOOP1 CLR TR2 X1: LCALL DISPLAY JB P3.6,X1 ;判复位0秒 LCALL DISPLAY JB P3.6,X1 LJMP MAIN CTC2: PUSH PSW ;百分之一秒(10ms)到PUSH ACC ADDONE: INC 30H MOV A,30H CJNE A,#10,ADDONE1 MOV 30H,#0H INC 31H MOV A,31H CJNE A,#10,ADDONE1 MOV 31H,#0H INC 32H MOV A,32H CJNE A,#10,ADDONE1 MOV 32H,#0H INC 33H MOV A,33H CJNE A,#6,ADDONE1 MOV 33H,#0H INC 34H MOV A,34H CJNE A,#10,ADDONE1 MOV 34H,#0H INC 35H MOV A,35H CJNE A,#06H,ADDONE1 MOV 35H,#0H ADDONE1:CLR TF2 POP ACC POP PSW RETI DISPLAY:MOV R0,#30H MOV DPTR,#TAB MOV
36H,#0DFH LOOP: MOV A,@R0 MOVC A,@A+DPTR MOV P0,A SETB P2.6 NOP CLR P2.6 MOV A,36H MOV P0,A SETB P2.7 LCALL DELAY MOV P0,#0FFH CLR P2.7 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 A,36H MOV P0,A SETB P2.7 LCALL DELAY MOV
P0,#0FFH CLR 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 NOP CLR P2.6 MOV A,36H MOV P0,A SETB
P2.7 LCALL DELAY MOV P0,#0FFH CLR P2.7 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 A,36H MOV P0,A SETB P2.7 LCALL DELAY MOV P0,#0FFH CLR 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 NOP CLR P2.6 MOV A,36H MOV P0,A SETB P2.7 LC
ALL DELAY MOV P0,#0FFH CLR P2.7 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 A,36H MOV P0,A SETB P2.7 LCALL DELAY MOV P0,#0FFH CLR P2.7 RET DELAY:
MOV R6,#2 DEL1: MOV R5,#250 DJNZ R5 ,$ DJNZ R6,DEL1 RET TAB: DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71H,00H END。