芯片操作步骤:
// 1 步骤S0:CS=0、WR=0、RD=1(由CPLD发出旗子暗记哀求ADC0804开始进 行仿照/数字旗子暗记的转换)。
// 2 步骤S1:CS=1、WR=1、RD=1(ADC0804进行转换动作,转换完毕后INTR 将高电位降至低电位,而转换韶光>100us)。
// 3 步骤S2:CS=0、WR=1、RD=0(由CPLD发出旗子暗记以读取ADC0804的转 换资料)。
// 4 步骤S3:CS=1、WR=1、RD=1(由CPLD读取DB0~DB7上的数字转换资 料)。
仿真图:用的是我自己做的一个51单片机开拓板 图纸比较大,截图可能看不清,须要的话可以私信联系我。
程序:
源代码:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P3^5;
sbit adrd=P2^7;
sbit adwr=P3^3;
sbit P23=P2^3;
sbit dsrst=P3^6;
unsigned char code smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,
0x7c,0x39,0x5e,0x79,0x71,0x00};
unsigned char code smg_we[]={0x08,0x18,0x28,0x38,0x48,0x58,0x68,0x78};
uchar table1[3];
uchar advalue;
//
//延时函数,在12MHz 的晶振频率下
//大约50us 的延时
//
void delay_50us(uint t)
{ uchar j; for(;t>0;t--) for(j=19;j>0;j--); }
//
//延时函数,在12MHz 的晶振频率下//大约50ms 的延时
//
void delay_50ms(uint t)
{
uint j;
for(;t>0;t--)
for(j=6245;j>0;j--);
}
void main()
{
uchar j,k;
uchar i,l;
P23=1;
P1=0x00;
P23=1;
adcs=0;
while(1)
{
dsrst=0; //禁止实时时钟
P23=0; //禁止数码管
adcs=0; adwr=0; delay_50us(20); adwr=1; delay_50us(20); adrd=0; delay_50us(20); P1=0xff; // 开释P1
advalue=P1; //从P1 中读取数据
delay_50us(20); adrd=1; //禁止ADC 数据传输,防止影响数码管显示
adcs=1;
j=advalue/100; // 处理ADC 的数据,准备显示
k=advalue%100;
table1[2]=j;
j=k/10;
table1[1]=j;
j=k%10;
table1[0]=j;
P1=0; // 将P1 拉低准备显示
delay_50us(10);
P23=1;
for(l=0;l<20;l++) //在数码管上显示读取到的数据
{
for(i=0;i<3;i++)
{
P1=smg_du[table1[i]];
P2=smg_we[i];
delay_50us(100);
P1=0; //这句不加PROTUES显示不正常!
!
}
P23=0;
}
}
}
仿真结果: 通过调节ADC0804外部接的滑动变阻器,不同的电压,数码显示不同的数值。