使用8051片内定时器T0实现从p1.0输出周期10ms的方波。时钟频率为12MHz...求单片机程序。汇编,在线等!谢

使用8051片内定时器T0实现从p1.0输出周期10ms的方波。时钟频率为12MHz...求单片机程序。汇编,在线等!谢,第1张

ORG 0000H

JMP START

ORG 0BH

JMP TIMER0

START:

MOV TMOD,#01H

MOV TH0,#(65536-5000) / 256

MOV TL0,#(65536-5000) MOD 256

SETB ET0

SETB TR0

SETB EA

JMP $

TIMER0:

MOV TH0,#(65536-5000) / 256

MOV TL0,#(65536-5000) MOD 256

CPL P10

RETI

END

具体如下所示:

1、为13位计数器,由TL(1/0)的低5位和TH(0/1)的8位组,此时TL(1/0)的高3位未用。

C/T:C/T为0就是用作定时器(开关往上打),如果C/T为1就是用作计数器(开关往下打)。GATE:GATE后非门后是一或门,GATE=0时只要TR1=0则开关闭合。

2、是16位的定时/计数方式,将M1、M0设为01即可,其它特性与工作方式0相同。

3、自动装入预置数的工作方式。当溢出后,T(0/1)高、低八位之间的开关打开,放在高八位的预置数进入低八位,开始第二轮,由硬件完成。代价是计数范围少一半。

4、定时/计数器被拆成2个独立的定时/计数器来用。

TL0能组成8位的定时器或计数器的工作方式,而TH0则只能作为定时器来用。

TLO使用T0状态控制位C/T、GATE、TR0、INT0,而TH0使用T1的状态控制位TR1,一般只有T1以方式2运行(当波特率发生器用),才能让T0以方式3工作。

扩展资料:

定时器/计数器的定时/计数范围:

工作方式1:13位定时/计数方式,因此,最多能计到2的13次方,也就是8192次。

工作方式2:16位定时/计数方式,因此,最多能计到2的16次方,也就是65536次。

工作方式3和工作方式4,都是8位的定时/计数方式,因此,最多能计到2的8次方,也说是256次。

unsigned

char

n;

sbit

gate1=p1^0;

sbit

gate2=p1^1;

main()

{

n=0;

th1=0xff;

tl1=0x05;

//定时器250us产生一次中断

mod

=

0x10;

//定时器1工作于模式1,(用工作于模式2也可以,而且更

简便)

tr1=1;

//使能定时器1

et0=1;

//开中断

ea=1;

//开全局中断

while(1)

{;}

}

void

timer(void)

interrupt

3

{

th1=0xff;

tl1=0x05;

//定时器250us产生一次中断

gate2=!gate2;

//产生500us方波

n++;

if(n==4)

{

n=0;

gate1=!gate1;

//产生2ms方波

}

}

ORG 0000H ;程序执行开始地址

LJMP START ;跳到标号START执行

ORG 0003H ;外中断0中断程序入口

LJMP REMO ;外中断0中断返回

ORG 000BH ;定时器T0中断程序入口

LJMP TIME0 ;跳至INTTO执行

ORG 0013H ;外中断1中断程序入口

RETI ;外中断1中断返回

ORG 001BH ;定时器T1中断程序入口

LJMP TIME1 ;跳至TIME1执行

ORG 0023H ;串行中断程序入口地址

RETI ;串行中断程序返回

;

TIME1: RETI

;

TIMEADD EQU 30H;30H做为软件计数缓存

DISP1 EQU 31H;31H做为第一位显示缓存

DISP2 EQU 32H;32H做为第二位显示缓存

DISP3 EQU 33H;33H做为第三位显示缓存

DISP4 EQU 34H;34H做为第四位显示缓存

SECLED EQU P10;秒点显示P10

HALFSEC EQU 35H;半秒计数缓存

UPKEY BIT P27;定义P27是UP键

SETKEY BIT P20;定义P20是SET键

BUZZ BIT P25;

;

;第1位使能P21

;第2位使能P22

;第3位使能P23

;第4位使能P24

;

ORG 0030H;

;

START:

MOV SP,#5FH;放堆栈

MOV P2,#0FFH;把P2置高

CLR P25;把p25置0

LCALL BUZZER;发出滴声

LCALL BUZZER;按键滴声

MOV TIMEADD,#0;软件计数器清零

MOV TMOD,#11H;TIME0工作于方式1,TIME1工作于方式1

MOV TH0,#3CH;

MOV TL0,#0B0H;放定时预置数15536

MOV IE,#8BH;开INT0,TIME0,TIME1

MOV IP,#02H;TIME0中断优先

