首页 > 编程知识 正文

ne555定时器电路图工作原理,stc15w204s中文资料

时间:2023-05-03 09:02:33 阅读:54557 作者:2527

文章目录定时器2原理图示例模块化处理参考

计时器2原理图

计时器2的设定示例:

16位自动重装计时器; 时钟源等于内部系统时钟; 允许在计数结束后请求中断; 每次中断都会反转P1.1的输出电平一次。main.c文件:

/* * ST c15 w 204 s-35 isop 16 * timer2- 16 bit,auto-reload *//* *交互式用户定义*/SF rie=0x A8;/* interruptenableregister */SF rie2=0x af;/* interrupt enable2register */* * interruptregistersbitsdefinition *//* ie */# define global _ ie _ ea (0x80 ) ) )/* timer2counterlowregister */sfr t2h=0x D6;/* timer2counterhighregister */sfrauxr=0x8e;/* auxiliary register */* * timer2registersbitsdefinition *.* * auxr */# define T2 _ auxr _ t2r (0x 10 )/* timer dff timer2-counterortimerselection )/#defineT2_auxr_T2x12 )0x04 ) ) timer2-selection ) define T2 _ au au aut2x 12 )0x04 void main () { AUXR=~T2_AUXR_T2CT; //T2 actsasatimer//auxr|=T2 _ auxr _ t2x 12; //T2 ' sclocksourceisdividedby1t2h=(65536-10000 ) 8; //8msbt2L=(65536-10000 )0xFF; //8 LSB AUXR |=T2_AUXR_T2R; //T2 run IE2 |=T2_IE2_ET2; //enable T2 overflowinterruptrequestie|=global _ ie _ ea; //enableglobalinterruptwhile(1) {}}void timer2InterruptService ) (interrupt12 ) led=! LED; }使用http://www.Sina.com/下载程序,频率为http://www.Sina.com/:

注意:STC-ISP提示符下载失败! 但是我发现单片机还在按我设想的运行程序。 这里12.000 MHz可能有问题。

STC-ISP的时钟源进行12分频(AUXR=~T2_AUXR_T2x12;测量STC-ISP输出:

注意:在原理图中,我给单片机的电源符号是5V,但实际测试使用的是USB串行转换模块提供的3.3V。 实测没有3.3V。 这并不妨碍单片机的正常工作。

不分频T2的时钟源(AUXR |=T2_AUXR_T2x12;测量P1.1输出:

模块化处理将所有代码写在单个T2文件中是非常不好的习惯,需要对上面示例中的计时器2进行模块化处理。

将6到40行提取到P1.1头文件中; 将46到54行封装为函数,实现在main.c文件中,并在stc15w204s.h头文件中声明。 工程结构:

timer2.c头文件:

声明计时器2的特殊功能

寄存器;声明有关定时器 2 的特殊功能寄存器的位掩码;以及其他。 #ifndef __STC15W204S_H#define __STC15W204S_H/** * Interrupt Registers Definition */sfr IE = 0xA8; /* Interrupt Enable Register */sfr IE2 = 0xAF; /* Interrupt Enable 2 Register *//** * Interrupt Registers Bits Definition *//** IE */#define GLOBAL_IE_EA (0x80)/** IE2 */#define T2_IE2_ET2 (0x04) /* Timer 2 interrupt enable *//** * Timer 2 Registers Definition */sfr T2L = 0xD7; /* Timer 2 Counter Low Register */sfr T2H = 0xD6; /* Timer 2 Counter High Register */sfr AUXR = 0x8E; /* Auxiliary Register *//** * Timer 2 Registers Bits Definition *//** AUXR */#define T2_AUXR_T2R (0x10) /* Timer 2 - Run Control */#define T2_AUXR_T2CT (0x08) /* Timer 2 - Counter or Timer Selection */#define T2_AUXR_T2x12 (0x04) /* Timer 2 - Speed Control *//** * Port 1 Registers Definition */sfr P1 = 0x90; /* Port 1 Register */typedef enum { FALSE = 0, TRUE = !FALSE} boolean;#define enableInterrupts(enable) if(enable) { IE |= GLOBAL_IE_EA; } else { IE &= ~GLOBAL_IE_EA; } #endif

timer2.h 头文件:

#ifndef __STC15W204S_TIMER_2_H#define __STC15W204S_TIMER_2_H#include "stc15w204s.h"typedef enum { TIMER2_PRESCALER_DIVIDED_BY_1 = ((unsigned char)0x00), TIMER2_PRESCALER_DIVIDED_BY_12 = ((unsigned char)0x01)} Timer2Prescaler;typedef struct { void (*asTimer)(boolean); void (*setCounter)(unsigned int); void (*setTimer)(unsigned int); void (*setPrescaler)(Timer2Prescaler); void (*start)(boolean); void (*enableInterrupt)(boolean);} Timer2;extern Timer2 timer2;/** * First call to this function to initialize * the <code>timer2</code> variable. */void Timer2Constructor();#endif

timer2.c 文件:

#include "timer2.h"Timer2 timer2;/** * If true, timer 2 acts as timer, * otherwise it acts as counter. */void asTimer(boolean isTimer) { if(isTimer) { AUXR &= ~T2_AUXR_T2CT; } else { AUXR |= T2_AUXR_T2CT; }}/** * Set the initial value of the counter * or the timer. */void setCounter(unsigned int counter) { T2H = (counter) >> 8; T2L = (counter) & 0xff;}/** * Set the prescaler of the timer 2. */void setPrescaler(Timer2Prescaler prescaler) { switch(prescaler) { case TIMER2_PRESCALER_DIVIDED_BY_1: AUXR |= T2_AUXR_T2x12; break; case TIMER2_PRESCALER_DIVIDED_BY_12: AUXR &= ~T2_AUXR_T2x12; break; }}/** * If true, start the timer 2 to run, * othewise, stop. */void start(boolean start) { if(start) { AUXR |= T2_AUXR_T2R; } else { AUXR &= ~T2_AUXR_T2R; }}/** * If true, enable timer 2 overflow * interrupt request, othewise, disable. */void enableInterrupt(boolean enable) { if (enable) { IE2 |= T2_IE2_ET2; } else { IE2 &= ~T2_IE2_ET2; }}/** * First call to this function to initialize * the <code>timer2</code> variable. */void Timer2Constructor() { timer2.asTimer = &asTimer; timer2.setCounter = &setCounter; timer2.setTimer = &setCounter; timer2.setPrescaler = &setPrescaler; timer2.start = &start; timer2.enableInterrupt = &enableInterrupt;}

将定时器 2 的功能模块化处理之后,main.c 文件如下:

/** * STC15W204S-35I SOP16 * Timer 2 - 16 bit, auto-reload */#include "timer2.h"sbit LED = P1^1;void main() { Timer2Constructor(); timer2.asTimer(TRUE); timer2.setPrescaler(TIMER2_PRESCALER_DIVIDED_BY_1); timer2.setTimer(65536 - 10000); timer2.start(TRUE); timer2.enableInterrupt(TRUE); // IE |= GLOBAL_IE_EA; // Enable global interrupt enableInterrupts(TRUE); while(1) {}}void timer2InterruptService() interrupt 12 { LED = !LED;} 参考

宏晶科技 STC - STC15 系列单片机器件手册

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。