/********************************* 包含头文件 ********************************/
#include <reg52.h>
#include <intrins.h>
/********************************* 端口定义 **********************************/
#define uchar unsigned char
#define uint unsigned int
sbit CS = P1^4;
sbit Clk = P1^2;
sbit DATI = P1^3;
sbit DATO = P1^1;
sbit AD_SARS = P1^6;
sbit led2 = P2^1;
sbit led3 = P2^2;
/******************************* 定义全局变量 ********************************/
unsigned char dat = 0x00; //AD 值
unsigned char count = 0x00; //定时器计数
unsigned char CH; //通道变量
unsigned char dis[] = {0x00, 0x00, 0x00}; //显示数值
unsigned char c=0;
/******************************* 共阳 LED 段码表 *******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
/****************************************************************************
函数功能 :AD 转换子程序
入口参数 :CH
出口参数 :dat
****************************************************************************/
unsigned char adc0834(unsigned char CH)
{
unsigned char i,AI_data;
CS = 1;
_nop_();
DATO = 1;
_nop_();
_nop_();
Clk = 0;
_nop_();
CS = 0;
_nop_();
//Start BIT
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
//SGL/DIF BIT
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
//ODD/EVEN BIT
if((CH == 0x00) || (CH == 0x02))
{
DATI = 0;
}
if((CH == 0x01) || (CH == 0x03))
{
DATI = 1;
}
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
//SELECT BIT
if((CH == 0x00) || (CH == 0x01))
{
DATI = 0;
}
if((CH == 0x02) || (CH == 0x03))
{
DATI = 1;
}
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
//读取转换的8位数据
for(i=0;i<8;i++)
{
AI_data <<= 1;
_nop_();
AI_data+=(uchar)DATO;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
_nop_();
}
CS = 1;
DATI = 1;
return dat;
}
/****************************************************************************
函数功能 :将 0-255 级换算成 0.00-5.00 的电压数值
入口参数 :i
出口参数 :
****************************************************************************/
void convdata(unsigned char i)
{
dis[0] = i/51; //个位
dis[1] = (i%51)*10/51*2; //小数点后第一位
dis[2] = ((i%51)*10%51)*10/51*2; //小数点后第二位
}
/****************************************************************************
函数功能 :数码管显示子程序
入口参数 :
出口参数 :
****************************************************************************/
void display(void)
{
P0=0xff;
switch(c)
{
case 0:led2=0;led3=1;c++;P0=tab[dis[0]]&0x7f;;break;
case 1:led2=1;led3=0;c=0;P0=tab[dis[0]];break;
default :break;
}
}
/****************************************************************************
函数功能 :主程序
入口参数 :
出口参数 :
****************************************************************************/
void main(void)
{
TMOD = 0x01; //设置中断
TH0=(65536-50000)/256;// 定时器 1 初值定时 50ms
TL0=(65536-50000)%256;
IE = 0x82;
TR0 = 1;
while(1) //主循环
{
dat = adc0834(CH);
convdata(dat); //数据转换
display(); //显示数值
}
}
/****************************************************************************
函数功能 :定时器中断延时程序 这一段的作用时隔一段时间抽样一次 否侧显示的最后一位
会不稳定
入口参数 :
出口参数 :
****************************************************************************/
void timer0(void) interrupt 1
{
TH0=(65536-50000)/256;// 定时器 1 初值定时 50ms
TL0=(65536-50000)%256;
count++;
if (count == 0x01)
{
count = 0x00;
dat = adc0834(CH);
}
}
|