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

📄 main.c

📁 根据编码盘来检测电机转速
💻 C
字号:
#include "iom8.h"
#include "avr_macros.h"
#include "ina90.h"
#include "stdio.h"			//标准输入输出头文件
/*
#define DISABLE_INT     asm("nop");//SREG &= 0x7f
#define ENABLE_INT      asm("nop");//SREG |= 0X80
*/
#define    TXEN     3  //发送使能
#define    TXC      6  //发送结束
#define    URSEL    8  //写使能

void delay(unsigned int time);
void initialize(void);
void UartSend(void);
void UartSend_8(unsigned char data);
void uart_init(void);

unsigned char timer;
unsigned char time;
unsigned char time2;

unsigned char UART_H;
unsigned char UART_L;
/*******************************************
函数名称: main
功    能: 主函数
参    数: 无
返回值  : 无
********************************************/

main( void )
{
   initialize();  //初始化端口
   while(1)
   {
      delay(1000);	
      if((PINB&0x01) != 0x01)
      {
          SETBIT(DDRD,1);             /*发送数据,设为输出*/
          CLEARBIT(PORTD,1);
          UCSRB = 0x08;     //发送使能
          UartSend_8(UART_L);
          while((PINB&0x01) != 0x01)            //判断是否为高电平,高电平则发送第二个字节
          {
               delay(100);         
          } 
          UartSend_8(UART_H);
          CLEARBIT(DDRD,1);
          SETBIT(PORTD,1);            /*发送完毕,设为输入*/
          UCSRB = 0x00;     //发送禁止
      }
         
   }
}
/*******************************************
函数名称: UartSend_8
功    能: 异步串口发送一个字节
参    数: sendB--发送的字节数据
返回值  : 无
********************************************/

void UartSend_8(unsigned char data)
{
   while((UCSRA & 0x20) == 0x00);     //等待发送缓冲区为空
   UDR = data;		              //发送数据
}
/*******************************************
函数名称: TIMER2_COMP
功    能: T2比较中断,中断5次读一次数据.
参    数: 无
返回值  : 无
********************************************/

#pragma vector = TIMER2_COMP_vect
__interrupt  void TIMER2_COMP(void)
{
    timer++;  
    if(timer >= 50)  
    {
       timer = 0;
       TCCR1B = 0x00;     //停止计数
       UART_L = TCNT1L;   //读取计数值
       UART_H = TCNT1H;
       TCNT1 = 0;
       TCCR1B = 0x07;     //T1外部引脚,上升沿驱动
       if(time2 == 0)
       {
           SETBIT(PORTD,2);
           time2 = 1;
       }
       else
       {
           CLEARBIT(PORTD,2);
           time2 = 0;
       }
      
    }
   
}
/*******************************************
函数名称: initialize
功    能: 初始化单片机
参    数: 无
返回值  : 无
********************************************/

void initialize(void)
{
  
   DDRB   = 0x00;
   PORTB  = 0xff;
   DDRC   = 0xff;
   PORTC  = 0x00;
  // DDRD   = 0x0f;
   DDRD   = 0x00;
   PORTD  = 0xff;     //配置TX为输出(很重要)
   
   TCCR1B = 0X07;     //T1外部引脚,上升沿驱动
   TCNT2  = 0x00;    
   TCCR2  = 0x0f;    //1024分频,CTC模式
   OCR2   = 0x4e;    //初值78/0.01s
   TIMSK  = 0x80;    //开T2比较中断  
   UBRRL = 51;     //波特率9600
   UBRRH = 0;
  // UCSRB = 0x08;     //发送使能
   UCSRC = 0x86;     //8位,1停止位,
   SREG=0x80;        //开全局中断
}

/*******************************************
函数名称: Delayus
功    能: 延时指定微秒(8M晶振)
参    数: time--延时的微秒数(大约,不是很精确,MS越大越准确)
返回值  : 无
********************************************/

void delay(unsigned int time)	  
{
 unsigned int i;
 time = time*5/4;		  	 //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
 for( i=0;i<time;i++); 
}

⌨️ 快捷键说明

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