发 帖  
原厂入驻New
申请华秋企业认证 多层板首单免费打样!
30s提交资料,10分钟通过审核(免费赔付+顺丰包邮)>>立即报名
为什么这个程序并没有执行A/D转换呢?
182 程序 端口 单片机
分享
各位大神,请问我下面这个程序有什么问题吗?为什么并没有执行A/D转换呢?
-------------------------------------------------------------------------------------------------------------------------------
//A/D的值读回来,显示在数码管上,并且赋给D/A,改变LED亮度
#include<reg52.h>//52系列单片机头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;//申明U1锁存器的锁存端
sbit wela=P2^7;//申明U2锁存器的锁存端
sbit wr=P3^6;//定义A/D和D/A的WR端口
sbit adrd=P3^7;//定义A/D的RD端口        
sbit dacs=P3^2;//定义D/A的CS端口
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)            //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)      //显示子函数
{
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;
        wela=0;
        delayms(5);        
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        delayms(5);
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;
        wela=0;
        delayms(5);
}
void main()//主程序
{
        uchar a,A1,A2,A3,adval;
        dula=0;         
        wela=0;         
        while(1)
        {
                wela=1;
                P0=0x7f;                     //开启adcs
                wela=0;
                wr=0;                         //启动A/D转换
                _nop_();
                wr=1;
                for(a=10;a>0;a--)          //TX-1C实验板A/D工作频率较低,所以启动转换后
                                                 //要多留点时间用来转换
                {                                 //把显示部分放这里的原因也是为了延长转
                                                 //换时间
                        display(A1,A2,A3);
                }
                P1=0xff;          //读取P1口之前先给其写全1
                adrd=0;          //A/D读使能
                _nop_();
                adval=P1;       //A/D数据读取赋给P1口
                adrd=1;
                A1=adval/100;
                A2=adval/10%10;
                A3=adval%10;
                wela=1;
                P0=0xff;           //关闭adcs  
                wela=0;
                P0=0;                   //使led开始时亮度为0
                dacs=0;                   //开启dacs
                wr=0;                          
                P0=adval;                   //数据输入
                delayms(50);
                wr=1;
                dacs=1;                //关闭dacs         
                }
}      
0
2019-11-6 04:35:20   评论 分享淘帖 邀请回答

相关问题

10个回答
仔细阅读STC的芯片手册,里面有汇编和C语言示便,非常清晰,你必须下功夫看手册,因为51特别STC编程只要把手册看通,对你来说已经不存在障碍,现在你敢紧去看下AD部分,另外你的整个工程除AD部分其它全屏蔽掉,先把这一块调通
2019-11-6 07:22:45 评论

举报

道先你这个是什么芯片,STC的吗,还是其它的,另外端口寄存器,AD寄存器设置正确了没有,仔细查查
2019-11-6 07:36:33 评论

举报

我的芯片是STC89C52。寄存器应该设置正确了吧,我写这个程序之前写了A/D和D/A分开的两个程序,都运行正确了。就是合起来运行不正确。之前写的A/D,D/A程序我发楼下吧,您能帮我在看看吗?谢谢!
2019-11-6 07:51:09 评论

举报

//A/D模数转换 讲读到了数显示在数码管上
#include<reg52.h>               //52系列单片机头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;                   //申明U1锁存器的锁存端 段选
sbit wela=P2^7;                  //申明U2锁存器的锁存端  位选
sbit adwr=P3^6;                 //定义A/D的WR端口
sbit adrd=P3^7;                 //定义A/D的RD端口
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)                  //i=xms即延时约xms毫秒
                for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)//显示子函数
{
        dula=1;
        P0=table[bai];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7e;
        wela=0;
        delayms(5);       
        dula=1;
        P0=table[shi];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7d;
        wela=0;
        delayms(5);
        dula=1;
        P0=table[ge];
        dula=0;
        P0=0xff;
        wela=1;
        P0=0x7b;
        wela=0;
        delayms(5);
}       
void main()                //主程序
{
        uchar a,A1,A2,A3,adval;
        wela=1;
        P0=0x7f;          //置CSAD为0(最高位),选通CSAD以后不必再管ADCS
        wela=0;
        while(1)
        {
                adwr=0;                //启动A/D转换
                _nop_();
                adwr=1;
                for(a=10;a>0;a--)  //TX-1C实验板A/D工作频率较低,所以启动转换后
                                             //要多留点时间用来转换
                {                             //把显示部分放这里的原因也是为了延长转
                                             //换时间
                        display(A1,A2,A3);
                }
                P1=0xff;                         //读取P1口之前先给其写全1
                adrd=0;                         //A/D读使能
                _nop_();
                adval=P1;                      //A/D数据读取赋给P1口
                adrd=1;
                A1=adval/100;
                A2=adval/10%10;
                A3=adval%10;
        }
}       
2019-11-6 08:10:39 评论

举报

//D/A数模转换
//短接输出电流和led,通过改变输入数据控制led亮度
//灯泡最亮或者灭的时候,led1闪一下
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;                      //申明U1锁存器的锁存端 段选
sbit wela=P2^7;                     //申明U2锁存器的锁存端 位选
sbit dawr=P3^6;                    //定义D/A的WR端口
sbit dacs=P3^2;                    //定义D/A的CS端口
sbit led1=P1^0;               
/*uchar val,flag;*/
void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void main()
{
        uchar val,flag;
        dula=0;
        wela=0;
        dacs=0;
        dawr=0;
        P0=0;
        while(1)
        {
                if(flag==0)
                {
                        val+=5;
                        P0=val;//通过P0口给DA数据口赋值 原理图上P0口语da数据输入口相接
                        if(val==255)
                        {
                                flag=1;
                                led1=0;
                                delayms(100);
                                led1=1;
                        }
                        delayms(50);
                }
                else
                {
                        val-=5;
                        P0=val;//通过P0口给DA数据口赋值
                        if(val==0)
                        {
                                flag=0;
                                //beep=0;
                                led1=0;
                                delayms(100);
                                led1=1;         
                        }
                        delayms(50);
                }               
        }
}
2019-11-6 08:29:41 评论

举报

谢谢你!看了相关资料感觉这方面的内容更清楚了一些。但代码还是没调试出来。我试了试之前成功了的代码和资料给的测试代码,发现单片机都没有反应了。可能是A/D芯片或者作为数据输入的电位器被我弄坏了。。。总之谢谢你!
2019-11-6 08:37:26 评论

举报

怎么判断是没有AD转换成功的?
2019-11-6 10:33:47 评论

举报

怎么判断是没有AD转换成功的?
2019-11-6 10:33:58 评论

举报

怎么判断是没有AD转换成功的?
2019-11-6 10:34:08 评论

举报

只有小组成员才能发言,加入小组>>

909个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /6 下一条

快速回复 返回顶部 返回列表