SETB IT0;外部中断0为负跳变方式触发

SETB TR0;开始计数

MOV DISP1,#00H;

MOV DISP2,#00H;

MOV DISP3,#00H;

MOV DISP4,#00H;把所有显示缓存清零

MOV HALFSEC,#00H;把半秒计数缓存清零

MOV DPTR,#TAB;

SCAN:

MOV A,DISP1;把第一位显示缓存送入A

MOVC A,@A+DPTR;查表

SETB P24;

CLR P21;第一位显示使能

MOV P0,A;查表得到的7段码送给P0去显示

LCALL DELAY;延时

MOV P0,#0FFH;显示一小段时间后关掉7段显示,去显示下一位

MOV A,DISP2;

MOVC A,@A+DPTR;

SETB P21;

CLR P22;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

MOV A,DISP3;

MOVC A,@A+DPTR;

SETB P22;

CLR P23;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

MOV A,DISP4;

MOVC A,@A+DPTR;

SETB P23;

CLR P24;

MOV P0,A;

LCALL DELAY;

MOV P0,#0FFH;

JNB SETKEY,ADJUST;按键按下时去调整时间

;以下是进位程序

MOV A,DISP1;把第一位缓存送入A

CJNE A,#10,SCAN;如果第一位不等于10继续扫描

MOV DISP1,#00H;如果第一位等于10了就把第一位清零

INC DISP2;第二位加1

MOV A,DISP2;

CJNE A,#6,SCAN;如果第二位不等于6继续扫描

MOV DISP2,#00H;

INC DISP3;

MOV A,DISP4;

CJNE A,#2,PM;

MOV A,DISP3;

CJNE A,#4,SCAN;

MOV DISP3,#00H;

AJMP DIS4;

PM:

MOV A,DISP3;

CJNE A,#10,SCAN;

MOV DISP3,#00H;

DIS4:

INC DISP4;

MOV A,DISP4;

CJNE A,#3,SCAN;

MOV DISP4,#00H;

AJMP SCAN;

;

DELAY: ;延时子程序

MOV R7,#2

NOP

D1: MOV R6,#2

DJNZ R6,$

DJNZ R7,D1

RET

;

TAB: DB 88H,0EBH,91H,0A1H,0E2H,0A4H,84H,0E9H,80H,0A0H,0C0H,86H,9CH,83H,94H,0D4H,0FFH

;

;

;

;

;下面程序为设置时间用

ADJUST:

LCALL ADJDELAY;

JB SETKEY,SET1;

LCALL BUZZER;按键滴声

JNB SETKEY,$

CLR TR0; 暂时关闭计时

ADJ4:

SETB P21;

CLR P24;

MOV A,DISP4;

MOVC A,@A+DPTR;

MOV P0,A;显示第四位

JNB SETKEY,ADJ8;如果设置键有动作去调节第3位

JB UPKEY,ADJ4;加键是否按下

LCALL ADJDELAY;

JB UPKEY,ADJ4;延时后再检查加键是否按下

LCALL BUZZER;按键滴声

JNB UPKEY,$;等待加键松开

INC DISP4;第四位加1

MOV A,DISP4;

CJNE A,#3,ADJ4;第四位不等于3转移

MOV DISP4,#00H;第四位等于3清零

AJMP ADJ4;再去显示第四位

ADJ8:

LCALL ADJDELAY;

JB SETKEY,ADJ4;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ3:

SETB P24;

CLR P23;

MOV A,DISP3;

MOVC A,@A+DPTR;

MOV P0,A;显示第三位

JNB SETKEY,ADJ7;

JB UPKEY,ADJ3;

LCALL ADJDELAY;

JB UPKEY,ADJ3;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP3;第3位加1

MOV A,DISP4;

CJNE A,#2,PM1;

MOV A,DISP3;

CJNE A,#4,ADJ3;第3位不等于4转移

MOV DISP3,#00H;第四位等于3清零

AJMP ADJ3;再去显示第四位

PM1:

MOV A,DISP3;

CJNE A,#10,ADJ3;

MOV DISP3,#00H;

AJMP ADJ3;

SET1:

LCALL BUZZER;按键滴声

LCALL BUZZER;按键滴声

JNB SETKEY,$;

NOP;

MOV HALFSEC,#00H;清零秒针

SETB TR0;

LJMP SCAN;

ADJ7:

LCALL ADJDELAY;

JB SETKEY,ADJ3;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ2:

SETB P23;

CLR P22;

MOV A,DISP2;

MOVC A,@A+DPTR;

MOV P0,A;显示第二位

JNB SETKEY,ADJ6;

JB UPKEY,ADJ2;

LCALL ADJDELAY;

