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的方波。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)