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

📄 ytcpg01.c

📁 使用AVR的云台控制器程序,通过串口和PC机通讯实现在监控电脑上控制摄像机云台.通过SPI口进行串并转换实现单片机IO扩展.
💻 C
字号:
//update on 2004-04-22 21:45 
//chage Level check : DBNEW
// deal with rotory speed unsteable


//one charter a to send
#include <iom8515v.h>
#include <macros.h>
#include <eeprom.h>

//outport define
#define OUTau8ON PORTC|=0x01
#define OUTau8OFF PORTC&=~0x01        
#define OUTau7ON PORTC|=0x02
#define OUTau7OFF PORTC&=~0x02
#define OUTau6ON PORTC|=0x04
#define OUTau6OFF PORTC&=~0x04        
#define OUTau5ON PORTC|=0x08
#define OUTau5OFF PORTC&=~0x08
#define OUTau4ON PORTC|=0x10
#define OUTau4OFF PORTC&=~0x10        
#define OUTau3ON PORTC|=0x20
#define OUTau3OFF PORTC&=~0x20
#define OUTau2ON PORTC|=0x40
#define OUTau2OFF PORTC&=~0x40        
#define OUTau1ON PORTC|=0x80
#define OUTau1OFF PORTC&=~0x80
#define OUTau1Pulse PORTC^=0x80
    
#define CLROFF PORTB|=0x01
#define CLRON PORTB&=~0x01

#define BOARDID '1'

//全局变量
unsigned char OPDATA[12];


unsigned char TXbuf[18];
unsigned char RXbuf[18];
unsigned char tmpRx=0;
unsigned char RXCR=0;
unsigned char RXstartFlag=0;

union mdd {
           unsigned int TXCRC;
		   unsigned char txCRC[2];
          }CRCT;

void watchdog_init(void)
     {
	   WDR();
	   WDTCR=0x0F ;
	 }
	 
void Delay_1ms(void)
	{
	unsigned int i;

	for (i = 1; i<1140; i++)
		
			;
	}

void delayXms(unsigned int n)
     {
	   unsigned int i=0;
	   while(i<n)
	     {
		  Delay_1ms();
		  i++;
		 }
	 }
	 
void port_init(void)
     {
	  PORTA=0xF0;    //PA set to 1
	  DDRA=0xF0;     //PA0-PA3:ADC PA4-PA6:KL0-KL2(OUT)
	                 //PA7:LCD-E  (OUTPUT)
					 
	  PORTB=0xFF;    //PB set to 1
	  DDRB=0xFF;     //PB0-PB2:QN0-QN2    PB3:TEMPC(OUT)
	                 //PB4-PB7:KR0-KR3(IN)
					 
	  PORTC=0x00;    //PC set to 1
	  DDRC=0xFF;     //PC0-PC7:DB0-DB7
	      
	  PORTD=0x00;    //PD set to 1
	  DDRD=0x02;     
	  //OUTDEON;
	  
	SFIOR&=~(1<<PUD);  //OPEN UP LINK
	  
	  //delayXms(2000); //delay 1s
	 }
	 
void SPI_MasterInit(void)
     {
	  //SPCR=0xD1; //SPIE ,SPE ,Master enable ;1/16 Fcl
	  SPCR=0x51;  // ,SPE ,Master enable ;1/16 Fcl
	 }
void SPI_Tran(void)
 {
  unsigned char i;
 for(i=8;i>0;i--)
 {
  SPDR=OPDATA[i];
  while(!(SPSR&0x80));
 }
  //delayXms(1);
  
 }//unsigned
 
 

 void uart_init(void) 
   {
    UCSRB=0x00;
	UBRR=0x33;  //9600bps
	//UCR=0xd8;
	UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
	UCSRC=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
   }
   
   
 #pragma interrupt_handler uart0_tx_isr:12
  void uart0_tx_isr(void)
    {
	;
	  
	}

