新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 0832ADC的51測試程序

0832ADC的51測試程序

作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
#include"reg52.h"

#include
#include"intrins.h"

本文引用地址:http://butianyuan.cn/article/201611/316339.htm

//==========================================================
sbit CS=P3^0; //使能片選
sbit CLK=P3^1; //時鐘
sbit Do=P3^2; //數(shù)據(jù)輸出
sbit Di=P3^2; //數(shù)據(jù)輸入
sbit Do2=P3^3; //數(shù)據(jù)輸出
sbit Di2=P3^3; //數(shù)據(jù)輸入
sbit Do3=P3^4; //數(shù)據(jù)輸出
sbit Di3=P3^4; //數(shù)據(jù)輸入
sbit Do4=P3^5; //數(shù)據(jù)輸出
sbit Di4=P3^5; //數(shù)據(jù)輸入
sbit Do5=P3^6; //數(shù)據(jù)輸出
sbit Di5=P3^6; //數(shù)據(jù)輸入

unsigned char data_f=0,data_c=0,data_f2=0,data_c2=0,data_f3=0,data_c3=0,data_f4=0,data_c4=0,data_f5=0,data_c5=0; //data_f正確順序 data_c逆序

unsigned char last[5]; //記錄上一時刻各AD轉換得到的值
unsigned char current[5]; //記錄此次AD轉換得到的值

int left = 0; //記錄0.1秒內電機向左轉動的步數(shù)
int right = 0;//記錄0.1秒內電機向右轉動的步數(shù)

sbit RS = P2^4;//Pin4
sbit RW = P2^5; //Pin5
sbit E = P2^6;//Pin6

#define Data P0 //數(shù)據(jù)端口

char data TimeNum[]=" ";
char data Test1[]=" ";


/******************************************************************/
/* 函數(shù)聲明 */
/******************************************************************//***************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned int 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); //顯示光標移動位置
WriteCommand(0x0c); //顯示開及光標設置
WriteCommand(0x01); //顯示清屏

}


//////////////////////////////////////////////////////////////////////
//ADC轉換函數(shù)========================================================
void ADconv()
{
unsigned char i;


//時能前初始化====================================================
Di=1;
Di2=1;
Di3=1;
Di4=1;
Di5=1;


CS=1;
_nop_();
CS=0;
Di=1;
Di2=1;
Di3=1;
Di4=1;
Di5=1;
//=================================================================

//第一個下降沿===================================================
CLK=1;
_nop_();
_nop_();
CLK=0;
//=================================================================

//確定通道方式,第二個下降沿===================================
_nop_();
_nop_();
CLK=1;
Di=1;
Di2=1;
Di3=1;
Di4=1;
Di5=1;
_nop_();
_nop_();
CLK=0;
//=================================================================

//第三個下降沿===================================================
_nop_();
_nop_();
CLK=1;
Di=0;
Di2=1;
Di3=1;
Di4=1;
Di5=1;
_nop_();
_nop_();
CLK=0; //AD初始化完成
//=================================================================

//讀取數(shù)據(jù)========================================================
Di=1; //IO變?yōu)檩斎?br /> Di2=1;
Di3=1;
Di4=1;
Di5=1;
CLK=1;
_nop_();
_nop_();
CLK=0;

CLK=1;
CLK=1;
_nop_();
_nop_();
CLK=0;

CLK=1;
//得到一個正常排序的8位數(shù)據(jù)
for(i=8;i>0;i--)
{
data_f<<=1;
data_f2<<=1;
data_f3<<=1;
data_f4<<=1;
data_f5<<=1;

data_f|=Do;
data_f2|=Do2;
data_f3|=Do3;
data_f4|=Do4;
data_f5|=Do5;

CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
}
//==============================
//得到一個反序排列的8位數(shù)據(jù)
for(i=8;i>0;i--)
{
data_c<<=1;
data_c2<<=1;
data_c3<<=1;
data_c4<<=1;
data_c5<<=1;

data_c|=Do;
data_c2|=Do2;
data_c3|=Do3;
data_c4|=Do4;
data_c5|=Do5;

_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
}
//==============================
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
_nop_();
CLK=0;
_nop_();
_nop_();
CLK=1;
_nop_();
CS=1;
_nop_();
_nop_();


}
//===================================================================

//顯示轉換===========================================================
char huanhuan(unsigned char benben)
{
switch(benben)
{
case 0:
return 0;
break;

case 1:
return 1;
break;

case 2:
return 2;
break;

case 3:
return 3;
break;

case 4:
return 4;
break;

case 5:
return 5;
break;

case 6:
return 6;
break;

case 7:
return 7;
break;

case 8:
return 8;
break;

case 9:
return 9;
break;

default:
break;
}
}
//===================================================================

void main()
{
unsigned xianshi=0;
InitLcd();
DelayMs(15);
sprintf(Test1," wo shi tiancai ");//the first line
ShowString(0,Test1);
sprintf(TimeNum,"AD value is ");//the first line
ShowString(1,TimeNum);
while(1)
{
DelayMs(800);
xianshi=data_f;
ADconv();
TimeNum[12]=huanhuan(xianshi/100);
TimeNum[13]=huanhuan(xianshi/10%10);
TimeNum[14]=huanhuan(xianshi%10);
ShowString(1,TimeNum);
}
}



關鍵詞: 0832ADC51測試程

評論


技術專區(qū)

關閉