找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2189|回复: 7
收起左侧

基于STC15F2K60S2的AD转换程序问题

[复制链接]
ID:619500 发表于 2020-8-15 20:16 | 显示全部楼层 |阅读模式
自己写了段测电压的基于STC15F2K60S2的AD转换。不过看了多遍不知道错在哪。大家帮忙指教下。谢谢!
#include<STC15F2K60S2.H>

#define uint unsigned int

uint a;

void main()
{
        P1ASF=0X08;//选择P1^3做模拟通道
        ADC_CONTR=0X80;//ADC电源打开
        for(a=50000;a>0;a--);
        ADC_CONTR=0XEB;//选择P1^3做模拟通道
        CLK_DIV=0X0;//adrj位置0;
        for(a=50000;a>0;a--);
        while(1)
        {
                if(ADC_CONTR&0X10==0)//如何条件为真,ADC_FLAG已被置0,转换完成
                {               
                        P2=ADC_RES;
                        ADC_RESL<<=6;
                        P3=ADC_RESL;
                        for(a=21000000;a>0;a--);
                        ADC_CONTR=0XEB;//将ADC_FLAG置0,ADC_START置1,以继续转换
                        
                }
        
        }
        
}
回复

使用道具 举报

ID:213173 发表于 2020-8-16 06:44 | 显示全部楼层
  1. #include<STC15F2K60S2.H>

  2. #define uint unsigned int

  3. uint a;

  4. void main()
  5. {
  6.         P1M1 = 0x08;                        //设置P1.3高阻
  7.         P1M0 = 0x00;                        //设置P1.3高阻
  8.         P1ASF= 0x08;                        //选择P1.3做模拟通道
  9.         ADC_CONTR=0x80;                        //打开ADC电源
  10.         for(a=50000;a>0;a--);        //等待电源稳定
  11.         while(1)
  12.         {
  13.                 ADC_CONTR=0x8B;                        //启动转换(速度控制420时钟)1000 1011
  14. //                ADC_CONTR=0XEB;                        //选择P1^3做模拟通道
  15. //                CLK_DIV=0X0;//adrj位置0
  16.                 for(a=10;a>0;a--);                //小延时
  17. //                if(ADC_CONTR&0X10==0)        //如何条件为真,ADC_FLAG已被置0,转换完成
  18.                 while(!(ADC_CONTR & 0x10));//等待ADC转换完成标志置位 1001 1000
  19.                 ADC_CONTR &=~0x10;                        //清除转换完成标志
  20.                 P2=ADC_RES;
  21. //                ADC_RESL<<=6;
  22.                 P3=ADC_RESL<<6;
  23. //                for(a=21000000;a>0;a--);
  24.                 for(a=65535;a>0;a--);        //uint数据范围0~65535
  25. //                ADC_CONTR=0XEB;//将ADC_FLAG置0,ADC_START置1,以继续转换               
  26.         }       
  27. }
复制代码
回复

使用道具 举报

ID:619500 发表于 2020-8-16 22:00 | 显示全部楼层

谢谢你。不过。这代码我复制过去,还是不行。不知道会不会是我电路有问题。我电路是这么接的 ADC.png 有错吗。请指教。谢谢!
回复

使用道具 举报

ID:213173 发表于 2020-8-17 06:46 | 显示全部楼层
qjyvi2 发表于 2020-8-16 22:00
谢谢你。不过。这代码我复制过去,还是不行。不知道会不会是我电路有问题。我电路是这么接的有错吗。请指 ...

STC15系列单片机加电复位后端口默认为准双向模式高电平(部分型号少数特殊功能端口例外)。楼主想高电平驱动LED发光需要将P2和P3.6~3.7设置为推挽模式:
        P2M1 = 0x00;                        //设置P2推挽模式
        P2M0 = 0xff;                        //设置P2推挽模式
        P3M1 = 0x00;                        //设置P3.6~3.7推挽模式
        P3M0 = 0xc0;                        //设置P3.6~3.7推挽模式
楼主用此方法只能显示10位2进制AD转换值,1.3V电压经转换≈0100001010。
回复

使用道具 举报

ID:619500 发表于 2020-8-18 14:38 | 显示全部楼层
wulin 发表于 2020-8-17 06:46
STC15系列单片机加电复位后端口默认为准双向模式高电平(部分型号少数特殊功能端口例外)。楼主想高电平 ...

找了两天,还是没找到哪里错误。有点绝望……。
回复

使用道具 举报

ID:213173 发表于 2020-8-18 19:31 | 显示全部楼层
qjyvi2 发表于 2020-8-18 14:38
找了两天,还是没找到哪里错误。有点绝望……。

