定时计数器T0作定时应用技术(一)

定时计数器t0作定时应用技术(一)
1. 实验任务
用at89s51单片机的定时/计数器t0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。硬件电路如下图所示
2. 电路原理图
图4.15.1
3. 系统板上硬件连线
(1. 把“单片机系统”区域中的p0.0/ad0-p0.7/ad7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:p0.0/ad0对应着a,p0.1/ad1对应着b,……,p0.7/ad7对应着h。
(2. 把“单片机系统”区域中的p2.0/a8-p2.7/a15端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:p2.0/a8对应着a,p2.1/a9对应着b,……,p2.7/a15对应着h。
4. 程序设计内容
at89s51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。只要通过设置特殊功能寄存器tmod,即可完成。定时/计数器何时工作也是通过软件来设定tcon特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于t0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取t0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定tmod=00000001b,即tmod=01h
下面我们要给t0定时/计数器的th0,tl0装入预置初值,通过下面的公式可以计算出
th0=(216-50000) / 256
tl0=(216-50000) mod 256
当t0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测tcon特殊功能寄存器中的tf0标志位,如果tf0=1表示定时时间已到。
5. 程序框图
6. 汇编源程序(查询法)
second equ 30h
tcount equ 31h
org 00h
start: mov second,#00h
mov tcount,#00h
mov tmod,#01h
mov th0,#(65536-50000) / 256
mov tl0,#(65536-50000) mod 256
setb tr0
disp: mov a,second
mov b,#10
div ab
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,b
movc a,@a+dptr
mov p2,a
wait: jnb tf0,wait
clr tf0
mov th0,#(65536-50000) / 256
mov tl0,#(65536-50000) mod 256
inc tcount
mov a,tcount
cjne a,#20,next
mov tcount,#00h
inc second
mov a,second
cjne a,#60,nex
mov second,#00h
nex: ljmp disp
next: ljmp wait
table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
end
7. c语言源程序(查询法)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
tr0=1;
tcount=0;
second=0;
p0=dispcode[second/10];
p2=dispcode[second%10];
while(1)
{
if(tf0==1)
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
p0=dispcode[second/10];
p2=dispcode[second%10];
}
tf0=0;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
}
}
}
1. 汇编源程序(中断法)
second equ 30h
tcount equ 31h
org 00h
ljmp start
org 0bh
ljmp int0x
start: mov second,#00h
mov a,second
mov b,#10
div ab
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,b
movc a,@a+dptr
mov p2,a
mov tcount,#00h
mov tmod,#01h
mov th0,#(65536-50000) / 256
mov tl0,#(65536-50000) mod 256
setb tr0
setb et0
setb ea
sjmp $
int0x:
mov th0,#(65536-50000) / 256
mov tl0,#(65536-50000) mod 256
inc tcount
mov a,tcount
cjne a,#20,next
mov tcount,#00h
inc second
mov a,second
cjne a,#60,nex
mov second,#00h
nex: mov a,second
mov b,#10
div ab
mov dptr,#table
movc a,@a+dptr
mov p0,a
mov a,b
movc a,@a+dptr
mov p2,a
next: reti
table: db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
end
2. c语言源程序(中断法)
#include
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
unsigned char second;
unsigned char tcount;
void main(void)
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
tr0=1;
et0=1;
ea=1;
tcount=0;
second=0;
p0=dispcode[second/10];
p2=dispcode[second%10];
while(1);
}
void t0(void) interrupt 1 using 0
{
tcount++;
if(tcount==20)
{
tcount=0;
second++;
if(second==60)
{
second=0;
}
p0=dispcode[second/10];
p2=dispcode[second%10];
}
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
}

接近开关控制电机正反转的方法
室温超导到底是什么意思 超导材料还有哪些种类
3D打印产业的十大发展趋势
“妙不可言,心向往之”,中软国际拜访雄安新区
实用的4~20mA输入/0~5V输出的I/V转换电路,I-V converter
定时计数器T0作定时应用技术(一)
无线内通系统该怎么选,这几项功能是重点
为什么说能量采集是物联网的未来?
机器学习算法学习之特征工程1
什么是达芬奇技术,为数字视频带来了哪些帮助
Zeta拓扑电源原理及工作过程解析
LED行业备件石墨承载盘进口税率进口关税降低到10%
MediaTek发布天玑 7200移动平台,升级游戏与影像体验
最新的开关稳压器用途广泛
土壤速测仪的功能介绍
中国移动的物联网业务优连接服务,推动增长超150%成财报亮点
利用红外光设计单道红外心电遥测仪
负载开关有什么作用,负载开关有没有挂锁功能?
模拟光端机与数字光端机的区别
英特尔早就获得许可可向华为出售芯片