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

📄 as5030__.c

📁 as3050 interfacing with atmega8
💻 C
字号:
/*****************************************************
Project : AS%)#)
Version :
Date    : 11/12/2008
Author  : SIVA JOGI NAIDU
Company : RUPANAGUDI
Comments:
Chip type           : ATmega8
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/
#include <mega8.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include <delay.h>
//______________________________________________________________________
//______________________________________________________________________
#define  E               PORTB.6
#define  RW              PORTB.7
#define  RS              PORTB.0
#define  BlinkLed        PORTC.4
#define  Led             PORTC.3
#define  CS              PORTC.2
#define  DIO             PORTC.3
#define  CLK             PORTC.5
#define  DIO_PIN         PINC.3
//------------------------------------------------------
//--------------------------------------
void LINE1();
void LINE2();
void LINE3();
void LINE4();
void lcd_puts(char *s);
void lcd_putsf(char flash *s);
void LCDWrite(char , char );
void LCD_CLEAR();
void dispfun(unsigned char Display);
unsigned char buffer[20];
unsigned char ANGLE = 0,C2,LOCK=0,AGC=0,SECONDS;
unsigned int RPS=0,RPM;
bit SEC,MIN,HIGH;
//______________________________________________________________________
void SEND_COMMAND()
{DDRC.2 = 1;
 DDRC.3 = 1;
 DDRC.5 = 1;
 //----------------------
 DIO = 0;
 CLK = 1;
 delay_us(1);
 CS = 1;
 delay_us(1);
 CLK = 0;      //-------------------------1
 delay_us(1);
 CLK = 1;
 delay_us(1);
 CLK = 0;      //-------------------------2
 delay_us(1);
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------3
 delay_us(1);
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------4
 delay_us(1);
 DDRC.3 = 0;
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------5
 delay_us(1);
 CLK = 1;
 delay_us(1);
 C2 = 0;
 if(DIO_PIN)
 C2 = 1;                //6
 delay_us(1);
 CLK = 0;       //------------------------6
 delay_us(1);
 CLK = 1;
 delay_us(1);
 LOCK = 0;
 if(DIO_PIN)
 LOCK = 1;             //7
 delay_us(1);
 CLK = 0;       //------------------------7
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x20;       //5
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------8
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x2;       //4
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------9
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x08;       //3
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------2
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x04;       //2
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------11
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x02;       //1
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------12
 delay_us(1);
 if(DIO_PIN)
 AGC = AGC|0x01;       //0
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------13
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x80;  //7
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------14
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x40;  //6
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------15
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x20;  //5
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------16
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x2;  //4
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------17
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x08;  //3
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------18
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x04;  //2
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------19
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x02; //1
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------20
 delay_us(1);
 if(DIO_PIN)
 ANGLE = ANGLE|0x01; //0
 CLK = 1;
 delay_us(1);
 CLK = 0;       //------------------------21
 delay_us(1);


//  CLK = 0;
//  command = 0;
//  for(count = 0;count<5;count++)
//     {DIO = 0;
//      CLK = 0;
//      delay_us(2);
//      CLK = 1;
//      delay_us(2);
//      }
//    DDRD.0 = 0;
//    DIO = 1;
//    CLK = 0;
//    delay_us(10);
//    C2 = DIO;
//    CLK = 1;
//    delay_us(10);
//    CLK = 0;
//    delay_us(10);
//    LOCK = DIO;
//    CLK = 1;
//    delay_us(10);
//    AGC = 0;
//    for(count = 0;count<5;count++)
//     {CLK = 0;
//      delay_us(10);
//      if(DIO)
//        {AGC = AGC || 0X01;
//         }
//      CLK = 1;
//      delay_us(10);
//         AGC = AGC<<1;
//      }
//    ANGLE = 0;
//    for(count = 0;count<8;count++)
//     {CLK = 0;
//      delay_us(10);
//      if(DIO)
//        {ANGLE = ANGLE || 0X01;
//         }
//      CLK = 1;
//      delay_us(10);
//      ANGLE = ANGLE<<1;
//      }
//     CLK = 1;
     delay_us(2);
     CS = 0;
 }
//______________________________________________________________________
void LCDWrite(char LCDData, char RSValue)
{PORTD = LCDData  & 0xF0;
 RS = RSValue;
 RW = 0;
 E = 1;  E = 0;
 PORTD = (LCDData<<4) & 0xF0;
 RS = RSValue;
 E = 1;  E = 0;
 CS = 1;
 delay_ms(2);
 }
//----------------------------------
void lcd_putsf(char flash *s)
{  while(*s)
   LCDWrite(*s++,1);
}
//----------------------------------
void lcd_puts(unsigned char *s)
{  while(*s)
   LCDWrite(*s++,1);
}
//----------------------------------
void LINE1()
{LCDWrite(0X80, 0);        //0x80
}
//----------------------------------
void LINE2()
{LCDWrite(0XC0, 0);       //0xC0
}
//----------------------------------
void LINE3()
{LCDWrite(0X94, 0);      //0x14
}
//----------------------------------
void LINE4()
{LCDWrite(0XD4, 0);      //0X54
}
//----------------------------------
void LCD_CLEAR()
{LCDWrite(0X01, 0);
}
//----------------------------------
void LCD_HOME(void)
{LCDWrite(0X10, 0);
}
//----------------------------------
void LCD_CUR_BLINK(void)
{LCDWrite(0X0D, 0);
}
//----------------------------------
void LCD_CUR_OFF(void)
{LCDWrite(0X0C, 0);
}
//----------------------------------
void LCD_CUR_ON(void)
{LCDWrite(0X0E, 0);
}
//----------------------------------
void LCDGotoXY(unsigned char x, unsigned char y)	//Cursor to X Y position
{register unsigned char DDRAMAddr;
 switch(y)
 {case 0: DDRAMAddr = 0x00+x; break;
  case 1: DDRAMAddr = 0x40+x; break;
  case 2: DDRAMAddr = 0x14+x; break;
  case 3: DDRAMAddr = 0x54+x; break;
  default: DDRAMAddr = 0x00+x;
 }
LCDWrite((1<<7| DDRAMAddr),0);
}

//----------------------------------
void lcd_init()
{  RW = 0;
   PORTD = 0;
   delay_ms(40);
   PORTD = 0X30;
   E = 1;  E = 0;
   delay_ms(5);
   E = 1;  E = 0;
   delay_ms(1);
   E = 1;  E = 0;
   delay_ms(1);
   PORTD = 0X20;
   E = 1;  E = 0;
   delay_ms(1);
   LCDWrite(0X28, 0);
   LCDWrite(0X08, 0);
   LCDWrite(0X0C, 0);
   LCDWrite(0X06, 0);
   LCDWrite(0X0F, 0);
   LCDWrite(0X80, 0);
}
//--------------------------------------------------------
//______________________________________________________________________

//______________________________________________________________________

//-------------------------------------------
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
 {TCNT1H=0x0B;
  TCNT1L=0x00;
  }
//_______________________________________________________________________

//_____________________________________________________________________________________
void dispfun(unsigned char DispCount)
{
  switch(DispCount)
       {case 0:{LCD_CLEAR();
                LINE1();
                lcd_putsf("GPS REAL TIME CLOCK");
                LINE2();
                lcd_putsf("********************");
                LINE3();
                lcd_putsf("RUPANAGUDI POWER SYS");
                LINE4();
                lcd_putsf("     HYDERABAD      ");
                }
                break;
        case 1:{LCD_CLEAR();
                LINE1();
                }
                break;
        case 2:{LCD_CLEAR();
                LINE1();
                }
                break;
       case 3:{ LCD_CLEAR();
                LINE1();
                }

    }

 }
//-------------------------------------------------------------
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Transmitter buffer
#define TX_BUFFER_SIZE 32
char tx_buffer[TX_BUFFER_SIZE];

#if TX_BUFFER_SIZE<256
unsigned char tx_wr_index,tx_rd_index,tx_counter;
#else
unsigned int tx_wr_index,tx_rd_index,tx_counter;
#endif

// USART Transmitter interrupt service routine
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
   {
   --tx_counter;
   UDR=tx_buffer[tx_rd_index];
   if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
   };
}

#ifndef _DEBUG_TERMINAL_IO_
// Write a character to the USART Transmitter buffer
#define _ALTERNATE_PUTCHAR_
#pragma used+
void putchar(char c)
{
while (tx_counter == TX_BUFFER_SIZE);
#asm("cli")
if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
   {
   tx_buffer[tx_wr_index]=c;
   if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
   ++tx_counter;
   }
else
   UDR=c;
#asm("sei")
}
#pragma used-
#endif

//_____________________________________________________________
void main(void)
{unsigned char x=0;
 unsigned int count = 0;
PORTB=0x00;
DDRB=0xC1;
PORTC=0x00;
DDRC=0x00;
PORTD=0x00;
DDRD=0xF0;
TCCR0=0x00;
TCNT0=0x00;
TCCR1A=0x00;
TCCR1B=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
MCUCR=0x00;
TIMSK=0x04;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 56000
UCSRA=0x00;
UCSRB=0x48;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x08;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

lcd_init();
dispfun(0);
delay_ms(1000);
LCD_CUR_OFF();
DDRC.2 = 1;
DDRC.3 = 0;
DDRC.5 = 1;
CLK = 0;
DIO = 0;
CS  = 0;
//#asm("sei")
LCD_CLEAR();
LINE1();
lcd_putsf("C2=");
LINE2();
lcd_putsf("LOCK=");
LINE3();
lcd_putsf("RPM=");
LINE4();
lcd_putsf("ANGLE=");
while (1)
{AGC = 0;
 ANGLE = 0;
 SEND_COMMAND();
 if(HIGH)
   {if(ANGLE<200)
      {HIGH = 0;
       }
    }else{if(ANGLE>200)
            {HIGH = 1;
             RPM++;
             }
          }

if(++count == 135)
   {count = 0;
    MIN = 1;
//     LCDGotoXY(4,2);
//     sprintf(buffer,"%d",RPM*60);
//     lcd_puts(buffer);
//     printf("              RPM = %d\n",RPM*60);
    RPM = 0;
    }
//   LCDGotoXY(3,0);
//     if(C2)
//      {LCDWrite('1', 1);
//       }else{LCDWrite('0', 1);
//              }
//     LCDGotoXY(5,1);
//     if(LOCK)
//      {LCDWrite('1', 1);
//       }else{LCDWrite('0', 1);
//            }
//   LCDGotoXY(6,3);
//   sprintf(buffer,"%d",ANGLE);
//   lcd_puts(buffer);
     printf("%d,%d\n",RPM,ANGLE);
 };  //while
}
 /////////////////////////////////////////////////////////////////










⌨️ 快捷键说明

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