找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机AD7705测电压,显示正常但报警不正常

[复制链接]
回帖奖励 40 黑币 回复本帖可获得 20 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:1045846 发表于 2024-1-28 19:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用AD7705测试电压,LCD1602上显示的电压值是正常的,但设置的报警条件不起作用。偿试了好久都不成功,各位老师帮忙看看是哪出错了。
谢谢。

  1. #include<reg52.h>
  2. #include"lcd.h"
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define ulong unsigned long
  6. sbit ADC_CS=P1^0;   //AD7705使能端
  7. sbit ADC_CLK=P1^1;  //AD7705外部时钟信号输入端
  8. sbit ADC_DIN=P1^2;   //单片机给AD7705数据输入端
  9. sbit ADC_DOUT=P1^3;  //AD7705模数转换结果输出端
  10. sbit ADC_DRDY=P1^4;  //AD7705逻辑输出端,用于控制结果是否输出

  11. uchar AD_data;                                    //采样值存储
  12. sbit Alarm_led_red =P3^0;                         //超过电压上限红色led报警定义
  13. sbit Alarm_led_green=P3^1;                        //低于电压下限蜂鸣器报警定义

  14. unsigned char ad_alarm;                           //报警值存储单元

  15. uchar date[6]={0,0,0,0,0,0};
  16. uint result0[8]={0,0,0,0,0,0,0,0};
  17. uint result1[8]={0,0,0,0,0,0,0,0};


  18. void Display(uint AD_data);
  19. void Display1(uint AD_data);

  20. void Delay_1ms(uint c)
  21. {
  22.         uchar a,b;
  23.         for(;c>0;c--)
  24.         {
  25.                 for(b=199;b>0;b--)
  26.                 {
  27.                         for(a=1;a>0;a--);
  28.                 }
  29.         }
  30. }

  31. void WriteToReg_ADC(uint byteword )                //发送控制字
  32. {
  33.         uint AD16bit,Token;
  34.         uchar i;
  35.         ADC_CLK=1;
  36.         ADC_CS=0;
  37.         Token=0x80;
  38.         AD16bit=byteword;
  39.         for(i=0;i<8;i++)
  40.         {
  41.                 if(AD16bit&Token)
  42.                         ADC_DIN=1;
  43.                 else
  44.                         ADC_DIN=0;
  45.                 ADC_CLK=1;
  46.                 ADC_CLK=0;
  47.                 ADC_CLK=1;
  48.                 Token=Token>>1;
  49.         }
  50.         ADC_CLK=1;
  51.         ADC_DIN=1;
  52. }

  53. uint ReadADC_16BitValue(uchar channel)        //发送控制字准备读取的通道,接着读取数据
  54. {
  55.         uint AD16bit;
  56.         uchar i;
  57.         WriteToReg_ADC(0x38|channel);
  58.         while(ADC_DRDY==1);
  59.         ADC_CLK=1;
  60.         ADC_CS=0;
  61.         AD16bit=0x00;
  62.         for(i=0;i<16;i++)
  63.         {
  64.                 AD16bit=AD16bit<<1;
  65.                 ADC_CLK=0;
  66.                 if(ADC_DOUT==1)
  67.                         AD16bit=AD16bit|0x01;
  68.                 ADC_CLK=1;
  69.         }
  70.         ADC_CLK=1;
  71.         ADC_DIN=1;
  72.         return(AD16bit);
  73. }

  74. void InitADC()
  75. {
  76.         uchar i;
  77.         ADC_CLK=1;
  78.         ADC_DIN=1;
  79.         ADC_CS=0;
  80.         for(i=0;i<40;i++)                  //自校验
  81.         {
  82.                 ADC_CLK=0;
  83.                 ADC_CLK=1;
  84.         }
  85.         WriteToReg_ADC(0x20);
  86.         WriteToReg_ADC(0x02);
  87.         WriteToReg_ADC(0x10);
  88.         WriteToReg_ADC(0x44);
  89.         WriteToReg_ADC(0x21);
  90.         WriteToReg_ADC(0x02);
  91.         WriteToReg_ADC(0x11);
  92.         WriteToReg_ADC(0x44);
  93.         Delay_1ms(50);
  94. }

  95. void main()
  96. {        
  97.         uchar i;
  98.         ulong sum=0;
  99.         uint result;
  100.         float h;
  101.         lcd1602init();
  102.         InitADC();
  103.         lcd1602writecom(0x80);
  104.         lcd1602writedata('1');
  105.         lcd1602writecom(0x81);
  106.         lcd1602writedata(':');
  107.         lcd1602writecom(0x83);
  108.         lcd1602writedata('.');
  109.         lcd1602writecom(0x87);
  110.         lcd1602writedata('V');
  111.         lcd1602writecom(0xc0);
  112.         lcd1602writedata('2');
  113.         lcd1602writecom(0xc1);
  114.         lcd1602writedata(':');
  115.         lcd1602writecom(0xc3);
  116.         lcd1602writedata('.');
  117.         lcd1602writecom(0xc7);
  118.         lcd1602writedata('V');
  119.         while(1)
  120.         {
  121.                 WriteToReg_ADC(0x20);
  122.                 WriteToReg_ADC(0x02);
  123.                 WriteToReg_ADC(0x10);
  124.                 WriteToReg_ADC(0x44);
  125.                 Delay_1ms(60);
  126.                 for(i=0;i<8;i++)
  127.                 {
  128.                   result0[i]=ReadADC_16BitValue(0);
  129.                   sum=sum+result0[i];
  130.                 }
  131.                 sum=sum/8;
  132.                 result=(uint)sum;
  133.                 sum=0;         
  134.                 h=result;
  135.                 result=h*5000/65536;
  136.                 Display(result);
  137.                 result=0;
  138.         //        Delay_1ms(500);
  139.                
  140.                 WriteToReg_ADC(0x21);
  141.                 WriteToReg_ADC(0x02);
  142.                 WriteToReg_ADC(0x11);
  143.                 WriteToReg_ADC(0x44);
  144.                 Delay_1ms(60);
  145.                  for(i=0;i<8;i++)
  146.                 {
  147.                   result1[i]=ReadADC_16BitValue(1);
  148.                   sum=sum+result1[i];
  149.                 }
  150.                 sum=sum/8;
  151.                 result=(uint)sum;
  152.                 sum=0;               
  153.                 h=result;
  154.                 result=(float)h*5000/65536;
  155.                 Display1(result);
  156.                 result=0;
  157.         //        Delay_1ms(500);               
  158.         }
  159. }

  160. void Display(uint AD_data)
  161. {
  162.         date[4]=AD_data%10000/1000;
  163.         date[2]=AD_data%1000/100;
  164.         date[1]=AD_data%100/10;
  165.         date[0]=AD_data%10;
  166.         lcd1602writecom(0x82);
  167.         lcd1602writedata(48+date[4]);
  168.         lcd1602writecom(0x84);
  169.         lcd1602writedata(48+date[2]);
  170.         lcd1602writecom(0x85);
  171.         lcd1602writedata(48+date[1]);
  172.         lcd1602writecom(0x86);
  173.         lcd1602writedata(48+date[0]);
  174. }

  175. void Display1(uint AD_data)
  176. {
  177.         date[4]=AD_data%10000/1000;        
  178.         date[2]=AD_data%1000/100;
  179.         date[1]=AD_data%100/10;
  180.         date[0]=AD_data%10;
  181.         lcd1602writecom(0xc2);
  182.         lcd1602writedata(48+date[4]);
  183.         lcd1602writecom(0xc4);
  184.         lcd1602writedata(48+date[2]);
  185.         lcd1602writecom(0xc5);
  186.         lcd1602writedata(48+date[1]);
  187.         lcd1602writecom(0xc6);
  188.         lcd1602writedata(48+date[0]);
  189. }

  190. /*****************报警子函数*******************/

  191. void alarm(void)
  192. {
  193. if((AD_data<=2000)&&(AD_data>=1500))      //电压高于1.5V,低于2.0V
  194. {
  195. (Alarm_led_green=0)&(Alarm_led_red=1);  //绿灯亮,蜂鸣器关闭
  196. }
  197. else if((AD_data<=200))               //电压低于0.2V
  198. {
  199. (Alarm_led_red=1)&(Alarm_led_green=1);  //绿灯灭,蜂鸣器关闭
  200. }
  201. else                                          
  202. (Alarm_led_green=1)&(Alarm_led_red=0);        //绿灯灭,蜂鸣器打开        
  203. }
复制代码





AD77051-0.4.rar

49.73 KB, 下载次数: 7

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2024-1-29 08:49 | 只看该作者
1.报警函数alarm()没有调用。
2.报警函数写的也不对。
回复

使用道具 举报

板凳
ID:1045846 发表于 2024-2-1 21:31 | 只看该作者
wulin 发表于 2024-1-29 08:49
1.报警函数alarm()没有调用。
2.报警函数写的也不对。

感谢老师的提醒,现在OK了。
回复

使用道具 举报

地板
ID:1108581 发表于 2024-2-1 21:48 | 只看该作者
大佬牛比,我看了半天也没看出来,经过提示发现还真是这个问题
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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