OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5001|回复: 7

求助A/D和D/A的综合实验

[复制链接]

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
发表于 2018-8-23 10:36:48 | 显示全部楼层 |阅读模式
1金钱
各位大神,请问我下面这个程序有什么问题吗?为什么并没有执行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          
                }
}       

最佳答案

查看完整内容[请看2#楼]

仔细阅读STC的芯片手册,里面有汇编和C语言示便,非常清晰,你必须下功夫看手册,因为51特别STC编程只要把手册看通,对你来说已经不存在障碍,现在你敢紧去看下AD部分,另外你的整个工程除AD部分其它全屏蔽掉,先把这一块调通
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2872
金钱
2872
注册时间
2018-1-24
在线时间
258 小时
发表于 2018-8-23 10:36:49 | 显示全部楼层
machine369 发表于 2018-8-23 11:30
//D/A数模转换
//短接输出电流和led,通过改变输入数据控制led亮度
//灯泡最亮或者灭的时候,led1闪一下 ...

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

使用道具 举报

1

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2872
金钱
2872
注册时间
2018-1-24
在线时间
258 小时
发表于 2018-8-23 10:58:20 | 显示全部楼层
道先你这个是什么芯片,STC的吗,还是其它的,另外端口寄存器,AD寄存器设置正确了没有,仔细查查
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-23 11:22:17 | 显示全部楼层
bebj2009 发表于 2018-8-23 10:58
道先你这个是什么芯片,STC的吗,还是其它的,另外端口寄存器,AD寄存器设置正确了没有,仔细查查

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

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-23 11:26:34 | 显示全部楼层
//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;
        }
}       
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-23 11:30:35 | 显示全部楼层
//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);
                }               
        }
}
回复

使用道具 举报

6

主题

22

帖子

0

精华

初级会员

Rank: 2

积分
68
金钱
68
注册时间
2018-8-21
在线时间
11 小时
 楼主| 发表于 2018-8-24 21:04:37 | 显示全部楼层
bebj2009 发表于 2018-8-23 15:40
仔细阅读STC的芯片手册,里面有汇编和C语言示便,非常清晰,你必须下功夫看手册,因为51特别STC编程只要 ...

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

使用道具 举报

1

主题

231

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2872
金钱
2872
注册时间
2018-1-24
在线时间
258 小时
发表于 2018-8-25 09:36:29 | 显示全部楼层
machine369 发表于 2018-8-24 21:04
谢谢你!看了相关资料感觉这方面的内容更清楚了一些。但代码还是没调试出来。我试了试之前成功了的代码和 ...

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 19:07

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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