|
單片機C語言實例-266-液晶AD_DA_PCF8591
/*-----------------------------------------------
名稱:IIC協(xié)議 PCF8591ADDA轉換
公司:上海浩豚電子科技有限公司
編寫:師訪
日期:2009.5
修改:無
內容:此程序通過IIC協(xié)議對DAAD芯片操作,讀取電位器的電壓通過液晶顯示,并輸出模擬量,用LED亮度漸變指示
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數(shù)_nop_();
#include<LCD1602.h>
#define AddWr 0x90 //寫數(shù)據(jù)地址
#define AddRd 0x91 //讀數(shù)據(jù)地址
sbit Sda=P1^2; //定義總線連接端口
sbit Scl=P1^1;
bit ADFlag; //定義AD采樣標志位
unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段數(shù)共陰碼管段碼表
data unsigned char Display[8];//定義臨時存放數(shù)碼管數(shù)值
/*------------------------------------------------
延時程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
for(;j>0;j--)
{
for(i=0;i<125;i++)
{;}
}
}
/*------------------------------------------------
初始化定時器1
------------------------------------------------*/
void Init_Timer1(void)
{
TMOD |= 0x10;
TH1=0xff; /* Init value */
TL1=0x00;
//PT1=1; /* 優(yōu)先級 */
EA=1; /* interupt enable */
ET1=1; /* enable timer1 interrupt */
TR1=1;
}
/*------------------------------------------------
啟動IIC總線
------------------------------------------------*/
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC總線
------------------------------------------------*/
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
/*------------------------------------------------
應答IIC總線
------------------------------------------------*/
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------
非應答IIC總線
------------------------------------------------*/
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
/*------------------------------------------------
發(fā)送一個字節(jié)
------------------------------------------------*/
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
/*------------------------------------------------
讀入一個字節(jié)并返回
------------------------------------------------*/
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
/*------------------------------------------------
寫入DA數(shù)模轉換值
------------------------------------------------*/
void DAC(unsigned char Data)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫數(shù)據(jù)
Ack();
Stop();
}
/*------------------------------------------------
讀取AD模數(shù)轉換的值,有返回值
------------------------------------------------*/
unsigned char ReadADC(unsigned char Chl)
{
unsigned char Data;
Start(); //寫入芯片地址
Send(AddWr);
Ack();
Send(0x40|Chl);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
//Chl的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀數(shù)據(jù)
Scl=0;
NoAck();
Stop();
return Data; //返回值
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
unsigned char num; //DA數(shù)模輸出變量
unsigned char ADtemp; //定義中間變量
InitLcd();
mDelay(20);
Init_Timer1();
while(1)
{
DAC(num); //DA輸出,可以用LED模擬電壓變化
num++; //累加,到256后溢出變?yōu)?,往復循環(huán)。顯示在LED上亮度逐漸變化
mDelay(20); //延時用于清晰看出變化
if(ADFlag) //定時采集輸入模擬量
{
ADFlag=0;
ADtemp=ReadADC(0);
TempData[0]=(ReadADC(0))/50;//處理0通道電壓顯示
TempData[1]=((ReadADC(0))%50)/10;
ADtemp=ReadADC(1);
TempData[2]=(ReadADC(1))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
TempData[3]=((ReadADC(1))%50)/10;
ADtemp=ReadADC(2);
TempData[4]=(ReadADC(2))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
TempData[5]=((ReadADC(2))%50)/10;
ADtemp=ReadADC(3);
TempData[6]=(ReadADC(3))/50;//處理1通道電壓顯示 此通道暫時屏蔽,可以自行添加
TempData[7]=((ReadADC(4))%50)/10;
disp();
}
}
}
/*------------------------------------------------
定時器中斷程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1//定時器1執(zhí)行數(shù)碼管動態(tài)掃描
{
static unsigned int j;
TH1=0xfb; //重新賦值
TL1=0x00;
j++;
if(j==200)
{j=0;ADFlag=1;} //定時置位AD采樣標志位
// P0=Display[count];//用于動態(tài)掃描數(shù)碼管
// P2=count;
// count++;
// if(count==8) //表示掃描8個數(shù)碼管
// count=0;
}
更多詳情參考附件文檔
+08:00C122聯(lián)盟網(wǎng)9967.png (28.29 KB, 下載次數(shù): 4)
下載附件
保存到相冊
2022-3-14 09:56 上傳
|
|