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