JB UPKEY,ADJ2;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP2;第2位加1

MOV A,DISP2;

CJNE A,#6,ADJ2;第2位不等于6转移

MOV DISP2,#00H;第2位等于6清零

AJMP ADJ2;再去显示第2位

ADJ6:

LCALL ADJDELAY;

JB SETKEY,ADJ2;

LCALL BUZZER;按键滴声

JNB SETKEY,$;

ADJ1:

SETB P22;

CLR P21;

MOV A,DISP1;

MOVC A,@A+DPTR;

MOV P0,A;显示第一位

JNB SETKEY,ADJ5;如果SET键有动作转去抖

JB UPKEY,ADJ1;

LCALL ADJDELAY;

JB UPKEY,ADJ1;

LCALL BUZZER;按键滴声

JNB UPKEY,$;

INC DISP1;第1位加1

MOV A,DISP1;

CJNE A,#10,ADJ1;第1位不等于10转移

MOV DISP1,#00H;第1位等于10清零

AJMP ADJ1;再去显示第1位

ADJ5:

LCALL ADJDELAY;

JB SETKEY,ADJ1;

AJMP SET1;

ADJDELAY:;是不是延时40MS

MOV R7,#200

D3: MOV R6,#100

DJNZ R6,$

DJNZ R7,D3

RET

BUZZER: MOV R6,255;蜂鸣子程序

BUZZ1: CPL BUZZ;

MOV R7,#80;

DJNZ R7,$;

DJNZ R6,BUZZ1;

CLR BUZZ;

RET

;以上为设置时间用

;

REMO:

RETI;

;

;

;

TIME0:; TIME0中断处理程序

MOV TH0,#3CH;

MOV TL0,#0B6H;重新放定时预置数15542,用预置数较正时间。

PUSH ACC;机器周期2

PUSH PSW;机器周期2

INC TIMEADD;软件计数器加1,机器周期1

MOV A,TIMEADD;加1后送给A,机器周期1

CJNE A,#10,T_RET;如果A不等于10跳到T_RET,机器周期2

CPL SECLED;取反秒点LED,软件计数器计时半秒,机器周期1

MOV TIMEADD,#00H;软件计数器清零,机器周期1

INC HALFSEC;秒加1,机器周期1

MOV A,HALFSEC;机器周期1

CJNE A,#120,T_RET;把秒针缓存和120比较,不等跳转T_RET,机器周期2

INC DISP1;第一位显示加1,机器周期1

MOV HALFSEC,#00H;清零秒针,机器周期1

T_RET:

POP PSW

POP ACC

RETI

END

代码如下:

第一个代码程序:

ORG 0000H

LJMP MAIN

ORG 001BH

JMP T1_INT

ORG 0030H

MAIN:

MOV TMOD, #20H

MOV TH1, #6

MOV TL1, #6

MOV IE, #88H

SETB TR1

MOV R7, #4

SJMP $

T1_INT:

CPL P13

DJNZ R7, T1_END

CPL P12

MOV R7, #4

T1_END:

RETI

END

第二个500us程序:

#include <reg51h>        

sbit P1_0=P1^0;

void  main()

{

TMOD=0x01; 

TH0=0xFC;

TL0=0x18; 

EA=1;   

ET0=1;     

TR0=1;  

while(1);

}

void time0_int(void)  interrupt 1    

{

TH0=0xFC;

TL0=0x18;

P1_0=!P1_0;

}

扩展资料:

程序存储器特定入口:

0000H: 复位或开机后的程序入口

0003H: 外部中断0 服务程序入口

000BH: 定时/计数器0 中断服务程序入口

0013H: 外部中断1 服务程序入口

001BH: 定时/计数器1 中断服务程序入口

0023H: 串行I/O 中断服务程序入口

定时/计数器

8031 片内有两个16位定时/计数器(增量式计数)

工作方式(方式0、方式1、方式2、方式3)

以定时/计数器1为例

⑴方式0(13位定时/计数)

方波是一种非正弦曲线的波形,通常会于电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流的波形为矩形的电流即为方波电流。不论时间轴上下是不是对称的,只要是矩形就可叫方波,必要时,可加“对称”,“不对称”加以说明

通过单片机内部的计数器/定时器,采用软件编程来产生方波,这种方法的硬件线路较简单,系统的功能一般与软件设计相关。

选择MCS-51系列中的8031单片机,由于是用指示灯显示输出方波信号,一个LED显示灯即可满足设计要求。

方波是一种非正弦曲线的波形,通常会与电子和讯号处理时出现。理想方波只有“高”和“低”这两个值。电流或电压的波形为矩形的信号即为矩形波信号,高电平在一个波形周期内占有的时间比值称为占空比,也可理解为电路释放能量的有效释放时间与总释放时间的比值。

