找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1736|回复: 45
打印 上一主题 下一主题
收起左侧

单片机AD采集光敏电阻 Proteus仿真可以但是板子上数值不变?

[复制链接]
楼主
ID:213173 发表于 2023-4-14 10:12 | 显示全部楼层
1234590qwehjm 发表于 2023-4-14 09:39
lcd上显示也是光线最暗时显示的数值

这是最基本的ADC运用,问题多在硬件电路和程序缺陷。上电路图与代码。
回复

使用道具 举报

沙发
ID:213173 发表于 2023-4-14 13:58 | 显示全部楼层

你电路图的ADC输入是P1.4,ADC初始化中P1ASF=0X08;设置的是P1.3用作模拟输入通道,ADC转换中result=ADC_Chang(7);又是P1.7通道。怎么可能得到正确结果?另外还需要把模拟输入口设为高阻模式。否则获取的结果不准。不知你仿真结果是怎么来的?
回复

使用道具 举报

板凳
ID:213173 发表于 2023-4-14 16:39 | 显示全部楼层
1234590qwehjm 发表于 2023-4-14 16:04
那个我还想请问一下,前面的口改过了,我的板子加上光敏电阻后什么都不显示,是什么原因

首先要确保1602能够正常显示字符,然后再输入ADC结果。
回复

使用道具 举报

地板
ID:213173 发表于 2023-4-14 18:10 | 显示全部楼层
1234590qwehjm 发表于 2023-4-14 16:04
那个我还想请问一下,前面的口改过了,我的板子加上光敏电阻后什么都不显示,是什么原因

开ADC中断是蛇足
  1. ADC.C

  2. #include "STC15F2K60S2.h"
  3. #include "ADC.h"
  4. #include "LCD1602.h"

  5. //unsigned int ADC_DATE1,ADC_DATE2;
  6. //bit flag;

  7. void delay(unsigned int sec)   //延时函数
  8. {
  9.         while(sec--);
  10. }

  11. void Init_ADC()                           //ADC初始化
  12. {
  13.         P1M1 = 0x10;                                         //设置P1.4高阻
  14.         P1M0 = 0x00;                                         //设置P1.4高阻
  15.         P1ASF= 0x10;                    //将P1.4口设为ADC转换模拟输入
  16.         ADC_RES=0x00;
  17.         ADC_RESL=0x00;           //清除转换结果寄存器
  18.         ADC_CONTR=ADC_Power|ADC_Speed90;   //打开ADC电源,ADC转换速率90个机器周期
  19.         delay(5000);
  20. //        EA=1;
  21. //        EADC=1;
  22. }

  23. unsigned int ADC_Chang(unsigned char ch)
  24. {
  25. //        unsigned int result;
  26. //        EADC=1;
  27.         ADC_CONTR=ADC_Power|ADC_Speed90|ADC_Start|ch;        //启动AD转换
  28.         delay(4);//小延时
  29.         while(!(ADC_CONTR & ADC_flag));//等待ADC转换完成
  30.         ADC_CONTR &=~ADC_flag;//清ADC转换完成标志
  31.         return ADC_RES<<2|ADC_RESL;        //返回十位ADC结果
  32. }
  33. /*
  34. void interrupt_ADC() interrupt 5
  35. {
  36.         ADC_CONTR&=(~ADC_flag);
  37.         ADC_DATE1=ADC_RES;
  38.         ADC_DATE2=ADC_RESL;
  39.         flag=1;
  40. }*/



  41. ADC.H

  42. #ifndef _ADC_H_
  43. #define _ADC_H_

  44. #include "STC15F2K60S2.h"
  45. #define ADC_Power                 0x80//ADC电源控制位
  46. #define ADC_Speed90         0x60
  47. #define ADC_Speed180         0x40
  48. #define ADC_Speed360         0x20
  49. #define ADC_Speed540         0x00
  50. #define ADC_Start                 0x08//ADC启动控制位
  51. #define ADC_flag                 0x10

  52. void Init_ADC();
  53. void delay(unsigned int sec);
  54. unsigned int ADC_Chang(unsigned char ch);
  55. //void interrupt_ADC();


  56. #endif
复制代码
回复

使用道具 举报

5#
ID:213173 发表于 2023-4-14 21:50 | 显示全部楼层
1234590qwehjm 发表于 2023-4-14 19:19
真的很感谢啊,谢谢

