📄 adc._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 + -