📄 main.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 + -