#pragma interrupt_handler uart0_rx_isr:10
  void uart0_rx_isr(void)
    {	
	
	unsigned char i;
	//SEI();
	tmpRx=UDR;
	////while(!(UCSRA & (1<<UDRE)))
	//// ;
	////UDR=tmpRx;  //TX the data of rx
	
	//OUTrunON;
	if (tmpRx=='%')
	   {
	   
	   //PORTC=0xff;
	    RXCR=0;		
		RXstartFlag=1;
	   }//if tmprx	  
	 
	 if (RXCR>16) 
	   {
	     RXCR=0;
		 //
	   }
	  
	 RXbuf[RXCR]=tmpRx;	
	 RXCR++; 
	 //SEI();
	 
	if(RXstartFlag==1 && RXCR==15 && RXbuf[0]=='%')
	  {	
	  RXstartFlag=0;
	// OUTau1Pulse;
	   if(RXbuf[1]==BOARDID && RXbuf[14]=='$')
	  //if(RXbuf[1]==BOARDID)
	     {
		 //OUTau1Pulse;
		 CRCT.TXCRC=0;
		 for(i=0;i<12;i++)
		{
		 CRCT.TXCRC=CRCT.TXCRC+RXbuf[i];
		}//for(i=0;i<12;i++)
		
		 if(CRCT.txCRC[0]==RXbuf[12] && CRCT.txCRC[1]==RXbuf[13])
		  {
		  if(RXbuf[2]=='1')
		    {
		     
			 for(i=3;i<12;i++)
			    {
				  OPDATA[i-3]=RXbuf[i];
				}//for(i=2;i<10;i++)
				
			PORTC=OPDATA[0];
			SPI_Tran();
	        }//if(RXbuf[2]=='1')
			
			//ANSWER
			TXbufINIT();
			for (i=0;i<15;i++)
			  {
			   while(!(UCSRA & (1<<UDRE)))
	            ;
	          UDR=TXbuf[i];  //TX the data of rx
			 }//for (i=0;i<15;i++)
		   
		 }//if(CRCT.txCRC[0]==RXbuf[12] && CRCT.txCRC[1]==RXbuf[13]) 
		 
		  
	   }//if(RXbuf[1]==BOARDID && RXbuf[12]=='$')
	   
	   RXbuf[0]=0;
	   RXbuf[1]=0;
	   RXbuf[14]=0;
	  } //if(RXstartFlag==1 && RXCR==13 && RXbuf[0]=='%')
	
	} //void 
 
 
void TXbufINIT(void)
     {
	 
	 unsigned char i;
	 TXbuf[0]=37;
	 TXbuf[1]=49;
	 TXbuf[2]=49;
	 TXbuf[14]=36;
	  for(i=3;i<12;i++)
		{
		 TXbuf[i]=OPDATA[i-3];
		}//for(i=2;i<10;i++)
	 CRCT.TXCRC=0;
	 for(i=0;i<12;i++)
		{
		 CRCT.TXCRC=CRCT.TXCRC+TXbuf[i];
		}//f
	TXbuf[12]=CRCT.txCRC[0];
	TXbuf[13]=CRCT.txCRC[1];
	 }
    
void main()
	{
	unsigned char ia;
	 port_init();
	 SPI_MasterInit();
	 uart_init();
	 
	 
	 
	 for(ia=0;ia<13;ia++)
	    {
		OPDATA[ia]=0;
		}
	 
	 
	 CLRON;
	 delayXms(100);
	 CLROFF;
	 PORTC=0xff;
	 delayXms(1000);
	 PORTC=0;
	  SPI_Tran();
	 delayXms(500);
	 SEI();
	 while(1)
	 {
	   ;
	   ;
	   ;
	 
	 }
	 
	 
	
	 
	 //delayXms(1000);
	 //SPI_TranByte(1);
	 
	}//MAIN

⌨️ 快捷键说明

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