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

📄 tc1_2.c

📁 arm的功能测试模块
💻 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 + -