找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+ADC0832电压电流检测源程序与Proteus仿真图

  [复制链接]
跳转到指定楼层
楼主
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.H>
  3. #include <math.H>
  4. #include <stdio.h>        
  5. #define     u8                          unsigned char
  6. #define     uchar                  unsigned char
  7. #define     uint                   unsigned int
  8. #define     u16                   unsigned int
  9. #define  uchar unsigned char
  10. #define  uint unsigned int
  11. float dianliu1,dianliu2,dianya;

  12. uchar dianji=0;
  13. sbit LCD_RS = P2^4;   //液晶1602  RS端口   
  14. sbit LCD_RW = P2^5;   //液晶1602  RS端口         
  15. sbit LCD_EP = P2^6;   //液晶1602  EN端口

  16. sbit key1 = P3^0;
  17. sbit key2 = P3^1;

  18. sbit key3 = P1^0;
  19. sbit key4 = P1^1;
  20. sbit led = P1^2;
  21. sbit fmq = P1^4;   //
  22. int dianliumax = 90,dianyamax =30;
  23. uchar code table[] =  {" A1=100A V=13  V"};          //设定速度初始化
  24. uchar code table1[] = {" A0=100A V=22  V"}; //  动态显示初始化
  25. uchar n , i,x,table2[5],table3[5],ge,shi,bai,flag1,key1n,temp;

  26. unsigned char  x=1          ;                                       
  27. void  init();
  28. void display_val(unsigned int zhuan);
  29. unsigned int flag_aa;

  30. /***********延时1MS程序***/
  31. void  delay(uint z)
  32. {  uint x,y;
  33.    for(x=z;x>0;x--)
  34.    for(y=80;y>0;y--);

  35. }



  36. /******液晶写命令************/
  37. void  write_com(uchar com)
  38. {         LCD_RS=0;
  39.   
  40.         P0=com        ;
  41. //        delay(1);
  42.         LCD_EP=1;
  43.         delay(1);
  44.         LCD_EP=0;
  45. }
  46. /*****************/
  47. /********液晶写数据***********/
  48. void  write_data(uchar  date)
  49. {          LCD_RS=1;

  50.         P0=date        ;
  51. //delay(1);
  52.         LCD_EP=1;
  53.         delay(1);
  54.         LCD_EP=0;

  55. }
  56. /*****************************/
  57.   void dis1(int z,unsigned int zhua,int x,int y)
  58. {
  59.          
  60.   table2[0]=zhua/10000+0x30;           //取万位   
  61.   table2[1]=(zhua%10000)/1000+0x30;   //取千位
  62.   table2[2]=(zhua%1000)/100+0x30;     //取百位
  63.   table2[3]=(zhua%100)/10+0x30;       //取十位   
  64.   table2[4]=zhua%10+0x30;                  //取个位
  65.         if(z==1)
  66.   write_com(0x80+x);
  67.         if(z==2)
  68.   write_com(0x80+0x40+x);
  69. //  write_data(table2[0]);
  70.   //  write_data(table2[1]);
  71.    write_data(table2[3]);
  72.          if(y==1)
  73.                 write_data('.');
  74.    write_data(table2[4]);
  75.                  if(y==2)
  76.                 write_data('.');
  77.    write_data(table2[5]);
  78.    write_com(0x80+16);        
  79.                
  80.          
  81. }
  82.   void dis(int z,unsigned int zhua,int x,int y)
  83. {
  84.          
  85.   table2[0]=zhua/10000+0x30;           //取万位   
  86.   table2[1]=(zhua%10000)/1000+0x30;   //取千位
  87.   table2[2]=(zhua%1000)/100+0x30;     //取百位
  88.   table2[3]=(zhua%100)/10+0x30;       //取十位   
  89.   table2[4]=zhua%10+0x30;                  //取个位
  90.         if(z==1)
  91.   write_com(0x80+x);
  92.         if(z==2)
  93.   write_com(0x80+0x40+x);
  94. //  write_data(table2[0]);
  95.   //  write_data(table2[1]);
  96.    write_data(table2[2]);
  97.          if(y==1)
  98.                 write_data('.');
  99.    write_data(table2[3]);
  100.                  if(y==2)
  101.                 write_data('.');
  102.    write_data(table2[4]);
  103.    write_com(0x80+16);        
  104.                
  105.          
  106. }


  107. /*--------------------------液晶初始化-----------------------------*/
  108. void  init_lcd()
  109. {         
  110.                 LCD_EP=0;
  111.        write_com(0x38);
  112.            write_com(0x08);
  113.            write_com(0x06);  
  114.        write_com(0x0c);
  115.            write_com(0x01);
  116. //初始化显示
  117.         write_com(0x80);                     
  118.         for(i=0;i<16;i++)
  119.         {
  120.                 write_data(table[i]);                     
  121.                 delay(3);
  122.         }
  123.         write_com(0x80+0x40);                       
  124.         for(i=0;i<16;i++)
  125.         {
  126.                 write_data(table1[i]);                     
  127.                 delay(3);
  128.         }  

  129. }
  130. void uart(void)                 //串口通信初始化  
  131. {  
  132.     SCON=0x50;                  //串口通信工作方式1  
  133.     REN=1;                      //允许接收  
  134.     TMOD=0x20;                  //定时器1的工作方式2  
  135.     TH1=0xfd,TL1=0xfd;        
  136.     TI=1;                       //这里一定要注意  
  137.     TR1=1;           //打开定时器  

  138. }
  139. void init()
  140. {
  141.                 TMOD=0X10;  //定时器工作方式1
  142.     TH1=0XFF;   //100us定时,装入初值
  143.     TL1=0XA4;
  144.     TR1=1;                //启动T1工作
  145.     ET1=1;                //允许T1中断
  146.           EA =1;            //开总中断
  147. }
  148.   int max(int a,int b,int c)
  149.         {
  150.     return (a>b?a:b)>c?(a>b?a:b):c;
  151.   }
  152.         
  153.         
  154. /***********************************************************************************************************
  155. ADC0832相关函数
  156. ***********************************************************************************************************/
  157. sbit ADCS         =P1^5; //ADC0832 片选
  158. sbit ADCLK  =P1^7; //ADC0832 时钟
  159. sbit ADDI         =P1^6; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  160. sbit ADDO         =P1^6; //ADC0832 数据输出                /*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上


  161. //========================================================================
  162. unsigned int Adc0832(unsigned char channel)
  163. {
  164.         uchar i=0;
  165.         uchar j;
  166.         uint dat=0;
  167.         uchar ndat=0;
  168.         uchar  Vot=0;

  169.         if(channel==0)channel=2;
  170.         if(channel==1)channel=3;
  171.         ADDI=1;
  172.         _nop_();
  173.         _nop_();
  174.         ADCS=0;//拉低CS端
  175.         _nop_();
  176.         _nop_();
  177.         ADCLK=1;//拉高CLK端
  178.         _nop_();
  179.         _nop_();
  180.         ADCLK=0;//拉低CLK端,形成下降沿1
  181.         _nop_();
  182.         _nop_();
  183.         ADCLK=1;//拉高CLK端
  184.         ADDI=channel&0x1;
  185.         _nop_();
  186.         _nop_();
  187.         ADCLK=0;//拉低CLK端,形成下降沿2
  188.         _nop_();
  189.         _nop_();
  190.         ADCLK=1;//拉高CLK端
  191.         ADDI=(channel>>1)&0x1;
  192.         _nop_();
  193.         _nop_();
  194.         ADCLK=0;//拉低CLK端,形成下降沿3
  195.         ADDI=1;//控制命令结束
  196.         _nop_();
  197.         _nop_();
  198.         dat=0;
  199.         for(i=0;i<8;i++)
  200.         {
  201.                 dat|=ADDO;//收数据
  202.                 ADCLK=1;
  203.                 _nop_();
  204.                 _nop_();
  205.                 ADCLK=0;//形成一次时钟脉冲
  206.                 _nop_();
  207.                 _nop_();
  208.                 dat<<=1;
  209.                 if(i==7)dat|=ADDO;
  210.         }
  211.         for(i=0;i<8;i++)
  212.         {
  213.                 j=0;
  214.                 j=j|ADDO;//收数据
  215.                 ADCLK=1;
  216.                 _nop_();
  217.                 _nop_();
  218.                 ADCLK=0;//形成一次时钟脉冲
  219.                 _nop_();
  220.                 _nop_();
  221.                 j=j<<7;
  222.                 ndat=ndat|j;
  223.                 if(i<7)ndat>>=1;
  224.         }
  225.         ADCS=1;//拉低CS端
  226.         ADCLK=0;//拉低CLK端
  227.         ADDO=1;//拉高数据端,回到初始状态
  228.         dat<<=8;
  229.         dat|=ndat;

  230.         return(dat);            //return ad data
  231. }
  232. /***********************************************************************************************************
  233. ADC0832相关函数
  234. ***********************************************************************************************************/
  235. sbit ADCS2         =P3^7; //ADC0832 片选
  236. sbit ADCLK2  =P3^6; //ADC0832 时钟
  237. sbit ADDI2         =P3^5; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  238. sbit ADDO2         =P3^5; //ADC0832 数据输出                /*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上


  239. //========================================================================
  240. unsigned int Adc08322(unsigned char channel)
  241. {
  242.         uchar i=0;
  243.         uchar j;
  244.         uint dat=0;
  245.         uchar ndat=0;
  246.         uchar  Vot=0;

  247.         if(channel==0)channel=2;
  248.         if(channel==1)channel=3;
  249.         ADDI2=1;
  250.         _nop_();
  251.         _nop_();
  252.         ADCS2=0;//拉低CS端
  253.         _nop_();
  254.         _nop_();
  255.         ADCLK2=1;//拉高CLK端
  256.         _nop_();
  257.         _nop_();
  258.         ADCLK2=0;//拉低CLK端,形成下降沿1
  259.         _nop_();
  260.         _nop_();
  261.         ADCLK2=1;//拉高CLK端
  262.         ADDI2=channel&0x1;
  263.         _nop_();
  264.         _nop_();
  265.         ADCLK2=0;//拉低CLK端,形成下降沿2
  266.         _nop_();
  267.         _nop_();
  268.         ADCLK2=1;//拉高CLK端
  269.         ADDI2=(channel>>1)&0x1;
  270.         _nop_();
  271.         _nop_();
  272.         ADCLK2=0;//拉低CLK端,形成下降沿3
  273.         ADDI2=1;//控制命令结束
  274.         _nop_();
  275.         _nop_();
  276.         dat=0;
  277.         for(i=0;i<8;i++)
  278.         {
  279.                 dat|=ADDO2;//收数据
  280.                 ADCLK2=1;
  281.                 _nop_();
  282.                 _nop_();
  283.                 ADCLK2=0;//形成一次时钟脉冲
  284.                 _nop_();
  285.                 _nop_();
  286.                 dat<<=1;
  287.                 if(i==7)dat|=ADDO2;
  288.         }
  289.         for(i=0;i<8;i++)
  290.         {
  291.                 j=0;
  292.                 j=j|ADDO2;//收数据
  293.                 ADCLK2=1;
  294.                 _nop_();
  295.                 _nop_();
  296.                 ADCLK2=0;//形成一次时钟脉冲
  297.                 _nop_();
  298.                 _nop_();
  299.                 j=j<<7;
  300.                 ndat=ndat|j;
  301.                 if(i<7)ndat>>=1;
  302.         }
  303.         ADCS2=1;//拉低CS端
  304.         ADCLK2=0;//拉低CLK端
  305.         ADDO2=1;//拉高数据端,回到初始状态
  306.         dat<<=8;
  307.         dat|=ndat;

  308.         return(dat);            //return ad data
  309. }

  310. void key()
  311. {
  312.         if(key1 == 0)
  313.         {
  314.                 delay(50);
  315.                 dianliumax ++;
  316.                 if( dianliumax >999)
  317.                         dianliumax = 999;
  318.         }
  319.                 if(key2 == 0)
  320.         {
  321.                 delay(50);
  322.                 dianliumax --;
  323.                 if( dianliumax < 1)
  324.                         dianliumax = 1;
  325.         }
  326.         
  327. ……………………

  328. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

Keil代码与Proteus仿真下载:
电压电流检测仿真.7z (71.91 KB, 下载次数: 283)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:858367 发表于 2021-5-29 07:54 | 只看该作者
师傅,是否支持交流电检测?
回复

使用道具 举报

板凳
ID:960452 发表于 2021-9-17 11:02 | 只看该作者
这几个文件 是安装Keil5才有的

Image_20210917110106.png (3.16 KB, 下载次数: 82)

Image_20210917110106.png
回复

使用道具 举报

地板
ID:262073 发表于 2022-6-27 17:13 | 只看该作者
take a look
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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