设MCS-51单片机使用的晶振是12MHz,欲使用定时器/计数器0实现30ms定时中断,在P1.0在产生周期为60ms的方波
不管使用什么工作方式都是可以完成的,这个取决于你设置的定时/计数器的初值。下面使用方式一和方式二来分别说明。
一、使用方式一:
晶振频率为12MHz,机器周期为1us,50ms时间需要计数50000次,故计数器初值为(65536-50000),65536是因为方式一中,定时/计数器的最大值为65536(2^16),当然写程序时不一定非要这么计算,因为定时/计数器是溢出产生中断,也就是从最大加1就溢出,最大加1就是等于0的,只要计数个数加上初值等于0就溢出了,也就产生中断了。由于题目上给的是TH1、TL1,所以,设置的时候必须设置定时/计数器T1。故TMOD = 0x10,TCON中只需要设置TR1为1,故TCON = 0x40,IE需要设置ET0和EA为1,故IE = 0x88。
C语言程序:
#include
void main (void)
{
TMOD = 0x10;
TH1 = (-50000>>8);
TL1 = -50000;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
TH1 = (-50000>>8);
TL1 = -50000;
}
汇编程序如下:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #10H
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
MOV TH1, #HIGH(-50000)
MOV TL1, #LOW(-50000)
POP ACC
RETI
二、使用方式二:
由于方式二最大计数值只能是256,显然装不下50000,故可以选一个比较小的计数值,做多次循环就可以做到。选用计数个数为200,那么循环250次就可以了。
C语言程序:
#include
void main (void)
{
TMOD = 0x20;
TH1 = -200;
TL1 = -200;
TCON = 0x40;
IE = 0x88;
while(1);
}
void T1_int (void) interrupt 3
{
static unsigned char i = 0;
if (++i >= 250)
i = 0; //如果等于250次,说明50ms时间到了
}
汇编语言:
ORG 0000H
AJMP MAIN
ORG 001BH
AJMP T1INT
ORG 0100H
MAIN:
MOV TMOD, #20H
MOV TH1, #-200
MOV TL1, #-200
MOV R1, #250
MOV TCON, #40H
MOV IE, #88H
AJMP $
T1INT:
PUSH ACC
DJNZ R1, OUT
MOV R1, #250
OUT: POP ACC
RETI
需定时,C//T=0
30ms/1μs=30000
因为30000>8192,需选择方式1,M1M0=01
TMOD=0000 0001B
计数初值为:
65536-30000=35536=8AD0H
所以
TH0=6AH,TL0=0D0H
因为开放总中断和T0中断,IE=10000010B
TCON=0001 0000B;启动T0,TR0就是TCON中的控制位,也可用位操作指令直接将TR0置1
程序见“做而论道”给的程序。
ORG 0000H
JMP MAIN
ORG 000BH
JMP T0_SR
COUNTER EQU 30H
MAIN:
CALL INIT
JMP $
INIT:
MOV TMOD, #01H
MOV TH0, #HIGH(-1000)
MOV TL0, #LOW(-1000)
SETB TR0
SETB ET0
SETB EA
RET
T0_SR:
MOV TH0, #HIGH(-1000)
MOV TL0, #LOW(-1000)
INC COUNTER
MOV R1, 30H
CJNE R1, #30, LOW_END
MOV R3, #0
CPL P1.0
RETI
LOW_END:
RETI
END
:
ORG 0000H
SJMP START
ORG 000BH ;T0中断入口.
SJMP T0_INT
START:
MOV TMOD, #01H ;设置T0定时方式1
MOV TH0, #(65536-60000/2) / 256 ;送入初始值.
MOV TL0, #(65536-60000/2) MOD 256 ;定时30000us@12MHz
;TH0和TL0的值,可由编译软件来算.
MOV IE, #10000010B ;开放总中断和T0中断.
SETB TR0 ;启动T0,TR0就是TCON中的控制位.
SJMP $ ;等着吧.
T0_INT:
MOV TH0, #(65536-60000/2) / 256 ;重新送入初始值.
MOV TL0, #(65536-60000/2) MOD 256 ;定时30000us@12MHz
CPL P1.0 ;输出方波.
RETI ;中断返回.
END ;完.
需要汇编程序的 还是C的?
答:include <reg51.h>void InitTimer1(void){ TMOD = 0x10;//定时器1 方式1 TH1 = 0x3C;//12Mhz晶振,定时50ms TL1 = 0x0B0; EA = 1; ET1 = 1; TR1 = 1;}void main(void){ P1=0xff; InitTimer1(); while(1);}void Timer1Interrupt(void) interrup...
答:设MCS-51单片机晶振频率为12MHz,定时器作定时使用时,其最高的定时时间应为:65.536毫秒。
答:我举个例子吧,假如是12Mhz的晶振,那么执行速度是12分之1的晶振频率,也就是1Mhz的执行速度。而mcs 51单片机(一般指课本上那些过时的货色,像宏晶就不同,好像震荡周期最高33Mhz)最高的晶振频率就是24Mhz,这个是有数据可查的,你可以查看at89s51的数据手册,高于这个频率可能工作就不稳定或者不能...
答:17、8051单片机,程序存储器数和数据存储器扩展的最大范围都是一样的。( 错 )18、单片机系统扩展时使用的锁存器,是用于锁存高8位地址( 错 ) 。19、 RC A为循环左移指令( 错带进位标志的 ) 。20、若MCS-51单片机使用的晶振是12MHz,则其机器周期为1µs。 ( ...
答:20KHz,周期T=50us,半周期 t=25us;标准51单片机,12MHz晶振,机械周期为 1us,足以满足25us需求。使用定时器定时 25us,每次中断取反输出(P1.0)。小贴士:25us时间短,可以采用定时器的 8位自重装模式,程序就不需要在中断中继续赋初值了。
答:ORG 0000H LJMP MAIN ORG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-250)MOV TL0,#LOW(65536-250)SETB TR0 SETB ET0 SETB EA MOV R2,#0 SJMP T0ISR:CLR TR0 MOV TH0,#HIGH(65536-250)MOV TL0,#LOW(65536-250)SETB TR0 CPL P1.1 INC R2 CJNE R2...
答:;ORG 0000H SJMP START ORG 0001BH MOV TH1, #(65536 - 50000) / 256 MOV TL1, #LOW(65536 - 50000)CPL P1.0 RETI START:MOV TMOD, #10H MOV TH1, #(65536 - 50000) / 256 MOV TL1, #LOW(65536 - 50000)SETB TR1 MOV IE, #88H SJMP END ...
答:一次记数,需要2个机器周期,即24个时钟周期或震荡周期,则最高记数频率为12M/24=500khz。
答:T=1/f=50US void Timer0Init(void)//100微秒@12MHz { AUXR &= 0x7F;//定时器时钟12T模式 TMOD &= 0xF0;//设置定时器模式 TL0 = 0x9C;//设置定时初值 TH0 = 0xFF;//设置定时初值 TF0 = 0;//清除TF0标志 TR0 = 1;//定时器0开始计时 } 之后在中断里写入P01=~P01; 就好了 ...
答:在一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。在访问片外存储器时,下降沿用于控制外接的地址锁存器锁存从P0口输出的低8位地址。在没有接外部存储器时,可以将该引脚的输出作为时钟信号使用。MCS-51单片机的引脚 Pin20:接地脚。Pin40:正电源脚,工作时,接...