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

📄 demo.c

📁 智能机器人 实现臂章可达到目的的 用红外线检测 效果好
💻 C
字号:
//Write By NCX
//为方便读本程序,本人采用单文档。
// 目标板 : ATMEGA16
// 采用板上晶振: 7.3728Mhz
#include <iom16v.h>
#include <macros.h>
/*********************************
设置一些全局变量
**********************************/
#define YES 0xff
#define NO  0x00
#define uchar unsigned char
#define uint16 unsigned short int
//警告距离30cm
#define MIN_DISTANCE 30
//用来标志是否刚开始运行
uchar The_Begin_OR_NOT = YES;
/*********************************
声明中断服务子程序
**********************************/
#pragma interrupt_handler ADC_handler:15
/*********************************
端口初始化
*********************************/
void port_init(void)
{
 PORTA = 0x00;
 DDRA  = 0x00;
 PORTB = 0x00;
 DDRB  = 0x03; //输出口--前进(PORTB.0)和左转(PORTB.1)IO
 PORTC = 0x00; 
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x00;
}
/********************************
adc初始化
********************************/
void adc_init(void)
{
 ADCSR = 0x00; //首先禁止ADC
 ADMUX = 0xc0; //选择通道0,
               //转换结构左对齐,
			   //采用内部参考电压2.56v
 ACSR  = 0x80; //禁止AD比较器
 ADCSR = 0x8b; //使能ADC,等待转换,转换时间26US
               //使能ADC中断
}
/********************************
关闭看门狗
*********************************/
void WDT_off(void)
{
 _WDR();
 WDTCR |=(1<<WDTOE)|(1<<WDE);
 WDTCR = 0x00;
}
/*********************************
片上设备初始化
*********************************/
void init_devices(void)
{
 CLI(); //首先禁止所有中断
 port_init();
 WDT_off();
 adc_init();
 
 MCUCR = 0x00;//禁止CPU休眠
 GICR  = 0x00;//中断向量位于FLASH中
 TIMSK = 0x00; //禁止定时器中断源
 SEI(); //开启所有中断
}
/*********************************
主程序入口
**********************************/
void main(void)
{
 init_devices();
 
 PORTB = 0x00;//停止运行
 ADCSR|=(1<<ADSC);//启动第一次AD转换
 while(1);//等待ADC转换完成并进行中断服务处理
}
/**********************************
中断服务子程序
**********************************/
void ADC_handler(void)
{
 
 uint16 ADC_DATA;
 CLI(); //首先禁止所有中断
 ADC_DATA = ADCL;
 ADC_DATA += (ADCH&0x03)<<8; 
 if(ADC_DATA>400)
   {
    PORTB =0x03; 
   }
 else
   {
    PORTB =0x01;
   }  
 /* 
 if(The_Begin_OR_NOT == YES)
 {
   //(2.56v/1024)*ADC_DATA
   //30CM-1v-400
   if(ADC_DATA>400)
   {
    PORTB &=0x02; 
   }
   The_Begin_OR_NOT == NOT;
 }
 else
 {
   
 }
 */
 ADCSR|=(1<<ADSC);//再次启动AD转换
 SEI(); //开启所有中断
}

⌨️ 快捷键说明

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