控制/MCU
在日常生活中,我们经常使用灯光来传递某种信息,如交通指示灯、报警灯等。这些灯光的变化是由控制电路中单片机来控制的。
下面我以利用STC单片机来的定时器来控制LED灯有规律的闪动来向大家介绍其中的控制原理。
一、STC15W408AS控制LED灯电路
二、定时器工作原理
定时器是一种计时的装置。是于1876年由英国外科医生索加申请的一项专利,定时器的出现给我们的生活带来了巨大的改变。起初,我们使用沙漏来对时间进行确定;在定时器出现的初始阶段,它利用机械钟带动 开关 来达到控制煤气阀 门 的目的,但需每周对其上一次发条;1918年后,使用电钟进行计时,使得定时器无需再上发条;
在单片机中,我们利用单片机中的计数器对单片机的脉冲进行计数来定时。也就是当计数脉冲个数达到一定的数时,就发生一次中断,然后又重新开始计数,再次达到这个数时,又进行一次中断。如此不断重复这个过程,直到关闭定时器为止。
三、STC15W408AS单片机定时器计数器简介
STC15W408AS只有定时器0和定时器2,工作工作位定时器或者计数器模式。定时器/计数器的核心部件是一个加法计数器,其本质是对脉冲进行计数。只是计数脉冲来源不同:如果计数脉冲来自系统时钟,则为定时方式,此时定时器/计数器每12个时钟或者每1个时钟得到一个计数脉冲,计数值加1。以定时器0为例,当定时器/计数器T0工作在定时模式时,特殊功能寄存器AUXR中的T0x12决定是系统时钟/12还是系统时钟/1后让T0进行计数。
定时器/计数器0有4种工作模式:模式0(16位自动重装载模式),模式1(16位不可重装载模式),模式2(8位自动重装模式),模式3(不可屏蔽中断的16位自动重装载模式)。
STC15W408AS单片机定时器计数器0相关寄存器
四、定时器/计数器0控制寄存器TCON
TCON为定时器/计数器T0的控制寄存器,同时也锁存T0、溢出中断源和外部请求中断源等,TCON格式如下:
TF0:T0溢出中断标志。T0被允许计数以后,从初值开始加1计数,当产生溢出时,由硬件置“1”TF0,向CPU请求中断,一直保持CPU响应该中断时,才由硬件清0。
TR0:定时器T0的运行控制位。该位由软件置位和清零。当GATE(TMOD.3)=0,TR0=1时 就允许T0开始计数,TR0=0时禁止T0计数。当GATE(TMOD.3)=1,TR0=1且INT0输入高电平时,才允许T0计数,TR0=0时禁止T0计数。
五、定时器/计数器工作模式寄存器TMOD
定时和计数功能由特殊功能寄存器TMOD的控制位C/T进行选择,TMOD寄存器的各位信息如下表所列。
六、辅助寄存器AUXR
STC15系列单片机 1T 的8051单片机,为兼容传统8051,定时器0 , 复位后是传统8051的速度,即12分频,这是为了兼容传统8051。
七、定时器T0的中断控制寄存器IE
八、定时器T0的中断控制寄存器IP
九、定时器0控制下的LED闪亮程序
#define FOSC 11059200L
#define T1MS (65536-FOSC/1000) // 1 T模式
#define BIT0 0x01
#define BIT1 0x02
#define BIT2 0x04
#define BIT3 0x08
#define BIT4 0x10
#define BIT5 0x20
#define BIT6 0x40
#define BIT7 0x80
#define TRUE 1
#define FALSE 0
#define Pin_LED P32
#define Pin_LED_M1 P3M1
#define Pin_LED_M0 P3M0
#define Pin_LED_BIT BIT2
#define PinLed_High() Pin_LED=1
#define PinLed_Low() Pin_LED=0
#define BOOL unsigned char
#define UINT unsigned int
UINT mTimer500ms=0;
void PinLED_DirOut(void);
void Timer0_Init(void);
BOOL bLedon=FALSE;
void main(void)
{
PinLED_DirOut();
PinLed_High();
Timer0_Init();
while(TRUE)
{
}
}
void PinLED_DirOut(void)
{
Pin_LED_M1 &=~Pin_LED_BIT;
Pin_LED_M0 |=Pin_LED_BIT;
}
void Timer0_Init(void)
{
AUXR |= 0x80; //定时器0为1T模式
TMOD = 0x00; //设置定时器为模式0(16位自动重装载)
TL0 = T1MS; //初始化计时值
TH0 = T1MS > > 8;
TR0 = 1; //定时器0开始计时
ET0 = 1; //使能定时器0中断
EA = 1;
}
// 定时中断函数:定时1ms
void Timer0_ISR (void) interrupt 1
{
mTimer500ms++;
if(mTimer500ms >=500)
{
mTimer500ms=0;
if(bLedon)
{
bLedon=FALSE;
PinLed_High();
}else{
bLedon=TRUE;
PinLed_Low();
}
}
}
全部0条评论
快来发表一下你的评论吧 !