欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
單片機PCF8591 AD模塊1602顯示應用程序
[打印本頁]
作者:
193681134
時間:
2020-1-28 14:06
標題:
單片機PCF8591 AD模塊1602顯示應用程序
自己在做1602實驗的時候 仿真和實驗程序。
51hei.png
(17.08 KB, 下載次數: 41)
下載附件
2020-1-29 14:24 上傳
單片機源程序如下:
/*-----------------------------------------------
名稱:IIC協議 PCF8591ADDA轉換 顯示有4個,注意只有2個可以調節電壓的
內容:此程序通過IIC協議對DAAD芯片操作,讀取電位器的電壓通過液晶顯示,并輸出模擬量,用LED亮度漸變指示
------------------------------------------------*/
#include<reg52.h> //包含頭文件,一般情況不需要改動,頭文件包含特殊功能寄存器的定義
#include <intrins.h> //包含NOP空指令函數_nop_();
#define uchar unsigned char
#define uint unsigned int
#define Data P0 //數據端口
#define AddWr 0x90 //寫數據地址
#define AddRd 0x91 //讀數據地址
sbit RST=P2^4; //時鐘 加上后可以關掉DS1302芯片輸出
sbit Sda=P2^0; //定義總線連接端口
sbit Scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
sbit RS = P1^0;//Pin4
sbit RW = P1^1; //Pin5
sbit E = P2^5;//Pin6
uchar TempData[8];
uchar SecondLine[]=" "; //1602的第二行顯示字符存儲變量
uchar FirstLine[] =" "; //1602的第一行顯示字符存儲變量
/*------------------------------------------------
延時程序
------------------------------------------------*/
void delay_ms(uint j)
{
uint i;
for(;j>0;j--)
{
for(i=0;i<113;i++)
{;}
}
}
/*------------------------------------------------
啟動IIC總線
------------------------------------------------*/
void Start(void)
{
Scl=1;
_nop_();
Sda=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
/*------------------------------------------------
停止IIC總線
------------------------------------------------*/
void Stop(void)
{
Scl=1;
_nop_();
Sda=0;
_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_();
}
/*------------------------------------------------
發送一個字節
------------------------------------------------*/
void Send(uchar Data)
{
uchar BitCounter=8;
uchar 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;
}
/*------------------------------------------------
讀入一個字節并返回
------------------------------------------------*/
uchar Read(void)
{
uchar temp=0;
uchar temp1=0;
uchar 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);
Scl=0;
return(temp);
}
/*------------------------------------------------
寫入DA數模轉換值
------------------------------------------------*/
void DAC(uchar Data)
{
Start();
Send(AddWr); //寫入芯片地址
Ack();
Send(0x40); //寫入控制位,使能DAC輸出
Ack();
Send(Data); //寫數據
Ack();
Stop();
}
/*------------------------------------------------
讀取AD模數轉換的值,有返回值
------------------------------------------------*/
uchar ReadADC(uchar Ch)
{
uchar Data;
Start();
_nop_(); //寫入芯片地址
Send(AddWr);
_nop_();
Ack();
_nop_();
Send(0x00|Ch);//寫入選擇的通道,本程序只用單端輸入,差分部分需要自行添加
_nop_(); //Ch的值分別為0、1、2、3,分別代表1-4通道
Ack();
Start();
Send(AddRd); //讀入地址
Ack();
Data=Read(); //讀數據
Scl=0;
NoAck();
_nop_();
Stop();
_nop_();
return Data; //返回值
}
void cmg(void)//數碼管鎖存函數 關時鐘DS1302
{
dula=1;
P0=0x00;
dula=0;
wela=1;
P0=0x00;
wela=0;
RST=0; // 關時鐘DS1302
}
void WriteCommand(uchar c)
{
delay_ms(5);//短暫延時,就是避開1602里面的忙碌,讓它有足夠的時間工作再執行下面的語句。
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(uchar c)
{
delay_ms(5); //短暫延時,就是避開1602里面的忙碌,讓它有足夠的時間工作再執行下面的語句。
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/
void ShowString (uchar line,char *ptr)
{
uchar p;
if(line==0)
p=0x80;
else p=0xc0;
WriteCommand(p);
while(*ptr)
{
WriteData(*ptr);
ptr++;
}
}
/*********************************************************************/
void InitLcd()
{
delay_ms(15);
WriteCommand(0x38); //顯示模式設置
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示光標移動位置
WriteCommand(0x0c); //顯示開及光標設置
WriteCommand(0x01); //顯示清屏
}
/////////////////////////////////////////////////////////////////
void disp(void)
{
FirstLine[0]='V';
FirstLine[1]='1';
FirstLine[3]='0'+TempData[0];
FirstLine[4]='.';
FirstLine[5]='0'+TempData[1];
FirstLine[6]='V';
FirstLine[9]='V';
FirstLine[10]='2';
FirstLine[12]='0'+TempData[2];
FirstLine[13]='.';
FirstLine[14]='0'+TempData[3];
FirstLine[15]='V';
SecondLine[0]='V';
SecondLine[1]='3';
SecondLine[3]='0'+TempData[4];
SecondLine[4]='.';
SecondLine[5]='0'+TempData[5];
SecondLine[6]='V';
SecondLine[9]='V';
SecondLine[10]='4';
SecondLine[12]='0'+TempData[6];
SecondLine[13]='.';
SecondLine[14]='0'+TempData[7];
SecondLine[15]='V';
ShowString(0,FirstLine);
ShowString(1,SecondLine);
}
/*------------------------------------------------
主程序
------------------------------------------------*/
void main()
{
InitLcd();
delay_ms(20);
cmg(); //數碼管鎖存
while(1)
{
ReadADC(0);
TempData[0]=ReadADC(0)/50;//處理0通道電壓顯示
TempData[1]=(ReadADC(0)%50)/10;
ReadADC(1);
TempData[2]=ReadADC(1)/50;//處理1通道電壓顯示
TempData[3]=(ReadADC(1)%50)/10;
ReadADC(2);
TempData[4]=ReadADC(2)/50;//處理2通道電壓顯示
TempData[5]=(ReadADC(2)%50)/10;
ReadADC(3);
TempData[6]=ReadADC(3)/50;//處理3通道電壓顯示
TempData[7]=(ReadADC(3)%50)/10;
disp();
delay_ms(200);
}
}
復制代碼
所有資料51hei提供下載:
14 AD模塊1602顯示應用.zip
(149.46 KB, 下載次數: 40)
2020-1-28 14:04 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1