单片机指令问题
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,即低电平
大概就记得这些了 给你个参考吧
0条评论