#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
ulong volt;//測量的電壓值
uchar code led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數(shù)碼管顯示0-9的對應(yīng)電平碼
uint vtime; // 用來控制測量地址位的改變
uchar addr;//測量地址位,指示測量的是哪一個模擬值 (其實就是TLC2543的控制字)
uchar xu[5];
float a;
sbit LW1=P2^3;//數(shù)碼管電壓顯示值的第1個 比如四個數(shù)碼管顯示4.885值中,對應(yīng)顯示4這個數(shù)碼管
sbit LW2=P2^2;//數(shù)碼管電壓顯示值的第2個
sbit LW3=P2^1;//數(shù)碼管電壓顯示值的第3個
sbit LW4=P2^0;//數(shù)碼管電壓顯示值的第4個
sbit CLK=P1^7;//定義時鐘信號口
sbit DIN=P1^6;//定義2543數(shù)據(jù)寫入口
sbit DOUT=P1^5;//定義2543數(shù)據(jù)讀取口
sbit CS=P1^4;//定義2543片選信號口
sbit beep=P3^6;
/**********************************************************/
//函數(shù)名:delay(uint x)
//功能:延時程序 改變測量地址
//調(diào)用函數(shù):
//輸入?yún)?shù):x
//輸出參數(shù):
//說明:
/**********************************************************/
void delay(uint x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--);//該步運行時間約為0.5ms
vtime++;
if(vtime==1000)
{
vtime=0;
// addr++;
// if(addr==3)
// addr=0;//以上語句實現(xiàn)測量地址位的改變
}
}
/**********************************************************/
//函數(shù)名:read2543(uchar addr)
//功能:2543驅(qū)動程序
//調(diào)用函數(shù):
//輸入?yún)?shù):addr
//輸出參數(shù):
//說明:進行ad轉(zhuǎn)換將結(jié)果存于volt變量中 addr為測量位地址
/**********************************************************/
void read2543(uchar addr)
{
uint ad=0;
uchar i;
CLK=0;
CS=0;//片選段,啟動2543
addr<<=4;//對地址位預處理
for(i=0;i<12;i++) //12個時鐘走完,完成一次讀取測量
{
if(DOUT==1)
ad=ad|0x01;//單片機讀取ad數(shù)據(jù)
DIN=addr&0x80;//2543讀取測量地址位
CLK=1;
;;;//很短的延時
CLK=0;//產(chǎn)生下降沿,產(chǎn)生時鐘信號
;;;
addr<<=1;
ad<<=1;//將數(shù)據(jù)移位準備下一位的讀寫
}
CS=1;//關(guān)2543
ad>>=1;
volt=ad;//取走轉(zhuǎn)換結(jié)果
volt=volt*1221;//例子的滿量程為5V,轉(zhuǎn)換分辯率為12位(2的12次方=4096) 。即最大值是255,5/4096=1221mV,即例子中的1V代表實際1221mV
xu[0] = (volt/1000000); //1
xu[1] = (volt/100000)%10; //0.001
xu[2] = (volt/10000)%10; //0.01
xu[3] =(volt/1000)%10; //0.1
a=(xu[0]+xu[1]*0.001+xu[2]*0.01+xu[3]*0.1);
}
/**********************************************************/
//函數(shù)名:display()
//功能:5位數(shù)碼管顯示
//調(diào)用函數(shù):delay(uint x)
//輸入?yún)?shù):
//輸出參數(shù):
//說明:將處理后的電壓值與測量位值顯示在5位數(shù)碼管上
/**********************************************************/
void display()
{
P0=0xff;//消隱,因為不斷進行循環(huán)顯示,以防上次顯示有殘留電平的影響
LW1=1; //選中第1個數(shù)碼管進行顯示
P0=~led[volt/1000000]&0x7f;//帶小數(shù)點1伏顯示位
delay(2); //延時
P0=0xff; //消隱
LW1=0; //取消選中第1個數(shù)碼管進行顯示
LW2=1; //選中第2個數(shù)碼管進行顯示
P0=~led[(volt/100000)%10];//100毫伏顯示位
delay(2);
P0=0xff;
LW2=0;
LW3=1;
P0=~led[(volt/10000)%10];//10毫伏顯示位
delay(2);
P0=0xff;
LW3=0;
LW4=1;
P0=~led[(volt/1000)%10];//1毫伏顯示位
delay(2);
P0=0xff;
LW4=0;
}
void key()
{
if(a>=4.096)
{
beep=0;
}
if(a<4.096){
beep=1;
display();
}
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
//beep=0;
read2543(0);
while(1)
{
key();
read2543(0);//調(diào)用2543驅(qū)動程序測量地址為0
}
} |