<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STC89C52單片機UART AD DA測試實(shí)驗

STC89C52單片機UART AD DA測試實(shí)驗

作者: 時(shí)間:2016-11-21 來(lái)源:網(wǎng)絡(luò ) 收藏
///////////////////////////////////////////////////////////////////////////

實(shí)現功能: 調節實(shí)驗板上的標號為AD0的電位器改變電壓,通過(guò)PCF8591的采集,把
數據傳輸給單片機,單片機通過(guò)處理把采集到的電壓值,顯示在數碼管
上,同時(shí)把通過(guò)AD0采集到的數據重新寫(xiě)入PCF8591,讓其轉換成模擬信
號,改變開(kāi)發(fā)板上D11的亮暗程度,而且把采集到的數據通過(guò)串口發(fā)送到
電腦上。注意所采用的通道為第0通道,也就
是說(shuō)調節的是AD0電位器
實(shí)驗板型號:KBL-XYD-C52
實(shí)驗名稱(chēng):UART AD DA測試實(shí)驗
編寫(xiě)人:謝應東
編寫(xiě)日期: 2012-4-30
///////////////////////////////////////////////////////////////////////////
#include //包含52單片機頭文件
#include //包含標準輸入輸出文件

本文引用地址:http://dyxdggzs.com/article/201611/319238.htm

#define uchar unsigned char//宏定義這個(gè)誰(shuí)都知道的
#define uint unsigned int

uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共陰數碼管1至F數字編碼

sbit duan=P2^6; //573鎖存器段鎖存端
sbit wei=P2^7; //位鎖存端

sbit sda=P2^0; //定義模擬IIC總線(xiàn)的數據線(xiàn)
sbit scl=P2^1; //定義模擬IIC總線(xiàn)的時(shí)鐘線(xiàn)

float fValue;

#define FOSC 11059200L
#define TIMS (65535-FOSC/12/1000) //在12T模式下定時(shí)器中斷1毫秒的計算方法

uint cCount,cFlag=0;
///////////////////////////////////////////////////////////////////////////
函數名稱(chēng):毫秒延時(shí)函數
函數功能:實(shí)現毫秒級的延時(shí)
參數介紹:Delay_MS: 定義需要延時(shí)的毫秒的數值
iNumber: 記錄Delay_MS的數值,以for語(yǔ)句實(shí)現所要求的延時(shí)
iValue: 要延時(shí)毫秒所要進(jìn)行的循環(huán)數值,本數值為實(shí)際測得
返回值: 無(wú)
注意事項:本實(shí)驗是在所用晶振為12M的前提下實(shí)現的毫秒延時(shí),本函數是通過(guò)循環(huán)的形
式完成,所以如果改變了晶振的頻率,請做相應的改變
///////////////////////////////////////////////////////////////////////////

