📄 lytc-adc.c
字号:
#include<avr/io.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
struct DATA_FRAME
{
unsigned char START[2]; // FF,FF: 正常数据包,帧头. FF,FE:特殊指令.
unsigned int AD1[2]; //32路采样值,每路8位
unsigned char something[2]; //一些特殊事件
unsigned char END[2]; //0A,0D: 数据帧正常结束
};
struct DATA_FRAME data; //数据帧
unsigned char sendnum=0;
unsigned char *sendp;
unsigned char adch=0; //保存采样后的高8位AD数据。
unsigned char adcl=0; //保存采样后的8位AD数据。
//系统初始化
void SYS_INIT(void)
{
sendp = &data;
data.START[0]=0xff;
data.START[1]=0xff;
data.END[0]=0x0a;
data.END[1]=0x0d;
SREG = 0x80; //开全局中断
UDR = 0x0d;
}
//USART 串口初始化
void USART_INIT(unsigned int baud_rate)
{
UBRRH = baud_rate>>8;
UBRRL = baud_rate;
UCSRB = 0x48;
// UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
}
void ADC_INIT(void)
{
//
ADMUX = 0x44; ///ADC4
// ADCSRA = 0x88;
ADCSRA = 0xcf;
}
//*****************************主程序**************************************************
void main(void)
{
USART_INIT(47);
ADC_INIT();
SYS_INIT();
while(1)
{
if ((ADCSRA&(1<<ADSC))==0) // 如果AD完成, 启动下一次AD
{
if((sendnum<2) || (sendnum>5))
{
data.AD1[0] = adch*256+adcl;
ADCSRA |= 0x40; //启动AD转换
}
}
}
}
/* USART, Tx Complete */
SIGNAL(USART_TXC_vect)
{
unsigned char cc,a,b;
// UCSRA = UCSRA & 0xbf;
if (sendnum < sizeof(data))
{
cc = *(sendp+sendnum);
sendnum++;
if(cc==0x8d)
{
a=cc;
b=a;
}
// UDR = 0;
UDR = cc;
}
else
{
UDR = *sendp;
// UDR = 0x00;
sendnum = 1;
}
// UDR = 'B';
}
/* USART, Rx Complete */
SIGNAL(USART_RXC_vect)
{
unsigned char recive_char;
// recive_char = UDR;
// UDR = recive_char;
// data.RECIVEDATA = recive_char;
// recivedataprocess(recive_char);
// recive_char = 'z';
}
/* ADC Conversion Complete */
SIGNAL(ADC_vect)
{
adcl = ADCL;
adch = ADCH; //ADC选择8位左对齐,可只取高8位数据,精度1/256
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -