?? 1.c
字號:
//ICC-AVR application builder : 2008-5-15 14:12:28
// Target : M16
// Crystal: 8.0000Mhz
#include <iom16v.h>
#include <macros.h>
#include "lcd.h"
#define Vref 2560 //參考電壓值
#define uchar unsigned char
#define uint unsigned int
uchar miao=0;
unsigned int adc_rel;//AD轉換結果
unsigned char adc_mux;//AD通道
unsigned int voltage;
unsigned int adc_old;
unsigned int V0,V1,V2,V3;
uint adc_x;
uint adc_y;
void get_adc();
/* 微秒級延時程序 */
void delay_us(uint time)
{
do
{
time--;
}
while (time>1);
}
/*****************************************/
void delay_ms(uint time)
{
while(time!=0)
{
delay_us(1000);
time--;
}
}
//端口初始化
void port_init(void)
{
PORTA = 0x00;
DDRA = 0x00;
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x0f; //m103 output only
DDRC = 0x0f;
PORTD = 0xff;
DDRD = 0x00;
}
//定時T1初始化
void timer1_init(void)
{
TCCR1B = 0x00;//停止定時器
TIMSK |= 0x04;//中斷允許
TCNT1H = 0xFC; //重裝值高位
TCNT1L = 0x2F; //重裝值低位
TCCR1A = 0x00;
TCCR1B = 0x05;//啟動定時器
}
//定時器T1溢出中斷服務程序
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
{
TCNT1H = 0xFC; //重裝值高位
TCNT1L = 0x2F; //重裝值低位
CLI();
adc_rel=0;
adc_old=0;
if(adc_mux<3)
adc_mux++;//遞增
else
adc_mux=0;
SEI();
miao++;
if(miao==350)
//LCD_write_string(9,1,Format(miao,"00"));
{stop();
TCCR1B = 0x00;//停止定時器
}
}
void adc_init(void)
{
//adc轉換初始化
ADCSRA = 0x00; //禁止AD轉換
//ADMUX = 0xC1; //通道1 1100 0001
ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);//選擇內部AVCC為基準
SFIOR |= 0x00;
ACSR = 0x80; //禁止模擬比較器
ADCSRA |= 0xEE; //1110 1110
ADCSRA|=(1<<ADEN)|(1<<ADSC)|(1<<ADATE)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//64分頻
}
//ADC結果轉換成電壓值
void ADCtoBCD(unsigned int temp)
{
unsigned char i;
temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/0x3ff);
voltage=temp;
switch(adc_mux)
{
case 0:V0=temp;break;
case 1:V1=temp;break;
case 2:V2=temp;break;
case 3:V3=temp;break;
}
LCD_write_shu(0,0,temp);
}
#pragma interrupt_handler adc_isr:15
void adc_isr(void)
{
//轉換完成后中斷處理
adc_rel=ADC&0x3ff; //
ADMUX =(1<<REFS1)|(1<<REFS0)|(adc_mux&0x1f);
ADCSRA|=(1<<ADSC);//啟動AD轉換//啟動AD轉換
}
void init_devices(void)
{
CLI(); //禁止所有中斷
MCUCR = 0x00;
MCUCSR = 0x80;//禁止JTAG
GICR = 0x00;
port_init();
timer1_init();
adc_init();
SEI();//開全局中斷
}
void qianjin()
{
//PORTC|=0x80;
PORTC=0x8A; //1010前進
LCD_write_string(0,1,"qianjin ");
}
void houtui()
{
PORTC=0x85; //0101后退
LCD_write_string(0,1,"houtui ");
}
void zuozhuan()
{
PORTC=0x82; //0010 左傳
LCD_write_string(0,1,"zuozhuan");
}
void youzhuan()
{
PORTC=0x88; //1000右轉
LCD_write_string(0,1,"youzhuan");
}
void stop()
{
PORTC=0x80;
LCD_write_string(0,1,"stop ");
}
void get_adc()
{
if(adc_old!=adc_rel)
{
adc_old=adc_rel;
ADCtoBCD(adc_old);
}
LCD_write_shu(0,1,voltage);
}
void shaomiao()
{unsigned int i;
PORTC=0x89;
//LCD_write_string(0,1,"shaomiao ");
for(i=1000;i>0;i--)
{
get_adc();
if( adc_x!=voltage)
{
adc_x=voltage;
if(adc_y>adc_x)
adc_y=adc_x;
else
continue;
}
LCD_write_shu(7,1,adc_y);
}
}
//響聲函數:入口i:響聲長度i*10ms,n:響聲次數
void sound(uchar i,uchar n)
{
for(;n;n--)
{
uint a=i*10;
for(;a;a--)
{
PORTC&=~(1<<7) ; //開蜂鳴器
delay_us(100);
PORTC|=1<<7 ; //定義蜂鳴器關 //關蜂鳴器
delay_us(100);
}
}
}
void bizhan()
{ sound(2,2);
if((PIND&0x07)==0)
{
houtui();
delay_ms(300);
youzhuan();
delay_ms(100);
}
if((PIND&0x01)==0)
{
houtui();
delay_ms(300);
youzhuan();
delay_ms(100);
}
if ((PIND&0x02)==0)
{
houtui();
delay_ms(300);
zuozhuan();
delay_ms(100);
if((PIND&0x10)==0)qianjin();
}
if((PIND&0x04)==0)
{
houtui();
delay_ms(300);
zuozhuan();
delay_ms(100);
if((PIND&0x10)==0)qianjin();
}
if((PIND&0x10)==0)
{
youzhuan();
delay_ms(100);
}
if((PIND&0x08)==0)
{
zuozhuan();
delay_ms(100);
}
}
//主函數
void main(void)
{
unsigned int k;
adc_mux=0;
//unsigned int min_old;
init_devices();
//在這繼續添加你的代碼
LCD_init();
DDRC=0xFF;
PORTC=0xff;
DDRD=0x00;
PORTD=0xff;
delay_ms(100);
LCD_write_command(0x01); //清屏
delay_ms(10);
LCD_write_string(0,0,"Test RObot");
delay_ms(100);
LCD_write_command(0x01); //清屏
for(k=0;k<200;k++)
adc_old=0;
adc_rel=0;
adc_y=2670;
adc_x=voltage;
shaomiao();
LCD_write_command(0x01); //清屏
stop();
delay_ms(300);
while(1)
{
get_adc();
//get_min();
if((PIND&0xFF)!=0xff)
{
delay_ms(10);
if((PIND&0xFF)!=0xff)bizhan();
}
else if(voltage>(adc_y+80))
{
if((V0+200)<V3)
youzhuan();
else if ((V3+200)<V0)
zuozhuan();
else
zuozhuan();
}
else if (V2<(adc_y+80))
{
if (voltage<adc_y)
adc_y=voltage;
qianjin();
}
else if (V1<(adc_y+80))
{
if (voltage<adc_y)
adc_y=voltage;
qianjin();
}
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -