新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 51單片機(jī)驅(qū)動(dòng)ADC0832模數(shù)轉(zhuǎn)換程序-lcd1602顯示

51單片機(jī)驅(qū)動(dòng)ADC0832模數(shù)轉(zhuǎn)換程序-lcd1602顯示

作者: 時(shí)間:2016-12-02 來源:網(wǎng)絡(luò) 收藏
/*這個(gè)芯應(yīng)用不多*/

#include
#define uchar unsigned char
#define uint unsigned int
uchar Chan0Value,Chan1Value;
sbit RS=P1^0; //1602各控制腳
sbit RW=P1^1;
sbit EN=P1^2;
sbit Cs0832= P2^0; //0832各控制腳
sbit Clk0832= P3^6;
sbit Di0832= P3^7;
sbit Do0832= P3^7;

本文引用地址:http://m.butianyuan.cn/article/201612/324680.htm

void delay1ms(unsigned int ms)//延時(shí)1毫秒(不夠精確的)
{
int i,j;
for(i=0;i for(j=0;j<100;j++);
}

/**********************************ADC0832********************************/
uchar GetValue0832(uchar Channel) //獲取數(shù)值返回。入口:通道(0或1)。出口:數(shù)值。
{
uchar i,Dat1=0,Dat2=0;
Clk0832=0;
Di0832=1;
Cs0832=0;
Clk0832=1;
Clk0832=0; //第一脈沖,開始位
Di0832=1;
Clk0832=1;
Clk0832=0; //第二脈沖,模式選擇
Di0832=Channel;//通道選擇,0或1
Clk0832=1;
Clk0832=0; //第三脈沖,通道選擇
Di0832=1; //釋放輸入線
for(i=0;i<8;i++) //從高到低取一次數(shù)
{
Clk0832=1; //下降沿有效
Clk0832=0;
if(Do0832) Dat1|=0x80>>i;
}
for(i=0;i<8;i++) //從低到高取一次數(shù)
{
if(Do0832) Dat2|=0x01< Clk0832=1; //下降沿有效
Clk0832=0;
}
Cs0832=1;
Di0832=1;
Clk0832=1; //數(shù)據(jù)讀取完成,釋放所有數(shù)據(jù)線
if(Dat1==Dat2)
return Dat1; //校驗(yàn)兩次數(shù)相等,輸出
}
/*本程序與其他一般程序最大的不同就是要讀兩次
一次從最高位到最低位,一次從最低位到最高位,
兩次所讀值相等即為正常,可以輸出*/
/******************************LCD1602**************************************/
/*************************lcd1602程序**************************/

void wr_com(unsigned char com)//寫指令//
{ delay1ms(1);
RS=0;
RW=0;
EN=0;
P0=com;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void wr_dat(unsigned char dat)//寫數(shù)據(jù)//
{ delay1ms(1);
RS=1;
RW=0;
EN=0;
P0=dat;
delay1ms(1);
EN=1;
delay1ms(1);
EN=0;
}
void lcd_init()//初始化設(shè)置//
{
delay1ms(15);
wr_com(0x38);delay1ms(5);
wr_com(0x80);delay1ms(5);
wr_com(0x01);delay1ms(5);
wr_com(0x06);delay1ms(5);
wr_com(0x0c);delay1ms(5);
}
void writevalue(uchar add,uchar dat)
{
wr_com(0x80+add);
wr_dat(dat);
}
void zifuchuan(uchar *ch)
{
while(*ch!=0)
wr_dat(*ch++);
delay1ms(20);
}
void main(void)
{
lcd_init();
while(1)
{
Chan0Value=GetValue0832(0);
delay1ms(100);
Chan1Value=GetValue0832(1);

wr_com(0x80);
zifuchuan("Chanal 0:");
writevalue(10,Chan0Value/100+0x30);
writevalue(11,Chan0Value%100/10+0x30);
writevalue(12,Chan0Value%100%10+0x30);

wr_com(0x80+0x40);
zifuchuan("Chanal 1:");
writevalue(0x40+10,Chan1Value/100+0x30);
writevalue(0x40+11,Chan1Value%100/10+0x30);
writevalue(0x40+12,Chan1Value%100%10+0x30);
delay1ms(1000);
}
}
/*此程序只為調(diào) 通ADC0832,沒有對電壓值進(jìn)行轉(zhuǎn)換
要想得到準(zhǔn)確電壓值,請把Chan0Value和Chan1Value
的值乘以5再除以255即可。當(dāng)某一通道沒有輸入而
懸空時(shí),有可能會顯示256的中間值128,這是干擾,可
以不理會*/



評論


技術(shù)專區(qū)

關(guān)閉