单片机指令问题,第1张

TMOD和TCON的内部定时器的控制字节

THO是内部定时器TO的高8位

TLO是内部定时器TO的低8位

意思是

TMOD赋值为1;(T0选择工作模式1:16位定时/计数模式)

TCON赋值为1;(TR0=1:TO开始计数)

THO赋值为3CH;

TLO赋值为AFH;(也就是TO赋初值为3CAFH=15535)

如果还不懂 就去百度搜索 51单片机内部定时器 的文档来看看 就明白了

自己算一下:一个指令周期=时钟周期/12

定时时长 = 200指令周期

————————————————

为什么除以256比较难讲明白,这样想把,当你把TH1和TL1合在一起看的时候它就是一个16位的整型数,取值范围就是0-0xFFFF 也就是0-65535共65536个数,也就是256256。

所以当你再把这16位看成两位每位由8个bit组成的数的时候,这个两位数就是256进制的了。

对于一个256进制的数来说:

取它的最低位就是用模256,也就是 '%256' 。

要取高一位的话就是对256取商,也就是 '/256'

要求编写延时子程序,就不要使用定时器;

也不要用C语言,因为C语言的执行时间,并不确定。

用汇编语言,是最简单、准确的。

51单片机的程序如下:

DL1000:

MOV R7,#248

DJNZ R7,$

MOV R7,#250

DJNZ R7,$

RET

正好1000个机器周期。

R7,是8位寄存器,其最大数值是255,不能直接存入500。

#define uchar unsigned char

uchar bdata BITS;//位变量声明

bit TEST = BITS^0;

//

/主函数/

//

main()

{

SCON=0X50; //设置为工作方式1

TMOD=0X21; //设置计数器T1工作于方式2,T0工作于方式1

PCON=0X80; //波特率加倍

TH1=0XF3; //计数器T1初始值设置,注意波特率是4800的

TL1=0XF3;

TH0=0x4c; //预置T0计数初值

TL0=0x00;

ET0=1; //允许定时器T0中断

TR0=1; //T0开始计数

TR1=1; //T1开始计数

// ES = 1;

EA=1; //打开总中断

TEST = 0; //清0位变量

while(1)

{

if(TEST)//如果T0计数中断次数达到21

{

TEST = 0;//清0该标志

if(P3==127)//如果p37低电平

{

second=second+1;

SBUF=second;//将接收到的数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0;

}

else{

second=second;

SBUF=second;//将接收到的数据放入到发送寄存器

while(!TI); //等待发送数据完成

TI=0;

}

}

display(); //显示时间

}

}

//===========================================

void timer0(void) interrupt 1 using 0 //定时器0方式1,50ms中断一次

{

mstcnt+---------+-------%%;

if(mstcnt == 21000000)

{

mstcnt = 0;//清0计数器

TEST = 1;//置位mst

MOV TMOD,#01H,请说出该条指令有包含哪些含义( )。

A 可看出是定时器/计数器T0工作。

B T0工作在定时状态

C T0工作在计数状态。

D (T0)工作在方式1

答案:选 B、D。

TF1是定时器1溢出标志位,$是取地址。JNB TF1,$ 实现的功能是查询定时器1溢出标志位,如果为0,跳转到本条指令继续执行(即继续查询)直到定时时间到,TF1置位,才执行下一条指令。

给你注释一下:

MOV TMOD,#10H //设置定时器工作方式(定时器1,工作方式2)

SETB TR1 //开启定时器1

LOOP: MOV TH1,#0D8H //装初值D8F0H 即55536,定时10mS(晶振12M)时间随晶振改变

MOV TL1,#0F0H

JNB TF1,$ //查询等待定时器1中断

CLR TF1 //定时器溢出标志位清0(定时时间到后硬件自动给TF1置位,需软件清0)

CPL P11 //P11取反

SJMP LOOP //跳到LOOP处循环(是个死循环)

该段程序实现的功能是:每隔10mS对P11取反一次。(10mS当然是晶振为12M的情况下)

mov tmod, #61h;将61h这个数赋给tmod寄存器,具体什么模式你把它拆成16进制数对着寄存器看吧,好吧,刚帮你查了下,是:仅由TR0,TR1置位分别启动定时器T0、T1,T0为计数功能,T1为定时功能。T1是自动重装8位计数器,T0是16位计数器。

mov dptr, #15536 ;令dptr(记得是数据指针)的值为15536

mov tl0,dpl ;让dptr的低8位的值给定时器t0的低8位

mov th0, dph ;把dptr的高8位的值给定时器t0的高8位

mov tl1, #236 ;让t1的值为236

setb tr0;开启t0

setb tr1;开启t1

loop: jnb tf0,$; 表示测试tf0的值,如果不为1(为0)则程序继续执行本条指令($表示当前位置),如果为1则顺序执行下一条指令。 这里就是说当定时器T0溢出时进入下面的指令

clr tf0 ;清零tf0并进入下面的程序

mov dptr, #15536 ;与上面的意思一样

mov tl0, dpl

mov th0, dph

clr p35 ;使35口为0

setb p35 ;使35口为1

jnb tf1 ,loop ;还是检测,这次检测tf1位的值,如果不为1则继续本指令

clr tf1;令tf1为0,即低电平

大概就记得这些了 给你个参考吧

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 单片机指令问题

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情