C51_定时器与中断

关于定时器和延时函数:

延时要占用CPU资源啊,定时器计时过程不影响CPU的运行,计时完毕通过中断通知CPU处理代码。

关于芯片内部的定时器资源:

 

 

 关于定时器工作原理:

 

 

 定时器的模式:

 

 

 关于工作原理,以及最大工作时间(2^16=0~65535):

TH0:Time high  8位

TL0:Time low   8位

 

 

 

 外接时钟这里,因为完成一个规定的时间是需要一个时钟(提供脉冲),和一个计数器的

然后现在提供脉冲的时钟变成了外部的,相当于内部只做了计数的功能,所以外接时钟,我们一般默认就是计数器。

 

 

 

 常用的定时器流程:

 

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

关于中断系统:

 

 

 

ST89C52有4个优先级和8个中断源

 

 传统8051单片机(简化版中断系统):

 2个中断优先级和5个中断源(RX&TX算一个,都属于串口中断)

 

 

 

 

 

流程:(寄存器设置)

 

 

 

 

 

不可位寻址&可位寻址

 

 P2,就是可位寻址,可以对P2中的任何一位进行单独赋值,例如:P2_1=0;

 

 

#include <REGX52.H>

void Timer0_Init()//定时器
{
//    TMOD=0x01;//0000 0001
//TMOD&=0xf0;//只把低4位 置0,而不影响高4位
//TMOD|=0x08; 只把低4位 置1,而不影响高4位
    TMOD&=0xf1;//xxxx 0001 只改变低4位,而不影响高4位
    TF0=0;
    TR0=1;
    /*为什么是64535,因为计数器的范围是0~65535us(2^16),但如果我们想要1s,按原来的65535来算就会除不尽,
    所以现在的办法是先按us记1000次数,这就是1ms了,然后再1ms记1000次数,这就是1s了
    为了让us记1000次数,所以我们需要赋一个初始值65535-1000=64534,还有为什么是/256和%256,因为TH0是高8位,
    TL0是低8位*/
    TH0=64535/256;
    TL0=(64535%256)+1;//因为实际上是65536才是溢出,65535只是满了,但并没有溢出
    //中断
    ET0=1;
    EA=1;
    PT0=0;
}

void main()
{
    Timer0_Init();/*先定时1s,然后时间过了1s之后,
    中断目前的主函数,去执行中断函数里的代码,执行完之后再执行主函数*/
    while(1)
    {
        
    }
}
//中断函数
unsigned int countT0;
void Timer0_Routine() interrupt 1
{
    TH0=64535/256;
    TL0=64535%256;
    countT0++;
    if(countT0>=1000)//1ms->1s
    {
        countT0=0;
        P2_0=~P2_0;
    }
}

 

 

 

 

中断号:

 

posted @ 2023-03-25 21:21  鬼幽电z  阅读(264)  评论(0编辑  收藏  举报