#include<reg52.h>
#include<intrins.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
#define lcd_data P0
uchar table[5];
//uint sda=8000;
//sbit eoc=P1^1;//EOC
//sbit clk=P1^2;//clock
//sbit sdi=P1^3;//data input
//sbit sdo=P1^4;//data ouput
//sbit cs=P1^5;//cs
//sbit lcd_rs=P2^6;
//sbit lcd_rw=P2^5;
//sbit lcd_en=P2^7;
//sbit lcd_psb=P3^2;
//sbit lcd_rst=P3^4;
sbit CS=P1^2;
sbit CLK=P1^3;
sbit SDO=P1^0;
sbit SDI=P1^1;
sbit EOC=P1^4;
//sbit eoc=P3^3;//EOC
//sbit clk=P3^4;//clock
//sbit sdi=P3^5;//data input
//sbit sdo=P3^6;//data ouput
//sbit cs=P3^7;//cs
sbit lcd_rs=P2^7;
sbit lcd_rw=P2^6;
sbit lcd_en=P2^5;
sbit lcd_psb=P2^4;
sbit lcd_rst=P2^3;
void delay_ms(uchar t)
{
uint j,k;
for(k=t;k>0;k--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
lcd_rs=0;
lcd_rw=0;
lcd_en=0;
P0=com;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
void write_dat(uchar date)
{
lcd_rs=1;
lcd_rw=0;
lcd_en=0;
P0=date;
delay_ms(5);
lcd_en=1;
delay_ms(5);
lcd_en=0;
}
void clear()
{
write_com(0x01);
delay_ms(2);
}
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if(X==0)
{X=0x80;}
else if(X==1)
{X=0x90;}
else if(X==2)
{X=0x88;}
else if(X==3)
{X=0x98;}
pos=X+Y;
write_com(pos);
}
void display1(uchar x,uchar y,uchar *disp)
{
lcd_pos(x,y);
while(*disp) //顯示函數
{
write_dat(*disp);
disp=disp+1;
delay_ms(1);
}
}
void lcd_init()
{
lcd_psb=1;
lcd_rst=0;
delay_ms(5);
lcd_rst=1;
delay_ms(5);
write_com(0x30); // 基本操作指令 delay_ms(5);
write_com(0x0c); // 顯示開,關光標 delay_ms(5);
write_com(0x01); // 清除LCD的顯示內容 delay_ms(5);
}
unsigned int A_D(unsigned char CH_i) //CH_i,通道值
{
unsigned int AD_Val; //儲存12位的A/D轉換結果
unsigned char i;
AD_Val=0;
CS=1; //一個轉換周期開始
EOC=0;
CLK=0; //為第一個脈沖作準備
_nop_();
_nop_();
CS=0; //CS置0,片選有效
EOC=1; //EOC開始應設為高電平
CH_i<<=4; //將通道值(D7,D6,D5,D4)移入高四位,轉換通道設置
CH_i|=0x02; //D3,D2,D1,D0=0,0,1,0 ,輸出數據為12位,先輸出低位
for(i=0;i<8;i++) //將A/D轉換方式控制字寫入TLC2543,并讀取低8位轉換結果
{
AD_Val>>=1; //將讀取結果逐位右移(先輸出的是低位)
CLK=0;
_nop_();
if((CH_i&0x80)==0x80)
SDI=1;
else
SDI=0;
CH_i<<=1; //在脈沖上升沿,從高位至低位依次將控制字寫入TLC2543
CLK=1;
_nop_();
if(SDO==1) //在脈沖下降沿,TLC2543輸出數據,寫入AD_Val的第12位
{
AD_Val|=0x800;
}
else
{
AD_Val|=0x000;
}
}
SDI=0; //8個數據流輸入后,SDI端必須保持在一個固定的電平上,指引EOC變高
for(i=8;i<12;i++) //讀取轉換值的第8至第11位
{
AD_Val>>=1;
CLK=0;
_nop_();
CLK=1;
_nop_();
if(SDO==1)
{
AD_Val|=0x800; //在脈沖下降沿,TLC2543輸出數據,寫入AD_Val的第12位
}
else
{
AD_Val|=0x000; //第12位寫 ‘0’
}
}
CLK=0; //在第12個時鐘下降沿來臨時,EOC開始變低,開始對本次采樣的模擬量進行A/D轉換,
_nop_(); //給硬件一點轉換時間
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
CS=1; // 停止轉換,高電平無效
EOC=0;
return AD_Val;
}
void display(uchar x,uchar y,uint temp)
{
uchar i=0;
temp=temp*5000.0/4096;
table[0]=temp/1000;
table[1]=-2;//顯示小數點
table[2]=temp%1000/100;
table[3]=temp%1000%100/10;
table[4]=temp%1000%100%10;
lcd_pos(x,y);
for(i=0;i<5;i++)
{
write_dat('0'+table);
delay_ms(5);
}
}
void main()
{
double AD2=0;
lcd_init();
clear();
//read();
display1(0,0,"電壓值");
;
while(1)
{
AD2=A_D(0x00);//通道0測試
display(0,5,AD2);
delay_ms(10);
}
}
這是和諧別人的,幫忙看下,我測了一下通道0與地,發現有1~2V的電壓,然后我并一只10k的電阻,然發現不亂跳了顯示為0000,但是有模糊重影,但測量是還是亂跳 |