标题: 单片机AD7705测电压,显示正常但报警不正常 [打印本页]

作者: jony1122    时间: 2024-1-28 19:58
标题: 单片机AD7705测电压,显示正常但报警不正常
用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


作者: wulin    时间: 2024-1-29 08:49
1.报警函数alarm()没有调用。
2.报警函数写的也不对。
作者: jony1122    时间: 2024-2-1 21:31
wulin 发表于 2024-1-29 08:49
1.报警函数alarm()没有调用。
2.报警函数写的也不对。

感谢老师的提醒,现在OK了。
作者: tt2016    时间: 2024-2-1 21:48
大佬牛比,我看了半天也没看出来,经过提示发现还真是这个问题




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1