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

📄 ad_converter2.c

📁 基于Atmega128进行ad转换的源程序
💻 C
字号:
/*============================================================
File Name :AD Converter2.c
说明 :
1. 学习10位 分辨率的ADC 
2. 将MIC & ADC选择开关调至ADC
3. 调节可变电阻,LCD显示相应的ADC值(0~9)
4. 将MIC & ADC选择开关调至MIC
5. 向MIC放声音的话,LCD显示相对应的值
=============================================================*/

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>

#define TLCD_CTRL (unsigned char *)0x7000
#define TLCD_DATA (unsigned char *)0x7001
#define ADC_VREF_TYPE 0x40
#define SET_AD6      ADMUX=6|ADC_VREF_TYPE
#define START_ADC    0xEF

volatile unsigned int adc_result=0;
unsigned char *lcd_data,*lcd_control;

void initialize_adc(void);
void delay(int d1,int d2);
void initialize_text_lcd(void);
void lcd_control_wait(void);
void lcd_data_wait(void);
void adc_display(unsigned int data);

SIGNAL(SIG_ADC)
{

     adc_result=ADCL;            			          // 保存低8位
	 adc_result|=ADCH<<8;     			              // 保存高2位
	 }
	 
int main(void)
{
     MCUCR|=(1<<SRE);                               // SRE=1 可访问外部存储器
	 initialize_adc();
	 initialize_text_lcd();
	 sei();                                         // 使能全局中断
	 while(1)
	     adc_display(adc_result);
	 }
	 
void initialize_adc(void)
{
     ADMUX=SET_AD6;                                  // ADC ch # 6
	 ADCSR=START_ADC;     					         // ADLAR = 0 将变换结果向右侧调整
	 SFIOR=0x00;
	 }

void delay(int d1,int d2)
{
     int i,j;
     
     for(i=0;i<d1;i++){
         for(j=0;i<d2;j++);
         }
     }	

void initialize_text_lcd(void)
{
     lcd_control=TLCD_CTRL;						 // 分配LCD-CTRL物理地址
	 lcd_data=TLCD_DATA;    		             // 分配LCD-DATA物理地址
	 
	 lcd_control_wait();                        // 延时
	 *lcd_control=0x38;                        // 8位接口和输出模式
	 lcd_control_wait();  
	 
	 *lcd_control=0x02;                        // 将光标移至1行1列
	 lcd_control_wait();

	 *lcd_control=0x01;                       // 清除画面
	 lcd_control_wait();

	 *lcd_control=0x06;                       // 增大光标的地址
	 lcd_control_wait();

	 *lcd_control=0x0c;                      // 显示 On     光标   off
	 lcd_control_wait();
     } 
	 
void lcd_control_wait(void)
{
     delay(1000,100);
	 }
	 
void lcd_data_wait(void)
{
     delay(1000,10);
     }	

void adc_display(unsigned int data)
{
     unsigned char tmp1=0,tmp2=0,tmp3=0,tmp4=0;
	 unsigned int remd;
	 
	 lcd_control=TLCD_CTRL;                       // 分配LCD-CTRL物理地址
	 lcd_data=TLCD_DATA;                          // 分配LCD-DART物理地址
	 
	 *lcd_control=0xC7;                          // 选择LCD的地址 0x80+ADD(实际地址=0x47)
	 lcd_control_wait();
	 
	 tmp4=data/1000;
	 remd=data%1000;
	 tmp3=remd/100;
	 remd=remd%100;
	 tmp2=remd/10;
	 tmp1=remd%10;
	 if(!tmp4)
	     *lcd_data=' ';                            // 显示千位-没有显示
	 else 
	     *lcd_data='0'+tmp4;                       // 显示千位
	 lcd_data_wait();
	 if(!tmp3&&!tmp4) 
	     *lcd_data=' ';                            // 显示百位-没有显示
	 else
	     *lcd_data='0'+tmp3;                       // 显示百位
	 lcd_data_wait(); 
	 if(!tmp2&&!tmp3&&!tmp4)
	     *lcd_data=' ';                           // 显示十位-没有显示
	 else
	     *lcd_data='0'+tmp2;                      // 显示十位
	 lcd_data_wait();
	 *lcd_data='0'+tmp1;                          // 显示一位
	 lcd_data_wait();
	 }
		 
	 
      	 

⌨️ 快捷键说明

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