⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fosc100hz.c

📁 初学者一个小例子
💻 C
字号:
/* 
    Title:    AVR-GCC fosc100Hz program for the test 100Hz output
    Author:   yfzhang
    Date:     3/2004
    Purpose:  
    needed
    Software: AVR-GCC to compile
    needed
    Hardware: ATmega8 on  test board cpu oscclk=3.6864MHz
    		LED connect to PD6 
    		and 100Hz output connect to PB2 (OCR1B)
    Note:     To contact me, mail to
                  yfzhang@ele.pku.edu.cn
*/

#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/eeprom.h>
#include <avr/pgmspace.h>
#include <avr/wdt.h>
#include <avr/iom8.h>
#include <avr/sleep.h>

typedef unsigned char  u08;
typedef          char  s08;
typedef unsigned short u16;
typedef          short s16;
typedef unsigned long u32;
typedef          long s32;

static volatile u08	T_125ms_num;                            /* Number of 125ms timer0         */
static volatile u08	T_12_5ms_num;                            /* Number of 12.5ms timer0         */
static volatile u08	T_Second_num;                            /* Number of 1s timer0         */

static volatile u08	Two_Second;
static volatile u08	One_Second;

void led_on(void);
void led_off(void);

SIGNAL(SIG_OVERFLOW0)     /* signal handler for Time0 interrupt */
{
	T_12_5ms_num++;		//12.5ms 执行一次
	if(T_12_5ms_num==10){
		T_12_5ms_num=0;	//125ms 执行一次
		
		
		T_125ms_num++;
		if(T_125ms_num>15){	//per 2 second exec one time
			T_125ms_num=0;
			Two_Second=1;
		}
		else if((T_125ms_num==1)||(T_125ms_num==3)) led_on();
		else if((T_125ms_num==2)||(T_125ms_num==4)) led_off();
		else if((T_125ms_num==5)||(T_125ms_num==13)){	//per 1 second exec one time
			T_Second_num++;
			One_Second=1;
			}
		else
			;
		}
	TCNT0 = 0xd3;     /* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d  (0x2d=45)       */
}

void AvrInit (void)
{
	PORTD = 0x7f ;     	/* bit 6..0 input  pull-up */
	DDRD = _BV(DDB6);	/* PortD bit 6 is LED output  =0 for LED on  =1 for LED off*/
	DDRB = _BV(DDB2);	/*PortB bit 2  OCR1B output*/
	TCCR0 = _BV(CS02)| _BV(CS00);      	/* Set TIMER0 prescaler to CLK/1024=3.6kHz   CPU CLK= 3.6864 MHz         */
	TCNT0 = 0xd3;      			/* Set TIMER0 3.6kHz/45=80Hz (12.5ms) 0xd3=0x100-0x2d  (0x2d=45)       */

	TCCR1B = _BV(CS12)|_BV(WGM12);      /* Set TIMER1 prescaler to CLK/256  and mode =CTC           */
	TCCR1A = _BV(COM1B0);      /* Set OCR1B fosc100Hz out              */
	OCR1AH = 0;
	OCR1AL = 71;		//fosc=(fcpu/256)/(2*(1+OCR1A))    3686400/256/(2*(1+71))=100  100Hz

	T_125ms_num=0;
	T_12_5ms_num=0;
	timer_enable_int(_BV(TOIE0));   /* Enable  TIMER0 overflow interrupt  for LED */
	
}
void led_on(void)
{
	PORTD &= ~_BV(DDB6);
	
}
void led_off(void)
{
	PORTD |= _BV(DDB6);
	
}
int main(void)
{
	cli();                 /* disable interrupts */
	AvrInit();             /* Initialize the AVR UART and Timer  */
	sei();
  	for (;;) {
   	}	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -