/********************************************************************************************
* 文 件 名:main.c
* 功 能:控制ADC0809,实现对光敏热敏传感器输出模拟量信号的采集
* 硬件条件:1.CPU型号:STC89C52
* 2.晶振:12.000MHz
* 3.P0口连接模数转换模块的数据端D0~D7
* 4.P2.0-------------数模转换模块ST/ALE
* 5.P2.1-------------数模转换模块EOC
* 6.P2.2-------------数模转换模块OE
* 7.P2.3-------------数模转换模块CLK
* 8.P2.4-------------数模转换模块通道选择端A
* 9.P2.5-------------数模转换模块通道选择端B
* 10.P2.6------------数模转换模块通道选择端C
* 11.将通道八连接光敏传感器输出端或热敏传感器输出端
* 作 者:ICE(韩泉城,张学伟,宋庆,鲍明)
* 技术交流:74355596(ICE科技)
*********************************************************************************************/
#include "reg52.h" // 包含头文件
/* 与编译器无关的数据类型定义 *
/********************************************************************************************/
typedef unsigned char uint8; // 无符号8位整型变量
typedef signed char int8; // 有符号8位整型变量
typedef unsigned short uint16; // 无符号16位整型变量
typedef signed short int16; // 有符号16位整型变量
typedef unsigned int uint32; // 无符号32位整型变量
typedef signed int int32; // 有符号32位整型变量
typedef float fp32; // 单精度浮点数(32位长度)
typedef double fp64; // 双精度浮点数(64位长度)
/********************************************************************************************/
/* 位定义、宏定义、全局变量、数组定义 *
/********************************************************************************************/
sbit ST_ALE = P2 ^ 0; // 定义位变量
sbit EOC = P2 ^ 1;
sbit OE = P2 ^ 2;
sbit CLK = P2 ^ 3;
sbit ADD_A = P2 ^ 4;
sbit ADD_B = P2 ^ 5;
sbit ADD_C = P2 ^ 6;
sbit P1_0 = P1 ^ 0;
sbit P1_1 = P1 ^ 1;
sbit P1_2 = P1 ^ 2;
#define SI_H P1_2=1 // 定义"SI_H()"为P1.2输出高电平,作为74HC595的数据输入信号
#define SI_L P1_2=0 // 定义"SI_L()"为P1.2输出低电平,作为74HC595的数据输入信号
#define RCK_H P1_0=1 // 定义"RCK_H()"为P1.0输出高电平,作为74HC595的片选输入信号
#define RCK_L P1_0=0 // 定义"RCK_L()"为P1.0输出低电平,作为74HC595的片选输入信号
#define SCK_H P1_1=1 // 定义"SCK_H()"为P1.1输出高电平,作为74HC595的时钟输入信号
#define SCK_L P1_1=0 // 定义"SCK_L()"为P1.1输出低电平,作为74HC595的时钟输入信号
uint8 disp_buf[8]; // 八位八段数码管显示缓冲区
/* 7段共阳数码管显示字符"0"~"9"的编码表 */
const uint8 DISPLAY_TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};
// 0 1 2 3 4 5 6 7 8 9
/********************************************************************************************/
/********************************************************************************************
* 函数名称:Delaym()
* 功 能:配合ADC0809时序,设计的短暂延时函数
*********************************************************************************************/
void Delaym( void )
{
uint8 i;
for(i=0;i<8;i++);
}
/********************************************************************************************
* 函数名称:Delay()
* 功 能:软件延时
* 入口参数:count 延时参数,值越大,延时越长
* 出口参数:无
*********************************************************************************************/
void Delay(uint16 count)
{
uint8 i;
while(--count != 0)
{
for(i = 0; i < 125; i++); // ";" 表示空语句,CPU空转。
} // i 从0加到125,在12M晶体下CPU大概耗时1毫秒
}
/********************************************************************************************
* 函数名称:SendDataTo74HC595()
* 功 能:向八片74HC595发送八个数据
* 入口参数:disp_buf 要显示数据的数组入口地址
* 出口参数:无
* 注 意:发送数据时,高位先发送
*********************************************************************************************/
void SendDataTo74HC595(uint8 *disp_buf)
{
uint8 i,j;
RCK_L; // RCK为低电平
for(j=0;j<8;j++)
{
for(i=0;i<8;i++) // 发送8位数据(1个字节)
{
SCK_L; // SCK为低电平
/* 设置SI1的输出值 */
if((disp_buf[j] & 0x80)!=0)
SI_H; // SI输出高电平
else
SI_L; // SI输出低电平
disp_buf[j]<<=1; // 将要发送的1字节数据左移一位
SCK_H; // SCK为高电平
}
}
RCK_H; // RCK为高电平
}
/********************************************************************************************
* 函数名称:Timer0_Server()
* 功 能:为ADC提供时钟
*********************************************************************************************/
void Timer0_Server(void) interrupt 1
{
TH0=0x0ff;
TL0=0x09c;
CLK=~CLK;
}
/********************************************************************************************
* 函数名称:ADC_CH()
* 函数功能:进行AD采样,采样传感器信号,并返回采样值
* 入口参数;无
* 出口参数:AD采样值
*********************************************************************************************/
uint8 ADC_CH(void)
{
ET0=1;
TR0=1;
ST_ALE=1;
Delaym();
ST_ALE=0;
Delaym();
while(EOC==0);
OE=1;
Delaym();
return P0;
Delaym();
OE=0;
TR0=0;
ET0=0;
}
/********************************************************************************************
* 函数名称:main()
* 函数功能:选择通道8,并循环进行传感器模拟信号采集
*********************************************************************************************/
void main(void)
{
uint8 a,b,c;
uint8 temp;
EA =1; //开总中断
TMOD=0x01; //T0工作于方式1
ADD_A=1; //选择通道8
ADD_B=1;
ADD_C=1;
while(1)
{
temp=ADC_CH(); //进行AD采样
a = temp/100; //取出百位
b = (temp%100)/10; //取出十位
c = temp%10; //取出个位
disp_buf[7]=DISPLAY_TAB[c]; //显示
disp_buf[6]=DISPLAY_TAB[b];
disp_buf[5]=DISPLAY_TAB[a];
disp_buf[4]=0xff;
disp_buf[3]=0xff;
disp_buf[2]=0xff;
disp_buf[1]=0xff;
disp_buf[0]=0xff;
SendDataTo74HC595(disp_buf);
Delay(100);
}
}