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

📄 0832.c

📁 DAC0832输出TLC0831采集并在数码管显示结果
💻 C
字号:
/*
DA输出数字量,AD转换后在数码管上显示电压值、
硬件接法:

			 数码管控制极
P1.0-------------C1
P1.1-------------C2
P1.2-------------C3
P1.3-------------C4
P1.4-------------C5
P1.5-------------C6
P1.6-------------C7
P1.7-------------C8

P3.0-------------74HC164 AB
P3.1-------------74HC164 CLK

			  DAC0832数据总线
P0.0-------------D0
P0.1-------------D1
P0.2-------------D2
P0.3-------------D3
P0.4-------------D4
P0.5-------------D5
P0.6-------------D6
P0.7-------------D7

P2.0-------------DAC0832_CS
P3.6-------------DAC0832_WR1

TLC0831_CS-------P3^2;
TLC0831_DO-------P3^3;
TLC0831_CLK------P3^4;

用短路片将A/DIN 和 D/A OUT短路
*/

#include <reg51.h>
#include <absacc.h>			  //加入头文件<绝对地址寻址>

#define	UCHAR	unsigned char
#define	UINT	unsigned int
#define	ULONG	unsigned long

#define LED_C	P1

#define	DAData	XBYTE[0xFEFF]		 //DAC0832写数据寄存器映射的外部地址

sbit	HC164_AB=P3^0;
sbit	HC164_CLK=P3^1;

sbit  	TLC0831_CS		=P3^2;
sbit  	TLC0831_DO		=P3^3;
sbit  	TLC0831_CLK		=P3^4;

UCHAR code 	LEDCode[]=
{
0xFC,	//'0'
0x60,	//'1'
0xDA,	//'2'
0xF2,	//'3'
0x66,	//'4'
0xB6,	//'5'
0xBE,	//'6'
0xE0,	//'7'
0xFE,	//'8'
0xF6,	//'9'
0x7C,	//'U'
};

void Delay1ms(unsigned int T)
{
	unsigned char i;

	while(T--)
	{
	for(i=0;i<125;i++);
	}
}

/*
74HC164控制函数
入口参数:并口输出的一字节数据
出口参数:无
*/
void HC164(UCHAR Dat)
{
	UCHAR i;

	HC164_CLK=0;
	for(i=0;i<8;i++)
	{
	if(Dat&0x01)
		HC164_AB=1;
	else
		HC164_AB=0;
	HC164_CLK=1;
	HC164_CLK=0;
	Dat>>=1;
	}
}

//数码管显示函数
void ShowValue(UCHAR ADValue,UCHAR DAValue)
{
	UCHAR LEDData[3];
	UINT tmp;

	//下面将AD的数据显示在数码管左边4位:格式 X.XXU
	tmp=(((ULONG)ADValue*500)/256);
	LEDData[0]=(tmp/100)%10;
	LEDData[1]=(tmp/10)%10;
	LEDData[2]=tmp%10;

	LED_C=0xFF;
	HC164(LEDCode[LEDData[0]]+0x01);
	LED_C=0xFE;
	Delay1ms(1);

	LED_C=0xFF;	
	HC164(LEDCode[LEDData[1]]);
	LED_C=0xFD;						
	Delay1ms(1);

	LED_C=0xFF;	
	HC164(LEDCode[LEDData[2]]);
	LED_C=0xFB;						
	Delay1ms(1);

	LED_C=0xFF;	
	HC164(LEDCode[10]);
	LED_C=0xF7;						
	Delay1ms(1);

	//下面将输出的DA数据显示在右边数码管上,格式:XXX
	LEDData[0]=(DAValue/100)%10;
	LEDData[1]=(DAValue/10)%10;
	LEDData[2]=DAValue%10;

	LED_C=0xFF;
	HC164(LEDCode[LEDData[0]]);
	LED_C=0xDF;
	Delay1ms(1);

	LED_C=0xFF;	
	HC164(LEDCode[LEDData[1]]);
	LED_C=0xBF;						
	Delay1ms(1);

	LED_C=0xFF;	
	HC164(LEDCode[LEDData[2]]);
	LED_C=0x7F;						
	Delay1ms(1);
}

//下面是TLC0831进行AD转换驱动函数,注释可参考前面的例程
void Delay2(UCHAR x) 
{ 
  	UCHAR i; 
   	for(i=0;i<x;i++);   		 
}

void CLK_Period(void) 
{  
	TLC0831_CLK=1; 
  	Delay2(2); 
   	TLC0831_CLK=0; 
   	Delay2(2); 
}

UCHAR Read_BYTE_TLC0831(void)
{  
	UCHAR i,ch;
   	TLC0831_CS=0;
   	CLK_Period(); 
   	ch=0;
   	for (;TLC0831_DO==1;) 
   		CLK_Period();
   	for (i=0; i<8; i++) 
   		{ 
   		CLK_Period(); ch=(ch<<1)|TLC0831_DO; 
		}
   	TLC0831_CS=1;
   	return(ch);
}

/*
主程序
DA循环输出0-0xFF数据,经转换后由AD读出电压值并显示在数码管上
*/
void main()
{
	UCHAR tmp;
	UINT ADSUM;			  //为AD计算的总和
	UCHAR ADCount;		  //为AD计算平均数设的计数器
	UCHAR DACount;		  //为DA每隔100ms左右输出数据设的计数器
	UCHAR DADat;		  //DA输出的数据

	ADCount=0;
	ADSUM=0;
	DACount=0;
	DADat=0;

	while(1)
	{
	DACount++;
	if(DACount==10)	  //延迟一定时间再送DA数据
	{
	DAData=DADat;		  //往DAC0832送DA数据
	DADat++;
	DACount=0;
	}

	
	ADSUM+=Read_BYTE_TLC0831();	//Read AD Value
	ADCount++;
	if(ADCount==10)				//计算AD平均值
	{
		tmp=ADSUM/ADCount;
		ADSUM=0;
		ADCount=0;	
	}
	ShowValue(tmp,DADat);		//显示AD值,及当前输出的DA数据
	}
}

⌨️ 快捷键说明

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