void DelayMs(uint Delay_MS)
{
uint iNumber,iValue;
for(iNumber=0;iNumber{
iValue=107;
while(iValue--);
}
}
///////////////////////////////////////////////////////////////////////////
函數名稱(chēng):DelayUs
函數功能:延時(shí)幾個(gè)微秒(us),用來(lái)IIC總線(xiàn)延時(shí)
參數介紹:無(wú)
返回值: 無(wú)
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////

void DelayUs()
{;;}
///////////////////////////////////////////////////////////////////////////
函數名稱(chēng):Display_V
函數功能:把通過(guò)PCF8591采集到的數據,在單片機處理完之后,顯示在數碼管上
參數介紹:cBai:要顯示在第一個(gè)數碼管上的數字
cShi:要顯示在第二個(gè)數碼管上的數字
cGe:要顯示在第三個(gè)數碼管上的數字
返回值: 無(wú)
注意事項:注意實(shí)驗板上所要用到底的數碼管為共陰極的數碼管
///////////////////////////////////////////////////////////////////////////
void Display_V(uchar cBai,uchar cShi,uchar cGe)
{
duan=1; //打開(kāi)數碼管的段選
P0=table[cBai]|0x80;//送入相應的段選0x80是為了點(diǎn)亮數碼管小數點(diǎn)(dp端)
duan=0;//關(guān)閉數碼管的段選
P0=0xff;
wei=1;//打開(kāi)數碼管的位選
P0=0xfe; //給要點(diǎn)亮數碼管的公共極低電平
wei=0;//關(guān)閉數碼管的位選
DelayMs(5);//穩定時(shí)序

duan=1;//打開(kāi)數碼管的段選
P0=table[cShi];//送入相應的段選
duan=0;//關(guān)閉數碼管的段選
P0=0xff;
wei=1; //打開(kāi)數碼管的位選
P0=0xfd; //給要點(diǎn)亮數碼管的公共極低電平
wei=0; //打開(kāi)數碼管的位選
DelayMs(5); //穩定時(shí)序

duan=1; //打開(kāi)數碼管的段選
P0=table[cGe]; //送入相應的段選
duan=0; //關(guān)閉數碼管的段選
P0=0xff;
wei=1; //打開(kāi)數碼管的位選
P0=0xfb; //給要點(diǎn)亮數碼管的公共極低電平
wei=0; //打開(kāi)數碼管的位選
DelayMs(5); //穩定時(shí)序
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Init_IIC
函數功能:完成對IIC總線(xiàn)數據線(xiàn)時(shí)鐘線(xiàn)初始化
參數介紹:無(wú)
返回值: 無(wú)
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////
void Init_IIC()
{
sda=1;
scl=1;
}
///////////////////////////////////////////////////////////////////////////
函數名稱(chēng):Start_IIC
函數功能:IIC總線(xiàn)的開(kāi)始條件
參數介紹:無(wú)
返回值: 無(wú)
注意事項:具體請參考相關(guān)的文檔
///////////////////////////////////////////////////////////////////////////
void Start_IIC()//開(kāi)始條件
{
sda=1;
DelayUs();
scl=1;
DelayUs();
sda=0;
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Stop_IIC
函數功能:IIC總線(xiàn)的終止條件
參數介紹:無(wú)
返回值: 無(wú)
注意事項:具體請參考相關(guān)的文檔
///////////////////////////////////////////////////////////////////////////

void Stop_IIC()
{
sda=0;
DelayUs();
scl=1;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Response_IIC
函數功能:IIC總線(xiàn)的應答條件
參數介紹:cNumber: 定義一個(gè)延時(shí)的變量
返回值: 無(wú)
注意事項:具體請參考相關(guān)的文檔
///////////////////////////////////////////////////////////////////////////
void Response_IIC()//
{
uchar cNumber=0;
scl=1;
DelayUs();
while((sda==1)&&(cNumber<255))
cNumber++; //加一個(gè)等待時(shí)間防止程序一直處在檢測狀態(tài)
scl=0;//這個(gè)是應答和非應答綜合的應答條件
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Write_byte
函數功能:通過(guò)IIC總線(xiàn)向PCF8591寫(xiě)入一個(gè)字節
參數介紹:cData:要寫(xiě)入的字節的值
cNumber: 定義for語(yǔ)句中用到的變量,因為IIC總線(xiàn)是一位一位寫(xiě)入的,所
以需要循環(huán)8次
cTempValue: 臨時(shí)的一個(gè)變量
返回值: 無(wú)
注意事項:具體請參考相關(guān)IIC文檔
///////////////////////////////////////////////////////////////////////////
void Write_byte(uchar cData)
{
uchar cNumber,cTempValue;
cTempValue=cData;
for(cNumber=0;cNumber<8;cNumber++) //循環(huán)8次,完成一個(gè)字節的寫(xiě)入
{
cTempValue=cTempValue<<1; //CY=cTempValue^7;
scl=0;
DelayUs();
sda=CY; //CY 進(jìn)位標志位
DelayUs();
scl=1;
DelayUs();
}
scl=0;
DelayUs();
sda=1;
DelayUs();
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Read_byte
函數功能:通過(guò)IIC總線(xiàn),從器件里讀取一個(gè)字節,因為必須是一位一位讀,所以需要
循環(huán)8次
參數介紹:cNumber:for句用到的循環(huán)變量
返回值: cValue:返回讀取到的字節
注意事項:請參考相應的文檔
///////////////////////////////////////////////////////////////////////////

uchar Read_byte()
{
uchar cNumber=0,cValue=0;
scl=0;
DelayUs();
sda=1;
DelayUs();
for(cNumber=0;cNumber<8;cNumber++) //完成對一個(gè)字節的讀取
{
scl=1;
DelayUs();
cValue=(cValue<<1)|sda; //通過(guò)循環(huán)得到一個(gè)字節
scl=0;
DelayUs();
}
return cValue; //返回讀取到的字節
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Read_channel
函數功能:選取PCF8591的AD輸入通道,然后再讀出采集到數值,即電壓值
參數介紹:無(wú)
返回值: cValue:返回采集到的數據
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////
uchar Read_channel(uchar cChannel)//PCF通道選擇函數
{
uchar cValue; //從這個(gè)通道讀出數據是大多數學(xué)習者
Start_IIC(); //比較模糊的地方
Write_byte(0x90); //這個(gè)時(shí)序請按照AT24C02的任意讀時(shí)序圖進(jìn)行操作
Response_IIC();
Write_byte(0x40|cChannel);
Response_IIC();
Start_IIC();
Write_byte(0x91); //給IIC器件寫(xiě)入相應的命令
Response_IIC();
cValue=Read_byte(); //讀取采集到的數據
Stop_IIC();

return cValue; //返回采集到的數據
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Write_Data
函數功能:把要寫(xiě)入的數據寫(xiě)入PCF8591,讓其開(kāi)始轉換,然后輸出相應的模擬值
參數介紹:cData:要寫(xiě)入PCF8591的數據
返回值: 無(wú)
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////
void Write_Data(uchar cData)
{
Start_IIC();//以下嚴格按照PCF8591寫(xiě)時(shí)序圖
Write_byte(0x90);//進(jìn)行操作
Response_IIC();
Write_byte(0x40);
Response_IIC();
Write_byte(cData);
Response_IIC();
Stop_IIC();
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):Init_UART
函數功能:設定UART的波特率,配置定時(shí)器0每一毫秒鐘中斷一次,打開(kāi)相應的中斷
定時(shí)器1產(chǎn)生波特率,讓定時(shí)器0開(kāi)始中斷計時(shí)
參數介紹:無(wú)
返回值: 無(wú)
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////
void Init_UART()
{
TMOD=0x21;//定時(shí)器1工作方式2,8位自動(dòng)充裝
TH1=0xfd; //通信波特率定為9600bps
TL1=0xfd; //晶振為11.0592M的

TL0=TIMS;
TH0=TIMS>>8; //定時(shí)1秒所要裝的初值
SM0=0; //選擇串行口工作方式1
SM1=1;

EA=1; //打開(kāi)全局中斷
ET0=1; //打開(kāi)定時(shí)器0中斷
TR0=1; //讓定時(shí)器0開(kāi)始工作
TR1=1; //波特率的產(chǎn)生依靠是定時(shí)器1的溢出率
}
///////////////////////////////////////////////////////////////////////////

函數名稱(chēng):main
函數功能:完成對采集到的電壓值的處理,然后顯示到前三個(gè)數碼管上,把采集到的
數據同時(shí)寫(xiě)入PCF8591里,讓其轉換成模擬信號,改變發(fā)光二極管D11的亮
暗程度
參數介紹:cBai:因為把數分離,才能顯示到數碼管上,作為分離后顯示在第一個(gè)數
碼管上的數
cShi:顯示在第二個(gè)數碼管上的數
cGe:顯示在第三個(gè)數碼管上的數
iTempValue:臨時(shí)變量,賦予從PCF8591通道0讀出來(lái)的數值
返回值: 無(wú)
注意事項:無(wú)
///////////////////////////////////////////////////////////////////////////

void main()
{
uchar cBai,cShi,cGe;
int iTempValue;
DelayMs(50);//穩定系統
Init_UART();//初始化串口
Init_IIC();//IIC總線(xiàn)初始化
while(1) //大循環(huán)是用來(lái)不停地掃描PCF8591的數據變換
{
iTempValue=Read_channel(0);//從PCF8591通道0讀出來(lái)的數值
fValue=(float)iTempValue/51; //要把num強制轉換為float型進(jìn)行計算
cBai=iTempValue/51;//下面這三個(gè)分離是把從通道讀取到的數值轉換為電壓
cShi=iTempValueQ*10/51; //想一下5V為255那么1v是不是代表51
cGe=iTempValueQ*10Q*10/51;//1.8v是不是數值92
Display_V(cBai,cShi,cGe);//把電壓值顯示到數碼管上
Write_Data(iTempValue);//把采集到數據寫(xiě)到PCF8591,讓其轉換成模擬信號
if(cFlag==1)
{
cFlag=0;//對標志位清零,以便下次再發(fā)送
TI=1; //這一點(diǎn)至關(guān)重要
printf("The Volatage is %f Vn",fValue); //頭文件stdio.h的標準函數
printf("The Num is %d nn",iTempValue);
while(!TI);//判斷是否發(fā)送完畢
TI=0;//發(fā)送完成后記住要清零,為了下次發(fā)送
}
}
}

void Timer0_Routine() interrupt 1
{
TL0=TIMS;
TH0=TIMS>>8; //定時(shí)1毫秒所要裝的初值
cCount++;
if(cCount==1000)
{
cCount=0;
cFlag=1;
}
}



評論


技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>