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

📄 main.c

📁 51与ADC0804的编程实现的具体方法
💻 C
字号:
//===========================================================
//
//
// COPY RIGHT
//
//
//===========================================================

// 文件名:		Main.c
// 创建日期:   080303
// 创建:	    神之吻
// 描述:		作用:
//                   ADC0804芯片的使用,模数转换试验
//     			现象:
//                      
//     			引脚连接关系:
//                  1.用跳线将P2口的8脚与JE排插连接(即ADC0804的输出引脚DB0-DB7对应单片机的P20-P27)
//                  2.用跳线将P35连接JC5(即ADC0804的片选信号CS接单片机的P35引脚)
//                  3.用跳线将P36连接JC6(即ADC0804的启动转换信号WR接单片机的P36引脚)
//                  4.用跳线将P37连接JC7(即ADC0804的读取转换结果控制信号RD接单片机的P37引脚)
//                          
//------------------------------------------------------------


//********************************************************
//*                    头文件
//********************************************************

#include <reg52.h>

//*******************************************************
//*                  常量定义
//*******************************************************

// TRUE/FALSE定义
//---------------------------------------------------
#ifndef TRUE
#define TRUE  0xFF
#endif
 
#ifndef FALSE
#define FALSE 0x00
#endif

// 引脚宏定义
//---------------------------------------------------
sbit ADC_CS = P3^5;       //ADC0804片选控制信号
sbit ADC_WR = P3^6;       //ADC0804启动转换信号WR
sbit ADC_RD = P3^7;       //ADC0804读取转换结果控制信号RD
sbit DOT = P0^2;          //八段数码管小数点控制位

#define DB P2             //ADC0804的转换结果DB0-DB7
#define BITCODE P0        //八段数码管的位编码
#define BITCHOOSE P1      //位选择,在数码管的六位中选择一位显示



// 其它常量宏定义
//---------------------------------------------------
#define VREF 10           //参考电压:由于ADC0804的Vref/2外接电压5V,因此进行ADC转换的参考电压为10V
#define FULLSCALE  256    

//********************************************************
//*                    类型定义
//********************************************************
 
// 类型重命名
//---------------------------------------------------
typedef unsigned char  BOOLEAN;                 //布尔类型变量
typedef unsigned char  uint8;                   //无符号8位整型变量
typedef signed   char  int8;                    //有符号8位整型变量
typedef unsigned int   uint16;                  //无符号16位整型变量
typedef signed int     int16;                   //有符号16位整型变量
typedef unsigned long  uint32;                  //无符号32位整型变量
typedef signed  long   int32;                   //有符号32位整型变量
typedef float          fp32;                    //单精度浮点数(32位长度)

//********************************************************
//*                    全局变量声明
//********************************************************

// 与八段数码管有关的表定义
//---------------------------------------------------
uint8 code sled_table[] = {	// 位编码
				0x14,	// 0
				0xD7,	// 1
				0x4C,	// 2
				0x45,	// 3
				0x87,	// 4
				0x25,	// 5
				0x24,	// 6
				0x57,	// 7
				0x04,	// 8
				0x05,	// 9
				0x06,	// A
				0xA4,	// B
				0x3C,	// C
				0xC4,	// D
				0x2C,	// E
				0x2E	// F
				};

uint8 code bit_table[] = {	// 位选
				0xDF,	// bit0
				0xEF,	// bit1
				0xF7,	// bit2
				0xFB,	// bit3
				0xFD,	// bit4
				0xFE,	// bit5	
				};
				
uint8 code dot = 0xFB;	// 小数点位置

//与ADC0804采样芯片有关的数据结构
//-----------------------------------------------------
uint8 SampleValue;                   //直接从ADC0804的DB引脚取出的二进制采样结果
fp32  RealVoltage;					 //转换后的实际电压值
uint8 RealVoltBit[6];                //转换后地实际电压值的每一位编码值(用于八段数码管显示)

//********************************************************
//*                    函数原型
//********************************************************

void AdcStart();
void AdcRead();
void Display();
void delay_ms(uint32 ms);

//********************************************************
//*                    main函数
//********************************************************

main()
{
    while(TRUE)
	{
	  AdcStart();      //启动一次ADC0804采样
	  delay_ms(100);  //延时100ms,等待采样结束
	  AdcRead();       //完成一次采样后,从ADC0804的DB引脚读取采样值
	  Display();       //将采样结果在八段数码管显示出来
	}
}


//*******************************************************
//*                    AdcStart
//*
//*功能描述:启动一次ADC0804采样
//*输入参数:无
//*返回值:无
//*******************************************************
void AdcStart()
{
	ADC_CS = 0;		 //片选信号置0,ADC0804有效
    
	ADC_WR = 0;      //WR信号为低电平有效,启动一次ADC采样
	//NOP
	ADC_WR = 1;      //采样启动完毕WR信号复位
	//NOP
	ADC_CS = 1;      //片选信号复位
}

//*******************************************************
//*                    AdcRead
//*
//*功能描述:完成一次采样后,从ADC0804的DB引脚读取采样值
//*输入参数:无
//*返回值:无
//*******************************************************
void AdcRead()
{
	ADC_CS = 0;		 //片选信号置0,ADC0804有效
	//__NOP;
	ADC_RD = 0;      //RD信号为低电平有效,读出采样结果
	//NOP
	SampleValue = DB; //读出采样结果

	ADC_RD = 1;      //采样结果读出后,RD信号复位
	//NOP
	ADC_CS = 1;      //片选信号复位      
}

//*******************************************************
//*                    Display
//*
//*功能描述:将采样结果通过八段数码管显示出来
//*输入参数:无
//*返回值:无
//*******************************************************
void Display()
{
    uint8 CurBit,CurCode;
    uint8 VoltInt;  //实际电压值的整数部分
	fp32  VoltDec;  //实际电压值的小数部分
	uint8 VoltDectoInt;
	RealVoltage = VREF * (SampleValue / FULLSCALE); //将二进制字节采样结果转换成实际电压值 
	VoltInt = (uint8)RealVoltage;    //获得实际电压值的整数部分
	VoltDec = RealVoltage - VoltInt; //获得实际电压值的小数部分
	VoltDectoInt = (uint8)(VoltDec * 10000);  //小数点后保留四位
	//显示小数部分(四位)
	for(CurBit = 0;CurBit < 4;CurBit ++)
	{
		CurCode = VoltDectoInt % 10;
		VoltDectoInt /= 10;
		BITCHOOSE = bit_table[CurBit]; //选择当前显示的数码管
		BITCODE  = sled_table[CurCode]; //将选中的八段数码管赋予位编码
	}
	//显示个位整数与小数点
	CurCode = VoltInt % 10;    //获得显示数据编码
	BITCHOOSE = bit_table[5]; //选择当前显示的数码管
	BITCODE  = sled_table[CurCode]; //将选中的八段数码管赋予位编码
	DOT = 0;                        //小数点位于个位整数所在的八段数码管上
	//显示十位整数
	VoltInt /= 10;
	CurCode = VoltInt;	      //获得显示数据编码
	BITCHOOSE = bit_table[5]; //选择当前显示的数码管
	BITCODE  = sled_table[CurCode]; //将选中的八段数码管赋予位编码
}

//*******************************************************
//*                    delay_ms
//*
//*功能描述:ms级延时函数
//*输入参数:
//*返回值:无
//*******************************************************
void delay_ms(uint32 ms)
{
	uint32 i, j;
	for(i = 0; i < ms; i++)
		for(j = 0; j < 5000; j++);
}

⌨️ 快捷键说明

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