改写一下更易看懂
  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. //宏定义ADC的操作命令
  5. #define ADC_POWER   0x80                        //ADC电源控制位 1000 0000
  6. #define ADC_START   0x08                        //ADC启动控制位 0000 1000
  7. #define ADC_FLAG    0x10                        //ADC完成标志位 0001 0000
  8. #define ADC_SPEEDLL 0x00                        //420时钟       0000 0000

  9. unsigned char str[5]="00.00";
  10. unsigned char aa[]={'L','I','G','H','T',':'};
  11. unsigned int result;

  12. void Init_ADC();
  13. void delay(unsigned int ms);
  14. unsigned int GetADCResult(unsigned char CHA);

  15. void main()
  16. {              
  17.         P0M0 = 0x00;
  18.         P0M1 = 0x00;
  19.         P1M1 = 0x04;   //设置P1.2高阻
  20.         P1M0 = 0x00;
  21.         P2M0 = 0x00;
  22.         P2M1 = 0x00;
  23.         P3M0 = 0x00;
  24.         P3M1 = 0x00;
  25.         P4M0 = 0x00;
  26.         P4M1 = 0x00;
  27.         P5M0 = 0x00;
  28.         P5M1 = 0x00;
  29.         P6M0 = 0x00;
  30.         P6M1 = 0x00;
  31.         P7M0 = 0x00;
  32.         P7M1 = 0x00;
  33.         Init_ADC();               
  34.         while (1)
  35.         {      
  36.                 result=GetADCResult(2);//P1.2
  37. //                result=result*0.0475;
  38.                 result=result*4.75;
  39.                 //显示数据范围00.00~48.64
  40.                 str[0]=result/1000%10+'0';      
  41.                 str[1]=result/100%10+'0';
  42. //                str[2]='.';
  43.                 str[3]=result/10%10+'0';     
  44.                 str[4]=result%10+'0';
  45.                 LCD_Write_String(6,1,str);
  46.                 LCD_Write_String(0,1,aa);      
  47.                 delay(100);//控制刷新周期约100ms
  48.         }
  49. }
  50. /*-------------------------------
  51.   ms延时子程序(11.0592MHz 1T)
  52. -------------------------------*/
  53. void delay(unsigned int ms)
  54. {
  55.         unsigned int i,j;
  56.         for(i=ms;i>0;i--)
  57.                 for(j=1150;j>0;j--);
  58. }
  59. /*-----------------------------------------------------------------------------
  60.   InitADC 初始化ADC
  61. -----------------------------------------------------------------------------*/
  62. void Init_ADC()
  63. {
  64.         P1ASF = 0x04;                    //将P1.2口设为ADC转换模拟输入
  65.         ADC_RES =0;                                                //清除ADC_RES存储器以前的结果
  66.         ADC_RESL=0;
  67.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL;//ADC 开启电源、转换速度 1000 0000
  68.         delay(1);                                                //上电延时1ms                                                                                       
  69. }
  70. /*----------------------------------------------------------------------------
  71. Get ADC Result(获取ADC结果)
  72. ----------------------------------------------------------------------------*/
  73. unsigned int GetADCResult(unsigned char CHA)                                //获取ADC结果
  74. {
  75.         ADC_CONTR=ADC_POWER|ADC_SPEEDLL|CHA|ADC_START;//启动转换1000 1xxx
  76.     _nop_();_nop_();_nop_();_nop_();//小延时
  77.         while(!(ADC_CONTR & ADC_FLAG));        //等待ADC转换完成标志置位 1001 1000
  78.         ADC_CONTR &=~ADC_FLAG;                        //关闭ADC
  79.         return ADC_RES<<2 | ADC_RESL;        //返回十位ADC结果
  80. }
复制代码
回复

使用道具 举报

6#
ID:213173 发表于 2023-4-17 11:03 | 显示全部楼层
本帖最后由 wulin 于 2023-4-17 13:59 编辑
1234590qwehjm 发表于 2023-4-16 12:24
我想问一下,后面想用adc获取的数值控制led亮暗,有没有什么可以学习的程序(pwm不会)

在上述程序的基础上加PWM控制即可,具体控制的占空百分比需要按实际需求调整。
  1. #include <STC15F2K60S2.H>
  2. #include <intrins.h>
  3. #include "LCD1602.h"
  4. //宏定义ADC的操作命令
  5. #define ADC_POWER   0x80                        //ADC电源控制位 1000 0000
  6. #define ADC_START   0x08                        //ADC启动控制位 0000 1000
  7. #define ADC_FLAG    0x10                        //ADC完成标志位 0001 0000
  8. #define ADC_SPEEDLL 0x00                        //420时钟       0000 0000

  9. unsigned char str[5]="00.00";
  10. unsigned char aa[]={'L','I','G','H','T',':'};
  11. unsigned int result;

  12. void Init_ADC();
  13. void delay(unsigned int ms);
  14. unsigned int GetADCResult(unsigned char CHA);
  15. void PWM_Init();

  16. void main()
  17. {              
  18.         P0M0 = 0x00;
  19.         P0M1 = 0x00;
  20.         P1M0 = 0x02;        //设置P1.1推挽模式
  21.         P1M1 = 0x04;        //设置P1.2高阻模式
  22.         P2M0 = 0x00;
  23.         P2M1 = 0x00;
  24.         P3M0 = 0x00;
  25.         P3M1 = 0x00;
  26.         P4M0 = 0x00;
  27.         P4M1 = 0x00;
  28.         P5M0 = 0x00;
  29.         P5M1 = 0x00;
  30.         P6M0 = 0x00;
  31.         P6M1 = 0x00;
  32.         P7M0 = 0x00;
  33.         P7M1 = 0x00;
  34.         Init_ADC();               
  35.         PWM_Init();
  36.         while (1)
  37.         {      
  38.                 result=GetADCResult(2);//P1.2
  39. //                result=result*0.0475;
复制代码
回复

使用道具 举报

7#
ID:213173 发表于 2023-4-17 14:00 | 显示全部楼层

修改了一下百分比计算
回复

使用道具 举报

8#
ID:213173 发表于 2023-4-17 15:32 | 显示全部楼层

代码重新编辑后怎么被阉割了?
回复

使用道具 举报

9#
ID:213173 发表于 2023-4-17 18:21 | 显示全部楼层
1234590qwehjm 发表于 2023-4-17 17:42
大佬,这个灯你是放在p几口的,我程序里面没看见在哪用了是p1.1吗

PWM0默认P1.1口输出,LED调光仿真不了。只能实物验证。改过算法的程序我没有保留,不知什么原因论坛给截了。
回复

使用道具 举报

10#
ID:213173 发表于 2023-4-19 17:16 | 显示全部楼层
1234590qwehjm 发表于 2023-4-18 17:17
我是p1.1接了一个led,然后led接了一个1k电阻,电阻另外一端接了电源

你这LED功率有点大,调试程序的时候用普通LED,调试成功后加一级晶体管功率放大驱动这种大功率LED。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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