找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ACS712电流测试完美单片机程序 0到5A量程共阳数码管精度0.01

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:

  1. #include "hader\\main.h"
  2. #include<math.h>
  3. #define uchar unsigned char//宏定义无符号字符型
  4. #define uint unsigned int  //宏定义无符号整型
  5. #define FOSC 11059200L
  6. #define BAUD  9600

  7. #define ADC_POWER   0x80            //ADC 电源控制位
  8. #define ADC_FLAG    0x10            //ADC 转换结束标志位
  9. #define ADC_START   0x08            //ADC 开始转换控制位
  10. #define ADC_SPEEDHH 0x60            //270个时钟周期转换一次

  11. sfr ADC_DATA=0xc6;           //70个时钟周期转换一次
  12. void display(void);         //显示函数
  13. void t_to_dis(uint num);

  14. #define DUAN P2                   //P0口控制段
  15. #define WEI  P1                   //P2口控制位
  16. /********************************************************************
  17.                             初始定义
  18. *********************************************************************/
  19. //数码管显示段码
  20. code uchar seg7code[11]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0XBF};
  21. uchar numb[4];              //定义字符串用于数值转换
  22. uint cnt,times;
  23. uint ad,ad2;
  24. float ad1,ad3;
  25. bit flag,write;        //定时标志位
  26. uint16 idata setcurent;
  27. uchar  idata keystat[3];
  28. uint  adcj[91];
  29. uint adcj2[65];
  30. bit bz=0;
  31. uint js=0;
  32. // 串行中断程序
  33. void initInt(void)
  34. {
  35.         TMOD = 0x01;
  36.         PCON = 0;
  37.         TH0 =(655336-1000)/256;
  38.     TL0 =(655336-1000)%256;
  39.         TR0 = 1;               
  40.     ET0=1;
  41.         EA=1;               
  42. }
  43. //初始化
  44. void initProg(void)
  45. {        
  46.     P2M1=0;
  47.         P2M0=0xff;
  48.         P1M1=0x80;
  49.         P1M0=0x0f;
  50.         P3M1&=0x7f;
  51.         P3M0|=0x80;
  52.         initInt(); //初始化定时器
  53. }
  54. /********************************************************************
  55.                             延时函数
  56. *********************************************************************/
  57. void delay(uint x)//延时程序 0.1秒
  58. {
  59.         uint m,n,s;
  60.         for(m=x;m>0;m--)
  61.         for(n=20;n>0;n--)
  62.         for(s=248;s>0;s--);
  63. }
  64. /********************************************************************
  65.                          AD转换初始化程序
  66. *********************************************************************/
  67. void InitADC()
  68. {
  69.     P1=P1M0|=0xf0;
  70.         P1M1=0x00;
  71.         ADC_DATA=0;        //AD数据寄存器清空
  72.     ADC_CONTR=ADC_POWER|ADC_SPEEDHH|ADC_START;//打开AD电源,转换周期XX
  73.     delay(10);                //延时
  74. }
  75. /********************************************************************
  76.                          AD转换控制程序
  77. *********************************************************************/
  78. uint GetADCResult(uchar px)          //转换输出的数据 (PX为通道口)
  79. {
  80.     uint t;
  81.         ADC_CONTR=ADC_POWER | ADC_SPEEDHH | px | ADC_START;//开始转换
  82.     _nop_();                        //延时一个机器周期
  83.     _nop_();                                                //延时一个机器周期
  84.     _nop_();                                                //延时一个机器周期
  85.     _nop_();                                                //延时一个机器周期
  86.         _nop_();                        //延时一个机器周期
  87.         while (!(ADC_CONTR & ADC_FLAG));//等待转换结束
  88.         ADC_CONTR &= ~ADC_FLAG;       //关闭AD转换
  89.         t=(ADC_DATA<<2)|ADC_LOW2;
  90.         return t;
  91. }                  
  92. /********************************************************************
  93.                             按键扫描
  94. *********************************************************************/
  95. void key_scan(void)
  96. {
  97.   if(key1==0) //功能按键,显示调整和实测值
  98.   {
  99.     if(++keystat[0]>=30)
  100.     {
  101.       keystat[0] = 1;
  102.     }
  103.   }
  104.    else
  105.    if((key1)&&(keystat[0]))
  106.    {
  107.             keystat[0] = 0;
  108.          flag=!flag;
  109.    }
  110.   if(flag==1)
  111.   {
  112.       //增加设定电流值
  113.           if(key2==0) //增加设定电流值
  114.           {
  115.                   if(++keystat[1]>=80)
  116.                   {
  117.                            keystat[1]=1;
  118.                         setcurent=setcurent+1 ;  
  119.                         if(setcurent>500)
  120.                         setcurent=500;
  121.                         write = 1;
  122.                    }                                                  
  123.           }
  124.          else if((key2)&&(keystat[1]))
  125.                  {
  126.                          keystat[1] = 0;
  127.          }

  128.           //减小设定电流值
  129.           if(key3==0) //减小设定电流值
  130.           {
  131.                    if(++keystat[2]>=80)
  132.                    {
  133.                                    keystat[2] = 1;
  134.                                 setcurent = setcurent-1;  
  135.                                 if(setcurent<1)
  136.                                 setcurent=1;
  137.                                 write = 1;
  138.                    }
  139.           }
  140.           else if((key3)&&(keystat[2]))
  141.                    {
  142.                          keystat[2] = 0;
  143.                    }
  144.   }
  145. }

  146. void Selectsort(uint A[],uchar n)
  147. {
  148.      uchar i,j,min;
  149.          uint temp;
  150.      for(i=0;i<n;i++)
  151.      {
  152.           min=i;
  153.           for(j=i+1;j<=n;j++)  /* 从j往前的数据都是排好的,所以从j开始往下找剩下的元素中最小的 */
  154.           {
  155.                if(A[min]>A[j])  /* 把剩下元素中最小的那个放到A[i]中 */
  156.                {
  157.                 temp=A[i];
  158.                 A[i]=A[j];
  159.                 A[j]=temp;
  160.                }
  161.           }
  162.     }  
  163. }
  164. /********************************************************************
  165.                             主函数
  166. *********************************************************************/
  167. void main()
  168. {        
  169.     uint i;
  170.         uchar j,t;
  171.     initProg();
  172.     InitADC();  //AD初始化
  173.         setcurent=IapReadByte(0);
  174.         setcurent=setcurent*100+IapReadByte(1);
  175.         while(1)
  176.         {
  177.               if(flag)                     //显示设定值
  178.                   t_to_dis(setcurent);   //数值变换
  179.                   else           //否则显示实测值
  180.                   t_to_dis(ad2);   //数值变换
  181.                   //if(ad2>=setcurent){OUT=0;} else {OUT=1;}
  182.                   if(ad2>=setcurent){js++;}
  183.                   if(ad2<setcurent){OUT=1;js=0;}
  184.                   if(js>=1000){OUT=0;}else{OUT=1;}
  185.                   if(write==1)
  186.                  {
  187.                     write=0;
  188.                         IapEraseSector(0);
  189.                         IapProgramByte(0,setcurent/100);
  190.                         IapProgramByte(1,setcurent%100);
  191.                   }

  192.             ad=GetADCResult(7);
  193.                 i=ad*10;
  194.                 if(i>=5120&&i<=7020)
  195.                 {
  196.                   adcj[j++]=i;
  197.                 }
  198.                 if(j>90)
  199.                 {
  200.                   j=0;
  201.                   Selectsort(adcj,90);
  202.                   adcj2[t++]=adcj[90];
  203.                   if(t>3)
  204.                    {
  205.                     t=0;
  206.                         Selectsort(adcj2,3);
  207.                     ad1 = 500.0*((adcj2[3]-5120)/10240.0)/0.185;
  208.                         ad1=ad1*0.708*1.35;
  209.                  ad2=abs(ad1);
  210.                   }
  211.                  }
  212.         }
  213. }
  214. /********************************************************************
  215.                             求值函数
  216. *********************************************************************/
  217. void t_to_dis(uint num)
  218. {        
  219.         numb[0]=num/1000;           //显示千位
  220.         numb[1]=num/100%10;                //显示百位
  221.         numb[2]=num/10%10;                    //显示十位
  222.         numb[3]=num%10;             //显示个位
  223. }
  224. /********************************************************************
  225.                            定时器T0中断函数
  226. *********************************************************************/
  227. void timer0(void)interrupt 1  
  228. {         
  229.      TH0=(65536-800)/256;
  230.          TL0=(65536-800)%256;
  231.      cnt++;
  232.      switch(cnt)
  233.          {
  234.       case 1: WEI&=0XF0; DUAN=seg7code[numb[0]]; wei1=1; break; //分十位
  235.           case 2: WEI&=0XF0; DUAN=seg7code[numb[1]]&0x7f; wei2=1; break;//分个位
  236.           case 3: WEI&=0XF0; DUAN=seg7code[numb[2]]; wei3=1; break;//秒十位
  237.           case 4: WEI&=0XF0; DUAN=seg7code[numb[3]]; wei4=1; break; //输出小
  238.           default:  cnt=0;break;
  239.      }
  240.      key_scan();//按键扫描
  241. }
  242. /********************************************************************
  243.                               结束
  244. *********************************************************************/
复制代码

02、电流测试完美程序 -(0到5A量程)共阳无加倍 - 精度0.01 - 加补偿.rar

67.03 KB, 下载次数: 87, 下载积分: 黑币 -5

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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