TLC2543 是一款 12 位精密模數(shù)轉(zhuǎn)換器 (ADC)。
1~9、11、12——AIN0~AIN10為模擬輸入端;
15——CS 為片選端;
17——DIN 為串行數(shù)據(jù)輸入端;(控制字輸入端,用于選擇轉(zhuǎn)換及輸出數(shù)據(jù)格式)
16——DOUT為A/D轉(zhuǎn)換結(jié)果的三態(tài)串行輸出端;(A/D轉(zhuǎn)換結(jié)果的輸出端。)
19——EOC為轉(zhuǎn)換結(jié)束端;
18——CLK為I/O時(shí)鐘;(控制輸入輸出的時(shí)鐘,由外部輸入。)
14——REF+為正基準(zhǔn)電壓端;
13——REF-為負(fù)基準(zhǔn)電壓端;
20——VCC為電源;文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-626965.html
10——GND為地。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-626965.html
/***********************************************************************
* 說(shuō)明:搖桿實(shí)驗(yàn)。搖動(dòng)搖桿,查看顯示屏上AD值變化。
**********************************************************************/
#include "STC89C5xRC.h" /* 此文件中定義了單片機(jī)的一些特殊功能寄存器 */
#include "OLED.h" /* OLED頭文件 */
/* #include "Codedat.h" */
#define uint unsigned int /* 對(duì)數(shù)據(jù)類(lèi)型進(jìn)行聲明定義 */
#define uchar unsigned char
sbit beep = P2 ^ 4; /* 定義蜂鳴器觸發(fā)腳 */
/**************************************
* 2543控制引腳宏定義
*************************************/
sbit CLOCK = P3 ^ 5; /*2543時(shí)鐘*/
sbit D_IN = P4 ^ 0; /*2543輸入*/ /* 【注意:此處是口袋實(shí)驗(yàn)室連接引腳】 */
sbit D_OUT = P0 ^ 2; /*2543輸出*/
sbit _CS = P3 ^ 4; /*2543片選*/
sbit DIG1 = P0 ^ 0; /* 數(shù)碼管位選1 */
sbit DIG2 = P0 ^ 1; /* 數(shù)碼管位選2 */
sbit key1 = P3 ^ 2; /* 搖桿A按鍵 */
sbit key2 = P3 ^ 3; /* 搖桿B按鍵 */
#define led P1 /* 將P1口定義為led 后面就可以使用led代替P0口 */
/*******************************************************************************
* 函 數(shù) 名 : delay
* 函數(shù)功能 : 延時(shí)函數(shù),本延時(shí)函數(shù)延時(shí)較短,可以較快刷新屏幕
* 當(dāng)然也可以使用OLED.h定義的delay_ms()函數(shù)
*******************************************************************************/
void delay( int ms )
{
int ii, jj;
if ( ms < 1 )
ms = 1;
for ( ii = 0; ii < ms; ii++ )
for ( jj = 0; jj < 500; jj++ )
;
}
/*******************************************************************************
* 函 數(shù) 名 : read2543
* 函數(shù)功能 : TLC2543驅(qū)動(dòng)模塊
* 輸 入 : port 通道號(hào)
* 輸 出 : ad 轉(zhuǎn)換值
* 說(shuō) 明 :請(qǐng)結(jié)合TLC2543芯片手冊(cè)和下方注釋理解
*******************************************************************************/
uint read2543( uchar port )
{
uint ad = 0, i;
CLOCK = 0;
_CS = 0;
port <<= 4; /*選通道。高四位代表AD通道,低四位自動(dòng)補(bǔ)0 */
/*這里的for,其實(shí)就算_CS變低后,時(shí)鐘IO_Clock和Data_Input使能,Data_Out脫離高阻狀態(tài)。
* 12個(gè)時(shí)鐘信號(hào)依次輸入。隨著時(shí)鐘信號(hào)的輸入,控制字從Data_Input一位一位地在時(shí)鐘信號(hào)上升沿時(shí)
* 送入TLC2543(注意:高位先入),這里的控制字是通道選擇(port),從A0-A10共11個(gè)通道,
* (分別對(duì)應(yīng)0000至1010,高四位就是存放模擬通道輸入選擇的數(shù)據(jù))
* 同時(shí),上一周期轉(zhuǎn)換的AD數(shù)據(jù),即輸出數(shù)據(jù)寄存器中的數(shù)據(jù)從Data_Out一位一位地移出(下降沿時(shí))
* (第一次_CS=0時(shí)輸出第一位,其他的跟著for內(nèi)的下降沿輸出)*/
for ( i = 0; i < 12; i++ ) /* 進(jìn)行12次(12位)的數(shù)據(jù)推送 */
{
if ( D_OUT )
ad |= 0x01; /* 相當(dāng)于每次檢出輸出1時(shí)。最低位就給1,否則給0 */
D_IN = (bit) (port & 0x80); /* 相當(dāng)于只取最高位進(jìn)行與運(yùn)算 */
CLOCK = 1; /* 電平抬高 */
delay( 3 ); /* 延時(shí) */
CLOCK = 0; /* 給低電平 */
delay( 3 ); /* 延時(shí)。這里是給一個(gè)完整周期的脈沖 */
port <<= 1;
ad <<= 1; /* 左移一位,為下一次for循環(huán)做準(zhǔn)備 */
}
_CS = 1; /* 片選端置高,則IO_Clock和Data_Input禁止,Data_Out高阻,EOC置高 */
ad >>= 1; /*上面最后一次for循環(huán)多移了一次現(xiàn)在移回來(lái) */
return(ad); /* 返回轉(zhuǎn)換值 */
}
/*******************************************************************************
* 函 數(shù) 名 : ad_number
* 函數(shù)功能 : AD值數(shù)值拆分函數(shù)
* 輸 入 : i 通道 y 顯示行坐標(biāo)
* 輸 出 : 無(wú)
*******************************************************************************/
void ad_number( uchar i, uchar y )
{
uint ad;
ad = read2543( i ); /* 這里得到的是AD值(0~4095) */
OLED_ShowNum( 63, y, ad, 4, 16 );
}
/*******************************************************************************
* 函 數(shù) 名 : Int1Init()
* 函數(shù)功能 : 設(shè)置外部中斷1 [P3.3]
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Int0Init()
{
/* 設(shè)置INT0 */
IT0 = 1; /* 跳變沿出發(fā)方式(下降沿) */
EX0 = 1; /* 打開(kāi)INT0的中斷允許。 */
EA = 1; /* 打開(kāi)總中斷 */
}
/*******************************************************************************
* 函 數(shù) 名 : Int1Init()
* 函數(shù)功能 : 設(shè)置外部中斷1 [P3.3]
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Int1Init()
{
/* 設(shè)置INT1 */
IT1 = 1; /* 跳變沿出發(fā)方式(下降沿) */
EX1 = 1; /* 打開(kāi)INT1的中斷允許。 */
EA = 1; /* 打開(kāi)總中斷 */
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void main( void )
{
Int0Init(); /* 外部中斷0初始化 */
Int1Init(); /* 外部中斷1初始化 */
beep = 0; /* 蜂鳴器不響 */
DIG1 = 0; /* 禁止數(shù)碼管十位亮 */
DIG2 = 0; /* 禁止數(shù)碼管個(gè)位亮 */
delay( 300 ); /*上電后等待系統(tǒng)穩(wěn)定 */
OLED_Init(); /* OLED初始化 */
OLED_ShowString( 24, 0, "A-X:", 16 );
OLED_ShowString( 24, 2, "A-Y:", 16 );
OLED_ShowString( 24, 4, "B-X:", 16 );
OLED_ShowString( 24, 6, "B-Y:", 16 );
led = 0xff; /* LED全滅 */
while ( 1 )
{
ad_number( 7, 4 );
ad_number( 8, 2 );
ad_number( 9, 0 );
ad_number( 10, 6 );
}
}
/*******************************************************************************
* 函 數(shù) 名 : Int0() interrupt 0
* 函數(shù)功能 : 外部中斷1的中斷函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Int0()
interrupt 0 /* 外部中斷1的中斷函數(shù) */
{
delay( 40 ); /* 延時(shí)消抖 */
if ( key1 == 0 ) /* 如果按鍵按下 */
{
beep = ~beep; /* 蜂鳴器響/不響 */
}
}
/*******************************************************************************
* 函 數(shù) 名 : Int1() interrupt 2
* 函數(shù)功能 : 外部中斷1的中斷函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void Int1() interrupt 2 /* 外部中斷1的中斷函數(shù) */
{
delay( 40 ); /* 延時(shí)消抖 */
if ( key2 == 0 ) /* 如果按鍵按下 */
{
led = ~led; /* LED全亮/滅 */
}
}
到了這里,關(guān)于【單片機(jī)】51單片機(jī),TLC2543,驅(qū)動(dòng)程序,讀取adc的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!