📄 tc1_2.c
字号:
/**********************************************************
**** AVR T/C1 使用范例1(T/C1普通方式中的外计数方式)***
**** 作者: liugangdi ***
**** 编译器:WINAVR20050214 ***
**** 日期:2005.11.24 ***
***********************************************************/
/*功能简单说明: PD7(OC2)引脚产生的脉冲信号加到PB1(T1)引脚上。
T/C1用于外部计数方式,每上升沿计数1次;T/C0为定时方式, 8MHZ的晶
振频率,256分频,每32us计1个数。若T/C0每次置初值6,即每计250次溢出
1次,则溢出时间的间隔为8ms。这样每溢出125次即达1s。每隔1s,求出T/C1
的增加量,即为脉冲频率。将次脉冲频率通过串口在微机上显示*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <stdio.h>
#include <stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define PD7 7
#define PB1 1
uint temp1=0,temp2;
uchar num,n=0,m=0;
uchar i_g,i_sh,i_b,i_q,i_w;
uchar send_num[6]="98765";
//串口初始化
void USART_Init(void)
{ UCSRB=(1<<TXEN); //使能发送
UBRRL=0X2F; //设置波特率为9600bit/s 注意点:因为我用的是外部7.3728MHZ所以UBRR为47,而不是51
UBRRH=0X00;
UCSRC= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); //1位停止位,8位数据位
}
//put函数命名为USART_putchar,功能是向串口发送单个字符
int USART_putchar( char c)
{ if (c=='\n')
USART_putchar('\r');
loop_until_bit_is_set(UCSRA,UDRE);
UDR=c;
return 0;
}
//含回车换行的字符串输出函数
int USART_puts(char *s)
{
while (*s)
{
USART_putchar(*s);
s++;
}
USART_putchar(0x0a);//回车换行
USART_putchar(0x0d);
return 1;
}
/*//二进制转换为十进制函数
void b16td5(uint n)
{
for ( i_w=0;n>10000; )
{n=n-10000;
i_w=i_w+1;}
for (i_q=0;n>1000; )
{n=n-1000;
i_q=i_q+1;}
for ( i_b=0;n>100; )
{n=n-100;
i_b=i_b+1;}
for (i_sh=0;n>10; )
{n=n-10;
i_sh=i_sh+1;}
i_g=n;
}*/
//T/C2产生方波的子程序1/(1/8*1000000)*255*2)=15686HZ
void t2pwm2(void)
{DDRD|=(1<<PD7); //PD7(oc2)引脚定义为输出
TCCR2=0X71; //TC2 1分频, 相位修正PWM 模式,向上计数时匹配置位0C0,向下计数匹配
//时清除OC0(反向PWM)
OCR2=0X80;
}
//T/C0初始化子程序
void init_timer0(void)
{TCCR0=0X04; //T/C0普通模式计数,计数器时钟为系统时钟的256分频
TCNT0=0X06; //T/C0置初值6
TIMSK=0X01; //T/C0允许中断
}
//T/C1初始化子程序
void init_timer1(void)
{
DDRB|=(1<<PB1); //PB1(T1)引脚定义为输入
TCCR1B=0X07; //T/C1普通模式计数,外部T1引脚,上升沿驱动
}
//T/C0溢出中断服务程序
SIGNAL(SIG_OVERFLOW0)
{ TCNT0=0X06; //重新装入定时器0的初始值
n++;
m++;
if(n==125)
{temp2=TCNT1-temp1;
temp1=temp2;
n=0;
}
}
int main(void)
{
USART_Init();
init_timer0();
init_timer1();
t2pwm2();
sei();
while(1)
{
if(m>0 && m%125==0)
{/*b16td5(temp2);
send_num[0]=i_g;
send_num[1]=i_sh;
send_num[2]=i_b;
send_num[3]=i_q;
send_num[4]=i_w;*/
utoa(temp2,send_num,10);
}
USART_puts(send_num);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -