全国赛的时候,用的角度传感器程序,啥型号不记得了...看代码挺简单的 。
#include <mega16.h>
#include <stdio.h>
#include <delay.h>
#define KEY PINC.0
#define LED PORTB.0
bit Read=0;
bit Over=0;
uchar Ang_H,Ang_L;
interrupt [USART_RXC] void usart_rx_isr(void)
{
if(!Read){Ang_L=UDR;Over=1;}
else
{
Ang_H=UDR;
Ang_L=0;
Read=0;
}
}
/*---------角度传感器初始化程序----------
发送0xc0进入校正模式,把模块水平旋转
360度后按下按键KEY,再发送0xc5退出校正模
式,初始化完毕.
----------------------------------------*/
void Angle_Init(void)
{
UDR=0XC0; //进入校正模式
while(!UCSRA.6); //等待发送完毕
UCSRA.6=1;
while(Ang_L!=0x43);//等待返回命令
while(KEY)LED=0; //等待旋转结束
LED=1;
UDR=0XC5; //退出校正模式
while(!UCSRA.6); //等待发送完毕
UCSRA.6=1;
while(Ang_L!=0x45);//等待返回命令
LED=1;
}
/*--------角度传感器数据读取程序---------
发送0x91进入读数模式,模块返回当前的角
度数据,范围:0~359度.
----------------------------------------*/
uint Angle_Read(void)
{
Over=0; //清除结束标记
Ang_H=Ang_L=0; //复位上次数据
Read=1;
UDR=0X91; //读取角度
while(!UCSRA.6);//等待发送完毕
UCSRA.6=1;
while(!Over); //等待结束标记
return (uint)Ang_H*256+(uint)Ang_L;
}
void display(unsigned char number,unsigned char position)//digtial show function
{
DDRA=0Xff;//set PORTA output
ORTA=0XFF;//set PORTA output in high level
switch(position)//choice the position
{
case 1:{PORTA&=0xf8;break;}
case 2:{PORTA&=0xf9;break;}
case 3:{PORTA&=0Xfa;break;}
case 4:{PORTA&=0Xfb;break;}
case 5:{PORTA&=0Xfc;break;}
case 6:{PORTA&=0Xfd;break;}
case 7:{PORTA&=0Xfe;break;}
case 8:{PORTA&=0Xff;break;}
}
switch(number)//show number
{
case 0:{PORTA&=0x87;break;} //0
case 1:{PORTA&=0x8f;break;} //1
case 2:{PORTA&=0x97;break;} //2
case 3:{PORTA&=0x9f;break;} //3
case 4:{PORTA&=0xa7;break;} //4
case 5:{PORTA&=0xaf;break;} //5
case 6:{PORTA&=0xb7;break;} //6
case 7:{PORTA&=0xbf;break;} //7
case 8:{PORTA&=0xc7;break;} //8
case 9:{PORTA&=0xcf;break;} //9
default:{PORTA=0xff;break;} //null
}
}
void main(void)
{
uchar t=0;
uint res=0;
DDRC.0=0;
PORTC.0=1;
PORTB=0XFF;
DDRB=0XFF;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;//9600波特率
#asm("sei")
Angle_Init();//初始化角度传感器
while (1)
{
if(t==100){res=Angle_Read();t=0;} //更新数据
display(res%10,8);delay_us(1000);
display((res/10)%10,7);delay_us(1000);
display((res/100)%10,6);delay_us(1000);
display((res/1000)%10,5);delay_us(1000);
t++;
};
}
|