標(biāo)題:
基于51單片機(jī)的PCF8591模數(shù)轉(zhuǎn)換protues仿真LCD顯示
[打印本頁]
作者:
houyannian
時間:
2017-7-28 21:04
標(biāo)題:
基于51單片機(jī)的PCF8591模數(shù)轉(zhuǎn)換protues仿真LCD顯示
基于51單片機(jī)的PCF8591模數(shù)轉(zhuǎn)換LCD顯示,自帶protues仿真.
0.png
(29.34 KB, 下載次數(shù): 70)
下載附件
2017-7-28 22:11 上傳
0.png
(36.96 KB, 下載次數(shù): 58)
下載附件
2017-7-28 22:11 上傳
單片機(jī)源程序如下:
/****************************************************************
在1602液晶屏上顯示各通道的電壓值
******************************************************************/
#include<reg52.h> //包含單片機(jī)寄存器的頭文件
#include <intrins.h>
#define AddWr 0x90 //PCF8591 地址
#define Data P0 //數(shù)據(jù)端口
// 變量定義
unsigned char AD_CHANNEL;
sbit scl=P2^6; //I2C 時鐘
sbit sda=P2^7; //I2C 數(shù)據(jù)
bit ack; /*應(yīng)答標(biāo)志位*/
sbit RS = P2^0;//Pin4
sbit RW = P2^1; //Pin5
sbit E = P2^2;//Pin6
unsigned char TempData[8];
unsigned char FirstLine[16]="Voltage: ";
unsigned char SecondLine[16] ="Current: ";
/*******************************************************************
起動總線函數(shù)
函數(shù)原型: void Start_I2c();
功能: 啟動I2C總線,即發(fā)送I2C起始條件.
********************************************************************/
void Start_I2c()
{
sda=1; /*發(fā)送起始條件的數(shù)據(jù)信號*/
_nop_();
scl=1;
_nop_(); /*起始條件建立時間大于4.7us,延時*/
_nop_();
_nop_();
_nop_();
_nop_();
sda=0; /*發(fā)送起始信號*/
_nop_(); /* 起始條件鎖定時間大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
scl=0; /*鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù) */
_nop_();
_nop_();
}
/*******************************************************************
結(jié)束總線函數(shù)
函數(shù)原型: void Stop_I2c();
功能: 結(jié)束I2C總線,即發(fā)送I2C結(jié)束條件.
********************************************************************/
void Stop_I2c()
{
sda=0; /*發(fā)送結(jié)束條件的數(shù)據(jù)信號*/
_nop_(); /*發(fā)送結(jié)束條件的時鐘信號*/
scl=1; /*結(jié)束條件建立時間大于4μs*/
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
sda=1; /*發(fā)送I2C總線結(jié)束信號*/
_nop_();
_nop_();
_nop_();
_nop_();
}
/*******************************************************************
字節(jié)數(shù)據(jù)發(fā)送函數(shù)
函數(shù)原型: void I2C_SendByte(UCHAR c);
功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
此狀態(tài)位進(jìn)行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
發(fā)送數(shù)據(jù)正常,ack=1; ack=0表示被控器無應(yīng)答或損壞。
********************************************************************/
void I2C_SendByte(unsigned char c)
{
unsigned char i;
for(i=0;i<8;i++) /*要傳送的數(shù)據(jù)長度為8位*/
{
if((c<<i)&0x80)sda=1; /*判斷發(fā)送位*/
else sda=0;
_nop_();
scl=1; /*置時鐘線為高,通知被控器開始接收數(shù)據(jù)位*/
_nop_();
_nop_(); /*保證時鐘高電平周期大于4μs*/
_nop_();
_nop_();
_nop_();
scl=0;
}
_nop_();
_nop_();
sda=1; /*8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位*/
_nop_();
_nop_();
scl=1;
_nop_();
_nop_();
_nop_();
if(sda==1)ack=0;
else ack=1; /*判斷是否接收到應(yīng)答信號*/
scl=0;
_nop_();
_nop_();
}
/*******************************************************************
字節(jié)數(shù)據(jù)接收函數(shù)
函數(shù)原型: UCHAR I2C_RcvByte();
功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機(jī)。
********************************************************************/
unsigned char I2C_RcvByte()
{
unsigned char retc=0,i;
sda=1; /*置數(shù)據(jù)線為輸入方式*/
for(i=0;i<8;i++)
{
_nop_();
scl=0; /*置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位*/
_nop_();
_nop_(); /*時鐘低電平周期大于4.7μs*/
_nop_();
_nop_();
_nop_();
scl=1; /*置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效*/
_nop_();
_nop_();
retc=retc<<1;
if(sda==1)retc=retc+1; /*讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中 */
_nop_();
_nop_();
}
scl=0;
_nop_();
_nop_();
return(retc);
}
/********************************************************************
應(yīng)答子函數(shù)
函數(shù)原型: void Ack_I2c(bit a);
功能: 主控器進(jìn)行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
********************************************************************/
void Ack_I2c(bit a)
{
if(a==0)
{
sda=0;
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_(); /*時鐘低電平周期大于4μs*/
_nop_();
_nop_();
_nop_();
scl=0; /*清時鐘線,住I2C總線以便繼續(xù)接收*/
_nop_();
_nop_();
sda=1;
_nop_();
_nop_();
} /*在此發(fā)出應(yīng)答或非應(yīng)答信號 */
else
{ sda=1; /*0為發(fā)出應(yīng)答,1為非應(yīng)答信號 */
_nop_();
_nop_();
_nop_();
scl=1;
_nop_();
_nop_(); /*時鐘低電平周期大于4μs*/
_nop_();
_nop_();
_nop_();
scl=0; /*清時鐘線,住I2C總線以便繼續(xù)接收*/
_nop_();
_nop_();
sda=0;
_nop_();
_nop_();
}
}
/************************************************************
* 函數(shù)名 : Pcf8591_SendByte
* 函數(shù)功能 : 寫入一個控制命令
* 輸入 : addr(器件地址),channel(轉(zhuǎn)換通道)
* 輸出 : 無
************************************************************/
bit PCF8591_SendByte(unsigned char addr,unsigned char channel)
{
Start_I2c(); //啟動總線
I2C_SendByte(addr); //發(fā)送器件地址
if(ack==0)return(0);
I2C_SendByte(0x40|channel); //發(fā)送控制字節(jié)
if(ack==0)return(0);
Stop_I2c(); //結(jié)束總線
return(1);
}
/************************************************************
* 函數(shù)名 : PCF8591_RcvByte
* 函數(shù)功能 : 讀取一個轉(zhuǎn)換值
* 輸入 :
* 輸出 : dat
************************************************************/
unsigned char PCF8591_RcvByte(unsigned char addr)
{
unsigned char dat;
Start_I2c(); //啟動總線
I2C_SendByte(addr+1); //發(fā)送器件地址
if(ack==0)return(0);
dat=I2C_RcvByte(); //讀取數(shù)據(jù)0
Ack_I2c(1); //發(fā)送非應(yīng)答信號
Stop_I2c(); //結(jié)束總線
return(dat);
}
/******************************************************************/
/* 1602液晶屏相關(guān)函數(shù) */
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行則命令代碼高4位為0xc
else
p=pos+0x80; //是第二行則命令代碼高4位為0x8
WriteCommand (p);//write command
WriteData (c); //write data
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循環(huán)顯示16個字符
}
/*********************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x38); //display mode
WriteCommand(0x06); //顯示光標(biāo)移動位置
WriteCommand(0x0c); //顯示開及光標(biāo)設(shè)置
WriteCommand(0x01); //顯示清屏
}
/////////////////////////////////////////////////////////////////
void disp(void)
{
unsigned char i=0;
while(FirstLine[i]!=' ')
{
ShowString(0,FirstLine);
i++;
}
FirstLine[8]= '0'+TempData[0];
FirstLine[9]= '0'+TempData[1];
FirstLine[10]='.';
FirstLine[11]='0'+TempData[2];
FirstLine[12]='0'+TempData[3];
FirstLine[14]='V';
ShowString(0,FirstLine);
while(SecondLine[i]!=' ')
{
ShowString(1,SecondLine);
i++;
}
SecondLine[8]='0'+TempData[4];
SecondLine[11]='0'+TempData[6];
SecondLine[10]='.';
SecondLine[14]='V';
ShowString(1,SecondLine);
}
/*------------------------------------------------
延時程序
------------------------------------------------*/
void mDelay(unsigned char j)
{
unsigned int i;
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
AD-PCF8591.zip
(70.71 KB, 下載次數(shù): 210)
2017-7-28 21:03 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
a19951218
時間:
2018-1-20 00:17
沒有仿真文件的?
作者:
ccppww806
時間:
2018-5-23 10:17
剛好在學(xué)習(xí),收藏了
作者:
ccppww806
時間:
2018-5-23 10:33
找不到仿真文件呀,只有代碼
作者:
shiwei13
時間:
2018-7-1 15:31
沒有封裝嗎
作者:
青寧
時間:
2018-8-30 09:40
仿真文件在哪?用樓主的仿真圖連接的電路根本無法實現(xiàn)
作者:
123#!
時間:
2019-3-30 23:11
沒protues文件啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1