?? 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 + -