Proteus仿真ADC0808为何总是无输出?图和程序如下
#include<stdio.h>#include<AT89x52.h>#include<intrins.h>//调用_nop_()延时函数#definead_conP2...
#include <stdio.h>
#include <AT89x52.h>
#include <intrins.h> //调用_nop_()延时函数
#define ad_con P2 //0809控制口
#define addata P0 //0809数据入口
#define disdata P1 //数码管显示
#define uchar unsigned char
#define uint unsigned int
uchar number=0x00; //存放单通道显示时的当前通道数
sbit ALE=P2^3; //0809地址锁存信号
sbit START=P2^4; //启动信号
sbit OE=P2^5; //输出允许通道
sbit KEY1=P3^5; //循环或单路选择按键
sbit KEY2=P3^6; //通道选择按键
sbit EOC=P3^7; //转换结束信号
sbit DISX=disdata^7;//小数点位
sbit FLAG=PSW^0; //循环或单路显示标志位
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//数码管的字段码
uchar code scan_con[4]={0xF1,0xF2,0xF4,0xF8};//4个LED数码管的位选
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//0809的8个通道转换数据缓冲区
uchar data dis[5]={0x00,0x00,0x00,0x00,0x00};//显示缓冲区
/*1秒延时*/
void delay1ms(uint t)
{
uint i,j;
for (i=0;i<t;i++)
for (j=0;j<120;j++);
}
/*检测按键子程序*/
void keytest()
{
if (KEY1==0) //检测循环或单路选择按键是否按下
{
FLAG=!FLAG; //标志位取反,循环,单路显示却换
while(KEY1==0);
}
if(FLAG==1) //单路循环时,检测通道选择按键是否按下
{
if(KEY2==0)
{
number++;
if(number==8)
{
number=0;
}
while(KEY2==0);
}
}
}
/*显示扫描子程序*/
void scan()
{
uchar k,n;
int h;
if(FLAG==0) //循环显示子程序
{
dis[3]=0x00; //通道值清零
for(n=0;n<8;n++) //循环8次
{
dis[2]=ad_data[n]/51; //转换为BCD码
dis[4]=ad_data[n]%51;
dis[4]=dis[4]*10;
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[0]=dis[4]/51;
for(h=0;h<500;h++) //每个通道显示时间控制为1s
{
for(k=0;k<4;k++) //4位LED循环显示
{
disdata=dis_7[dis[k]];
if(k==2)
{
DISX=0;
}
P3=scan_con[k];
delay1ms(1);
P3=0xff;
}
}
dis[3]++; //通道值加1
keytest(); //检测按键
}
}
if(FLAG==1) //单路显示子程序
{
dis[3]=number;
for(k=0;k<4;k++)//4位LED扫描显示
{
disdata=dis_7[dis[k]];
if(k==2)
{
DISX=0;
}
P3=scan_con[k];
delay1ms(1);P3=0xff;
}
keytest(); //检测按键
}
}
/*转换子函数*/
void test()
{
uchar m;
uchar s=0x00; //初始通道位0
ad_con=s;//第一通道地址送0809控制口
for(m=0;m<8;m++)
{
ALE=1;
_nop_();
_nop_();
ALE=0;//锁存通道地址
START=1;
_nop_();
_nop_();
START=0;//启动转换
_nop_();
_nop_();
_nop_();
_nop_();
while(EOC==0);//等待转换结束
OE=1;
delay1ms(1);
ad_data[m]=addata;
OE=0;//读取当前通道转换数据
s++;
ad_con=s;//改变通道地址
}
ad_con=0x00;//通道地址恢复初值
}
/*主函数*/
void main()
{
P0=0xff; //初始化端口
P2=0x00;
P1=0xff;
P3=0xff;
while(1)
{
test(); //测量转换数据
scan();//显示数据
}
} 展开
#include <AT89x52.h>
#include <intrins.h> //调用_nop_()延时函数
#define ad_con P2 //0809控制口
#define addata P0 //0809数据入口
#define disdata P1 //数码管显示
#define uchar unsigned char
#define uint unsigned int
uchar number=0x00; //存放单通道显示时的当前通道数
sbit ALE=P2^3; //0809地址锁存信号
sbit START=P2^4; //启动信号
sbit OE=P2^5; //输出允许通道
sbit KEY1=P3^5; //循环或单路选择按键
sbit KEY2=P3^6; //通道选择按键
sbit EOC=P3^7; //转换结束信号
sbit DISX=disdata^7;//小数点位
sbit FLAG=PSW^0; //循环或单路显示标志位
uchar code dis_7[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff};//数码管的字段码
uchar code scan_con[4]={0xF1,0xF2,0xF4,0xF8};//4个LED数码管的位选
uchar data ad_data[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//0809的8个通道转换数据缓冲区
uchar data dis[5]={0x00,0x00,0x00,0x00,0x00};//显示缓冲区
/*1秒延时*/
void delay1ms(uint t)
{
uint i,j;
for (i=0;i<t;i++)
for (j=0;j<120;j++);
}
/*检测按键子程序*/
void keytest()
{
if (KEY1==0) //检测循环或单路选择按键是否按下
{
FLAG=!FLAG; //标志位取反,循环,单路显示却换
while(KEY1==0);
}
if(FLAG==1) //单路循环时,检测通道选择按键是否按下
{
if(KEY2==0)
{
number++;
if(number==8)
{
number=0;
}
while(KEY2==0);
}
}
}
/*显示扫描子程序*/
void scan()
{
uchar k,n;
int h;
if(FLAG==0) //循环显示子程序
{
dis[3]=0x00; //通道值清零
for(n=0;n<8;n++) //循环8次
{
dis[2]=ad_data[n]/51; //转换为BCD码
dis[4]=ad_data[n]%51;
dis[4]=dis[4]*10;
dis[1]=dis[4]/51;
dis[4]=dis[4]%51;
dis[4]=dis[4]*10;
dis[0]=dis[4]/51;
for(h=0;h<500;h++) //每个通道显示时间控制为1s
{
for(k=0;k<4;k++) //4位LED循环显示
{
disdata=dis_7[dis[k]];
if(k==2)
{
DISX=0;
}
P3=scan_con[k];
delay1ms(1);
P3=0xff;
}
}
dis[3]++; //通道值加1
keytest(); //检测按键
}
}
if(FLAG==1) //单路显示子程序
{
dis[3]=number;
for(k=0;k<4;k++)//4位LED扫描显示
{
disdata=dis_7[dis[k]];
if(k==2)
{
DISX=0;
}
P3=scan_con[k];
delay1ms(1);P3=0xff;
}
keytest(); //检测按键
}
}
/*转换子函数*/
void test()
{
uchar m;
uchar s=0x00; //初始通道位0
ad_con=s;//第一通道地址送0809控制口
for(m=0;m<8;m++)
{
ALE=1;
_nop_();
_nop_();
ALE=0;//锁存通道地址
START=1;
_nop_();
_nop_();
START=0;//启动转换
_nop_();
_nop_();
_nop_();
_nop_();
while(EOC==0);//等待转换结束
OE=1;
delay1ms(1);
ad_data[m]=addata;
OE=0;//读取当前通道转换数据
s++;
ad_con=s;//改变通道地址
}
ad_con=0x00;//通道地址恢复初值
}
/*主函数*/
void main()
{
P0=0xff; //初始化端口
P2=0x00;
P1=0xff;
P3=0xff;
while(1)
{
test(); //测量转换数据
scan();//显示数据
}
} 展开
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询