定时器知识点
由于注释不知道怎么了,复制代码有问题,所以还是截图了,代码加解释,加油
郭天祥10天学会单片机系列
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula =P2^6;
sbit wela=P2^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x5e,
0x76,0x79,0x38,0x3f,0
};
uchar temp,t0,t1,bai,shi,ge,flag,flag1;
uint shu;
void init();
void display(uchar,uchar,uchar,uchar,uchar,uchar);
void delay(uint z)
{
uint t1,y;
for (t1=z;t1>0;t1--)
for(y=110;y>0;y--);
}
void main()
{
init();
while(1)
{
if(flag!=1)
display(7,6,5,bai,shi,ge);
else
display(16,17,18,18,19,20);
}
}
void init()
{
shu=432;
temp=0xfe;
P1=temp;
TMOD=0x11;/*定时器0工作,工作方式为3仅有T0可以
定时器/计数器工作方式寄存器
TMOD特殊功能寄存器,不可以位寻址,89H复位即清零
定时器1 定时器0
GATA C/T非 M1 M0 同定时器1
GATA
原理图......即可
GATA=0;仅有TCON寄存器TRX来控制
GATA=1;有TCON TRX与外部中断INT0 INT1
C/T非模式选择位
M1M0方式选择位
M1 M0
0 0 方式0,13位定时器/计数器
0 1 1,16
1 1 2,8位初值自动重装,8位定时器/计数器
1 1 3,仅T0分成8位计数器 T1停止计数
定时器控制TCON寄存器
特殊功能寄存器,88H-8FH可位寻址
复位即清零
TF1 TR1 TF0 TR0 用于定时器和计数器,
IE1 IT1 IE0 IT0用于外部中断
TF1:溢出标志;利用定时器中断不需要操作;
用查询需要软件清零
TR1:GATE=1,INT1=1 TR1=1开启定时器1
IE1:外部中断请求标志
IT1=0;电平触发方式INT1为低电平时置1否则IE1清零
IT1=0;跳变沿沿触发方式从高到底负跳变有效
定时器初值问题
时钟周期位12MHZ要计满2^16-1个数,溢出一次需要65536微妙
约等于65.5ms,50ms,就是累加5000次就溢出,则1s即是20个
50ms,65536-50000 /256 TH0 %TH0*/
void timer0()interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T0++;
if(flag!=1)
{
if(t0==10)
{
t0=1;
temp=_crol_(temp,1);
P1=temp;
}
}
else
{
if(t0%4==0)
P1=~P1;
if(t0==60)
{
TR0=0;
p1=0XFF;
flag1=1;
}
}
}
void timer1()interrupt 3
{
TH1=(65536-50000)/256;
TL0=(65536-50000)%256;
t1++;
if(t1==2)
{
t1=0;
shu--;
bai=shu%100;
shi=shu%100/10;
ge=shu%10;
if(shu==398)
{
TR0=0;
TH0=(65536-50000);
TL0=(65536-50000);
TR0=1;
flag=1;
t0=0;
P1=0xff;
TR1=0;
}
}
}
}
网友评论