按你的意图给你重新写了个ADC转换程序,如果还玩不转只能怀疑你的硬件电路有问题。
  1. /*---------------------------------
  2. 此程序适合STC15W系列单片机
  3. ------------------------------------*/
  4. #include<STC15F2K60S2.H>
  5. #include <intrins.h>
  6. #define uint unsigned int                         //宏定义变量uint为无符号整型数据(0-65535)
  7. #define uchar unsigned char                 //宏定义变量uchar为无符号字符型数据(0-255)
  8. //宏定义ADC的操作命令
  9. #define ADC_POWER   0x80                        //ADC power control dit (宏定义ADC电源控制位)1000 0000
  10. #define ADC_START   0x08                        //ADC start control dit (宏定义ADC启动控制位)0000 1000
  11. #define ADC_FLAG    0x10                        //ADC complete flag (宏定义ADC完成标志位)    0001 0000
  12. #define ADC_SPEEDLL 0x00                        //420 clocks (宏定义540个时钟)速度控制       0000 0000
  13. /*-----------------------------------------------------------------
  14.         1ms延时子程序(11.0592MHz 1T)
  15. ------------------------------------------------------------------*/
  16. void delayms(uint k)
  17. {
  18.         uint i,j;
  19.         for(i=k;i>0;i--)
  20.                 for(j=829;j>0;j--);
  21. }
  22. /*-----------------------------------------------------------------------------
  23.   InitADC 初始化ADC
  24. -----------------------------------------------------------------------------*/
  25. void InitADC()
  26. {
  27.         P1ASF=0x08;                                                //设置P1.3通道端口作为模拟输入
  28.         ADC_RES=0;                                                //清除ADC_RES存储器以前的结果
  29.         ADC_RESL=0;
  30.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;//ADC 开启电源、转换速度 1000 0000
  31.         delayms(1);                                                //上电延时1ms                                                                                       
  32. }
  33. /*----------------------------------------------------------------------------
  34. Get ADC Result(获取ADC结果)
  35. ----------------------------------------------------------------------------*/
  36. uint Read(uchar CHA)                                      //获取ADC结果
  37. {
  38.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//启动转换1000 1011
  39.     _nop_();                        //延时确保正确读到ADC_CONTR寄存器的值
  40.     _nop_();
  41.     _nop_();
  42.     _nop_();
  43.         while(!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成标志置位 1001 1011
  44.         ADC_CONTR &=~ADC_FLAG;                           //清除完成标志
  45.         return(ADC_RES<<2|ADC_RESL);           //返回十位ADC结果
  46. }
  47. void main()
  48. {
  49.         uint temp;
  50.         P0M0 = 0x00;
  51.         P0M1 = 0x00;
  52.         P1M1 = 0x08;//设置P1.3高阻
  53.         P1M0 = 0x00;//设置P1.3高阻
  54.         P2M1 = 0x00;//设置P2推挽模式
  55.         P2M0 = 0xff;//设置P2推挽模式
  56.         P3M1 = 0x00;//设置P3.6~3.7推挽模式
  57.         P3M0 = 0xc0;//设置P3.6~3.7推挽模式
  58.         P4M0 = 0x00;
  59.         P4M1 = 0x00;
  60.         P5M0 = 0x00;
  61.         P5M1 = 0x00;
  62.         P6M0 = 0x00;
  63.         P6M1 = 0x00;
  64.         P7M0 = 0x00;
  65.         P7M1 = 0x00;
  66.         InitADC();
  67.         while(1)
  68.         {
  69.                 temp=Read(3);
  70.                 P2=temp>>2;
  71.                 P3=temp<<6;            
  72.                 delayms(500);
  73.         }        
  74. }
复制代码



评分

参与人数 1黑币 +30 收起 理由
qjyvi2 + 30 很给力!

查看全部评分

回复

使用道具 举报

ID:619500 发表于 2020-8-18 19:47 | 显示全部楼层
wulin 发表于 2020-8-18 19:31
按你的意图给你重新写了个ADC转换程序,如果还玩不转只能怀疑你的硬件电路有问题。

嗯。我买新材料再做做看。非常感谢你!
回复

使用道具 举报

ID:619500 发表于 2020-8-21 20:30 | 显示全部楼层
qjyvi2 发表于 2020-8-18 19:47
嗯。我买新材料再做做看。非常感谢你!

程序和线路都没问题。应该是锡焊的能力太菜了,有地方虚焊假焊。今天面包板到货。我程序运行一次就成功了。万用表测出来的电压是1.35.用AD转换出来是1.327.这应该算是成功了。还是挺开心的。谢谢!
面包.jpg
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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