占空比为50%的矩形波称之为方波,方波有低电平为零与为负之分。必要时,可加以说明“低电平为零”、“低电平为负”。

通过了,自己对照看看问题出在哪里。

ORG 00H

LJMP MAIN

ORG 0003H

LJMP EINT0

ORG 0013H

LJMP EINT1

ORG 1BH

LJMP TIMER1

ORG 0100H

MAIN:SETB EA;开所有中断

SETB PX0;使int0为高级中断,start(int0高于1)

SETB PX1;使int1为高级中断,pause

SETB IT0;int0负边沿触发

SETB IT1;int1负边沿触发

MOV SP,#60H;给指针设置初始地址

MOV R0,#00H;初始化R0

MOV R1,#00H

READY:MOV A,#00000011B;开始输入数值,并使用P10和P11

MOV P1,A

MOV A,P1;读键盘状态

JB ACC0,L1;若ACC0为1,跳转至L1,否则个位键按下执行下条指令

LCALL PROM0;若个位键按下,则跳转RPOM0,并返回R0

L1:JB ACC1,L2;若ACC1为1,跳转至L2,否则个位键按下执行下条指令

LCALL PROM1;若十位键按下,则跳转RPOM1,并返回R1

L2:MOV DPTR,#DTAB;数据表格起始地址送DPTR

MOV A,R0;把R0里的数给A,用于查表偏移量

MOVC A,@A+DPTR;查表后相应数值给A

MOV P0,A;送P0口显示

MOV A,R1;把R1里的数给A,用于查表偏移量

MOVC A,@A+DPTR;查表后相应数值给A

MOV P2,A;送P2口显示

LCALL READY;跳转回READY检查是否有按键再次按下

DTAB:DB 3FH,06H,5BH,4FH,66H;共阴极数码管从0~9表

DB 6DH,7DH,07H,7FH,6FH

PROM0:LCALL DY12MS;防抖动

INC R0;若个位键按下,则使R0+1

CJNE R0,#0AH,CTN;如果R0=10,则执行下一条指令,否则跳转

MOV R0,#00H;给R0重置0

CTN:RET

PROM1:LCALL DY12MS

INC R1;若个位键按下,则使R1+1

CJNE R1,#06H,CNT;如果R1=6,则执行下一条指令,否则跳转

MOV R1,#00H;给R1重置0

CNT:RET

DY12MS:MOV R7,#18H;延时12MS子程序

DYMS1:MOV R6,#0FFH

DYMS2:DJNZ R6,DYMS2

DJNZ R7,DYMS1

RET

EINT0:PUSH ACC

PUSH PSW

CLR TR1

POP PSW

POP ACC

SETB EX0

RETI

EINT1:ANL TMOD,#0FH;计数器置为方式1,定时器模式,与INT0有关

ORL TMOD,#90H

MOV TH1,#3CH;装入时间常数,005S

MOV TL1,#0AFH

MOV B,#0AH;

MOV A,R1;

MUL AB;把十位分乘十

ADD A,R0;

MOV B,#120;005s260

MOV R3,A

MOV R4,B

SETB TR1;启T1计数

LOOP:CJNE R4,#00H,LOOP;每当过1分钟后,才进入R3

CJNE R3,#00H,L3;

SETB P30;让P30口为1,输出高电压给蜂鸣器

LCALL DY2S;让蜂鸣器鸣叫2S

RETI

L3:CLR P30;输出低电平,使蜂鸣器不工作

SJMP LOOP

TIMER1:CLR TR1;关计数控制位

DEC R4;

CJNE R4,#00H,L4;R4不为零,则R3不减

DEC R3;

L4:MOV TL1,#0AFH;装入时间常数

MOV TH1,#3CH;

SETB TR1;开计数控制位

RETI

DY2S:MOV R7,#200;延时2S子程序

DY2S1:MOV R6,#20

DY2S2:MOV R5,#124

DY2S3:DJNZ R5,DY2S3

DJNZ R6,DY2S2

DJNZ R7,DY2S1

RET

END

以上就是关于使用8051片内定时器T0实现从p1.0输出周期10ms的方波。时钟频率为12MHz...求单片机程序。汇编,在线等!谢全部的内容,包括:使用8051片内定时器T0实现从p1.0输出周期10ms的方波。时钟频率为12MHz...求单片机程序。汇编,在线等!谢、简述8051单片机的定时/计数器的四种工作方式的特点。、8051单片机时钟频率为6MHZ,由T1定时,试编程从P1.0输出周期为40ms的方波。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/9822267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存