单片机定时器

单片机的定时器的工作原理是利用了寄存器的溢出来触发中断的,所以在写定时器的时候就要去算计数的增量,再根据单片机的晶振的频率就可以算出确定的时间了.
附件中有一计算器是用来计算初值的,十分方便

[img]/upload/attachment/88501/d341cde9-6fcf-33dc-9639-5df6d499f9c0.bmp[/img]

定时器主要用到了2个寄存器,一个为TCON,另一个为TMOD.TCON是用来控制定时器的启动与停止的.TMOD是用来设置定时器的模式的.她们的具体的位说明,下面有一张图片,一看便清楚了.
下面我们写一个单片机定时器的例子,产生的效果是:4个数码管每秒会增1,当增加到最大值时,重新从0开始递增.
先说说写单片机定时器的步骤:1,对TMOD赋值,以确定T0和T1的工作方式。2,计算初值,并将其写入TH0、TL0或TH1、TL1。3,中断方式时,则对IE赋值,开放中断。4,使TR0或TR1置位,启动定时/计数器定时或计数。
下面有一个定时器的完整的例子,我在STC80C52单片机上成功通过了,也能看到效果.

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit sda=P1^0;
sbit clk=P1^1;
sbit dig1=P1^2;
sbit dig2=P1^3;
sbit dig3=P1^4;
sbit dig4=P1^5;
uchar i,temp,num,times;
uchar code table[]={0x7e,0x0c,0xb6};
void write164(uchar);//申明锁存器写入函数
void main()
{
dig4=0;
dig1=0;
dig2=0;
dig3=0; //打开四个数码管

//times = 0;//发生的中断次数
num = 0;//table下标
TMOD=0x01;//设置定时器0的工作模式为工作模式1
TH0=(65536-50000)/256;//初始化计数器的高八位
TL0=(65536-50000)%256;//初始化低8位
EA = 1; //打开CPU中断
ET0 = 1;//打开0号定时器中断
TR0 = 1;//启动定时器0,开始定时
write164(table[0]);
while(1)
{
if(times==20) //发生20次中断刚好是一秒钟
{
num ++ ; //table下标右移一个
if(num==3)
num = 0;
write164(table[num]);
times=0;//此步必不可少,我刚开始就是少了这一步,导致整个程序没调试成功!!!!!
}
}
}
void write164(uchar u)
{
temp = u;
for(i=0;i<8;i++)
{
clk=1;
sda=temp & 0x80;
clk=0;
temp = temp<<1;
}
}
//中断函数
void fun_interrupt() interrupt 1
{
TH0=(65536-50000)/256;//重置计数器的高八位
TL0=(65536-50000)%256;//重置低8位
times ++ ;//产生一次中断,num值加1

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值