单片机编程高手请进,用T0的方式1定时,由P1.0引脚输出50Hz方波,晶振频率为12MHz,计算初值并编程,注释

2024-11-22 13:01:12
推荐回答(3个)
回答1:

(1)计算计数初值X
50Hz对应周期为20mS,P1.0需要10mS反相一次。
12MHz晶振对应机器周期 = 1us 
10mS需要机器周期数:10mS/1uS=10000
设需要装入T0的初值为X: X = 65536 − 10000 = 55536。
X 化为十六进制数: 55536 = D8F0H 。
T0的初值为TH0 =0D8H,TL0 = 0F0H。
(2)程序
ORG 0000H ;程序入口
BEGIN: AJMP MAIN ;转主程序
ORG 000BH ;T0中断入口
AJMP IT0P ;转T0中断处理程序IT0P

ORG 0100H ;主程序入口
MAIN: MOV TMOD,#01H ;设置T0为方式1定时
MOV TL0,#0F0H ;T0初始化,装初值的低8位
MOV TH0,#0D8H ;装初值的高8位
SETB ET0 ;允许T0中断
SETB EA ;总中断允许
SETB TR0 ;启动T0

SJMP $ ;原地循环,等待中断

IT0P: MOV TL0,#0F0H ;中断子程序,T0重装初值
MOV TH0,#0D8H
CPL P1.0 ;P1.0的状态取反
RETI
END

回答2:

定时器计数率=f/12,机器周期=12/f=1us,每个机器周期定时器计数加1,20ms=20000us
需计数次数=20000/(12/f)=20000
#include
sbit p1_0=P1^0;
void main (void)
{
TMOD=0x01;//定时器0,方式1
TR0=1;//开计数器T0
for( ; ; )
{
TH0=-(20000/256);//装载计数初值
TH0=-(20000%256);
do {} while(! TF0);//查询等待TF0复位
p1_0=!p1_0;//定时时间到p1.0反相
TF0=0;//软件清TF0
}
}

回答3:

void timer0inpt(void) ;
static unsigned int i = 0 ;
main()
{

P1^0 = 0 ;
P1^1 = 0 ;

TMOD = 0x11;
AUXR = (AUXR|0x80);
TH0 = 0xF8;
TL0 = 0x30;//这个地方,自己仔细算一下。。
TR0 = 1;
ET0 = 1;
EA = 1;

while(1);
}

void timer0inpt() interrupt 1 using 1
{
TH0 = 0xF8;
TL0 = 0x30;

P1^0 =!P1^0;
i++;

if (i==250)
{
i = 0;
P1^1 =!P1^1;
}
}

如果要汇编的,,通知一下,,
另外,虚机团上产品团购,超级便宜