|
本帖最后由 123gkhkhkhkhgg 于 2017-12-29 15:08 編輯
#include<reg52.h>
#include<intrins.h>
#define AddWr 0x90
#define AddRd 0x91
#define uchar unsigned char
#define uint unsigned int
sbit Scl=P1^1;
sbit Sda=P1^2;
bit ADFlag;
uchar code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0 1 2 3 4 5 6 7 8 9
data uchar Display[8];
uchar code wei[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};
void mDelay(uint j)
{
unsigned int x,i;
for(x=j;x>0;x--)
{
for(i=0;i<125;i++)
{;}
}
}
void Init_Timer1(void)
{
TMOD|=0x10;
TH1=0Xff;
TH0=0x00;
EA=1;
ET1=1;
TR1=1;
}
void Start(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Sda=0;
_nop_();
Scl=0;
}
void Stop(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Sda=1;
_nop_();
Scl=0;
}
void Ack(void)
{
Sda=0;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
void NoAck(void)
{
Sda=1;
_nop_();
Scl=1;
_nop_();
Scl=0;
_nop_();
}
void Send(unsigned char Data)
{
unsigned char BitCounter=8;
unsigned char temp;
do
{
temp=Data;
Scl=0;
_nop_();
if((temp&0x80)==0x80)
Sda=1;
else
Sda=0;
Scl=1;
temp=Data<<1;
Data=temp;
BitCounter--;
}
while(BitCounter);
Scl=0;
}
unsigned char Read(void)
{
unsigned char temp=0;
unsigned char temp1=0;
unsigned char BitCounter=8;
Sda=1;
do
{
Scl=0;
_nop_();
Scl=1;
_nop_();
if(Sda)
temp=temp|0x01;
else
temp=temp&0xfe;
if(BitCounter-1)
{
temp1=temp1<<1;
temp=temp1;
}
BitCounter--;
}
while(BitCounter);
return(temp);
}
void DAC(unsigned char Data)
{
Start();
Send(AddWr);
Ack();
Send(0x40);
Ack();
Send(Data);
Ack();
Stop();
}
unsigned char ReadADC()
{
unsigned char Data;
Start();
Send(AddWr);
Ack();
Send(0x40); //選擇通道
Ack();
Start();
Send(AddRd);
Ack();
Data=Read();
Scl=0;
NoAck();
Stop();
return Data;
}
void main()
{
unsigned char num;
uint ADtemp;
int count;
Init_Timer1();
while(1)
{
DAC(num);
num++;
mDelay(20);
if(ADFlag)
{
ADFlag=0;
ADtemp=ReadADC()*2; //0-512對應0-5v
Display[0]=Datatab[ADtemp/100]|0x80; //整數部分和小數點(0x80)
Display[1]=Datatab[(ADtemp/10)%10]; //小數點后第一位
Display[2]=Datatab[ADtemp%10]; //小數點后第二位
Display[3]=0x3e; //v
for(count=0;count<4;count++)
{
P0=Display[count]; //數碼管顯示程序
P2=wei[count];
}
}
}
}
void Time1_isr(void) interrupt 3 using 1
{
static unsigned int j=0;
TH1=0xfb;
TL1=0x00;
j++;
if(j==300)
{
j=0;
ADFlag=1; //采樣
}
}
|
-
捕獲.PNG
(98.97 KB, 下載次數: 84)
下載附件
2017-12-29 15:03 上傳
-
-
程序.zip
2017-12-29 15:05 上傳
點擊文件名下載附件
32.86 KB, 下載次數: 32
-
-
仿真.zip
2017-12-29 15:05 上傳
點擊文件名下載附件
45.76 KB, 下載次數: 23
|