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

📄 adc._c

📁 单片机A/D模数转换 C语言编写 源程序。
💻 _C
字号:
//******************************************************************************
//                                                                             *
//    FileName   : 实验板ADC.c                 ICCAVR V6.31A编译               *
//    Function   : 实验板的片内模数转换器ADC的使用练习                         *
//    Date       : 2006-11-05                                                  *
//    Version    : 1.0                                                         *
//                                                                             *
//    Author     : 开关电源              hongtusy@163.com                      *
//    Company    : 电子信息技术咨询网    http://www.itsn.cn                    *
//                                                                             *
//***************************描述与记事*****************************************
//实验板的AVR程序,片内模数转换器ADC的应用,用1602LCD显示两个通道的ADC测量电压数值
//接线定义:使用PC和PD口驱动1602LCD作显示,PD4,5,6 为RS,R/W,EA。数据位为PC口。
//          开关位置:SW2-1,2,3.SW1-1~8.SW2-5为背光开关。SW3-8为系统复位端。
//          PA0(SW3-1)和PA1(SW3-2)作为两个通道的模拟量输入端。
//记事:本程序旨在对片内模数转换器ADC的理解与演示,程序适合初学者使用.
//         使用ATmega8535,片内1MHz晶振。
//******************************************************************************

#include <iom8535v.h>             //头文件,ATmega8535单片机的寄存器定义
#include <macros.h>               //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.

typedef unsigned char uchar;      //数据类型说明
typedef unsigned int uint;        //数据类型说明

uchar buf[]="TEST  CH1:0.000Vvolt  CH2:0.000V";

/************************************************
函 数 名:    DelaymS()
功    能:    毫秒级延时函数
输入参数:     延迟时间/系统晶体
输出参数:    做相应的延迟处理
描    述:    /
***********************************************/
void DelaymS (uint i)            //延时函数,参数i为延时时间
{
    uint j,k;                        //双重延时
	for (j=0;j<i;j++)
	{
	    for (k=0;k<=500;k++);
	}
}
/********************************************************
  子程序名:   write_data()
  功    能:   写入一字节LCD数据
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void write_data(uchar h)
{
 	 PORTC = h;                  //先将数据送出
	 PORTD |= (1<<PD4);   //RS=1,数据
	 PORTD &= ~(1<<PD5);  //R/W=0,写
	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	 DelaymS (1);
	 PORTD |= (1<<PD6);   //EN=1 ,除能
}
/********************************************************
  子程序名:   write_code()
  功    能:   写入一字节LCD指令/地址
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void write_code(uchar h)
{
 	 PORTC = h;                  //先将地址送出
	 PORTD &= ~(1<<PD4);  //RS=0,命令或数据
	 PORTD &= ~(1<<PD5);  //R/W=0,写
	 PORTD &= ~(1<<PD6);  //EN=0 ,使能,产生一个下降沿。
	 DelaymS (1);
	 PORTD |= (1<<PD6);   //EN=1 ,除能
}
/********************************************************
  子程序名:   Init_lcd()
  功    能:   初始化LCD
  输入参数:   /
  输出参数:   /
  描    述:   /
********************************************************/
void Init_lcd(void)
{
 	 write_code(0x01);     //清除屏幕
	 write_code(0x38);     //功能设定,8位数据口/2行/5*7的点阵
	 write_code(0b00001111);     //显示幕ON,光标ON,闪烁ON
	 write_code(0x06);     //模式,加1,显示幕ON。
	 write_code(0b00000011);     //光标回到原点
}
/********************************************************
  子程序名:   display_lcd()
  功    能:   刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
  输入参数:   /
  输出参数:   /
  描    述:   在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
********************************************************/
void display_lcd(uchar *p)
{
	 uchar i;
	 write_code(0x80);     //第一行起始地址,0b10000000B=0x80.
	 for(i=0;i<16;i++)
	 {
	     write_data(p[i]);
	 }
	 write_code(0xc0);     //第二行起始地址,0b11000000B=0xc0.
	 for(i=16;i<32;i++)
	 {
	     write_data(p[i]);
	 }
}
/************************************************
函 数 名:    Init_mcu()
功    能:    单片机初始化函数
输入参数:     /
输出参数:    /
描    述:    相关口方向的设置等
***********************************************/
void Init_mcu(void)
{
 	DDRC = 0xff; //PC口为推挽1输出,段码
	DDRD = 0xff; //PD口为推挽1输出,位码
	DDRA = 0x00; //PA口为输入
	PORTA = 0x00; //内部不接上拉电阻
}
/************************************************
函 数 名:    adc_Init()
功    能:    ADC初始化函数
输入参数:     /
输出参数:    /
描    述:    设置片内模数转换器ADC的一些参数
***********************************************/
void Init_adc(void)
{
	ADMUX = 0b11000000; //内参2.56V参考电压源、右对齐、选择0通道(单输入,无增益)。
	//多工选择寄存器ADMUX
 	ADCSRA = 0b11101011; //ADC使能、启动转换、自由转换、中断使能、8分频。
	//控制和状态寄存器A,ADCSRA
}
/************************************************
函 数 名:    adc_convert()
功    能:    A/D转换函数
输入参数:     /
输出参数:    /
描    述:    读取采样获得的10位数据
***********************************************/
uint adc_convert(void)
{
	uint temp1,temp2;
	temp1 = (uint)ADCL;        //必须先读低字节
	temp2 = (uint)ADCH;
	temp2 = (temp2<<8) + temp1;    //左移8位
	return (temp2);
}
/********************************************************
  子程序名:   process()
  输入参数:   数据处理函数
  输出参数:   /
  描    述:   
  数据格式:   
  输出数据:   数据处理函数,将转换的值转换为4位BCD码。
********************************************************/
void process (uint i ,uchar j)
{
	 if (0 == j)
	 {
	     buf[10] = i/1000 + '0';   i=i%1000;
		 buf[12] = i/100 + '0';   i=i%100;
		 buf[13] = i/10 + '0';   i=i%10;
		 buf[14] = i + '0';
	 }
	 else
	 {
	     buf[26] = i/1000 + '0';   i=i%1000;
		 buf[28] = i/100 + '0';   i=i%100;
		 buf[29] = i/10 + '0';   i=i%10;
		 buf[30] = i + '0';
	 }
}
//*****************主程序**********************************
void main (void)
{
	 uchar buflogo[]="    welcome!      www.itsn.cn!  ";

     Init_mcu();       //单片机初始化
	 Init_lcd();        //lcd初始化
	 Init_adc();        //adc初始化
	 
	 display_lcd(buflogo);  //显示LOGO
	 DelaymS(300);    //长延迟
	 display_lcd(buf);  //刷新显示一屏
	 
	 while(1)         //无限循环执行
	 {
	     //DelaymS(5);          //延迟
		 
		 ADMUX = 0b11000000;
		 ADCSRA = 0b11101011;
		 DelaymS(5);
		 process (adc_convert()*5 / 2 , 0); //启动一次ADC转换,并进行数据修正及数据转换
		 ADCSRA = 0b01101011;
		 
		 ADMUX = 0b11000001;
		 ADCSRA = 0b11101011;
		 DelaymS(5);
		 process (adc_convert()*5 / 2 , 1);
		 ADCSRA = 0b01101011;
		 
		 display_lcd(buf);    //刷新显示一屏    
	 }
}

⌨️ 快捷键说明

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