找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机电流电压采集

[复制链接]
跳转到指定楼层
#

想做采集器的来看看吧
全部程序下载:
51单片机电流电压采集.zip (27.11 KB, 下载次数: 176)


源码预览:
  1. # include <reg52.h>
  2. # include <intrins.h>




  3. sbit rs=P0^7;
  4. sbit rw=P0^6;
  5. sbit ep=P0^5;

  6. unsigned char dis1[4];
  7. unsigned char dis2[4];
  8. unsigned char chv=0x00;
  9. unsigned char cha=0x70;
  10. //unsigned char chv;
  11. unsigned int date_v=0;
  12. unsigned int date_a=0;


  13. sbit EOC=P1^0;
  14. sbit CS=P1^4;
  15. sbit IO_CLK=P1^1;
  16. sbit DAT_IN=P1^2;
  17. sbit DAT_OUT=P1^3;


  18. void init() //初始化uart
  19. {
  20.   
  21.   
  22.     TMOD=0X20;  //定时器1定时器方式  工作模式2,可自动重载的8位计数器常把定时/计数器1以模式2作为串行口波特率发生器
  23.         SCON=0XD0; //选择工作模式1使能接收,允许发送,允许接收
  24.     EA=1; //开总中断
  25.         ES=1;  //打开串口中断
  26.         ET1=0;  //打开定时器中断
  27.     PCON=0X00; //8位自动重载,波特率加倍
  28.         TH1=0Xfd;  //用22.1184 mhz波特率
  29.         TL1=0Xfd;
  30.            TR1=1; //打开中时器
  31.    

  32. }


  33. void UART_Putch(unsigned char dat)  //输出一个字符
  34. {
  35.         SBUF=dat; //把数据送给sbuf缓存器中
  36.         while(TI!=1);//发送标志位 TI如果发送了为1,没发送为0,没发送等待,到了退出循环
  37.         TI=0;  //到了,TI清为0
  38. }



  39. unsigned int read_tlc2543(unsigned char M)//M 为十六进制;
  40. {
  41.         unsigned char i,ctrl_word;
  42.         unsigned int ad_result=0;
  43.         DAT_OUT=1;
  44.         ctrl_word=M;
  45.         CS=1;
  46.         IO_CLK=0;
  47.         CS=0;
  48.         for(i=0;i<8;i++)
  49.         {
  50.                 DAT_IN=ctrl_word&0x80;
  51.                 ctrl_word=ctrl_word<<1;
  52.                 IO_CLK=1;
  53.                 ad_result=ad_result<<1;
  54.                 if(DAT_OUT)
  55.                         ad_result=ad_result+1;
  56.                 IO_CLK=0;
  57.         }
  58.         for(i=8;i<12;i++)
  59.         {
  60.                 IO_CLK=1;
  61.                 ad_result=ad_result<<1;
  62.                 if(DAT_OUT)
  63.                         ad_result=ad_result+1;
  64.                 IO_CLK=0;
  65.         }
  66.         CS=1;
  67.         return ad_result;
  68. }




  69. void delay (int m)
  70. {
  71. unsigned char i,j;
  72. for (i=0;i<m;i++)
  73. for (j=0;j<253;j++);
  74. }

  75. bit lcd_bz()
  76. {
  77.   bit result;
  78.   rs=0;           // 读忙信号
  79.   rw=1;
  80.   ep=1;
  81.   _nop_();
  82.   _nop_();
  83.   _nop_();
  84.   _nop_();
  85.   result = (bit)(P2&0x80);
  86.   ep=0;
  87.   return result;
  88. }

  89. void lcd_wcmd (unsigned char cmd)
  90. {
  91.   while (lcd_bz());
  92.   rs=0;
  93.   rw=0;
  94.   ep=0;
  95.   _nop_();
  96.   _nop_();
  97.   P2=cmd ;
  98.   _nop_();
  99.   _nop_();
  100.   _nop_();
  101.   _nop_();
  102.   ep=1;
  103.   _nop_();
  104.   _nop_();
  105.   _nop_();
  106.   _nop_();
  107.   ep=0;
  108. }

  109. void lcd_pos (unsigned char pos)
  110. {
  111.   lcd_wcmd (pos|0x80);
  112. }

  113. void lcd_wdat (unsigned char dat)
  114. {
  115.    while (lcd_bz());
  116.   rs=1;
  117.   rw=0;
  118.   ep=0;
  119.   _nop_();
  120.   _nop_();
  121.   P2=dat ;
  122.   _nop_();
  123.   _nop_();
  124.   _nop_();
  125.   _nop_();
  126.   ep=1;
  127.   _nop_();
  128.   _nop_();
  129.   _nop_();
  130.   _nop_();
  131.   ep=0;
  132. }

  133. void lcd_init ()
  134. {
  135.   lcd_wcmd (0x38);
  136.   delay (1);
  137.   lcd_wcmd (0x0c);
  138.   delay (1);
  139.   lcd_wcmd (0x06);
  140.   delay (1);
  141.   lcd_wcmd (0x01);
  142.   delay (1);
  143. }

  144. void lcd_dis(unsigned char pose,unsigned char *dis)
  145. {
  146. unsigned char i;
  147.   //lcd_init ();
  148.   delay (10);

  149.   lcd_pos (pose);
  150.   for(i=0;i<4;i++)
  151.   {
  152.           lcd_wdat(dis[i]+0x30);
  153.   }


  154. }

  155. void convert(unsigned int  a,unsigned char *dis1)//电流
  156. {
  157.         unsigned int temp,b;
  158.         b=a/1000;
  159.         if(b!=0)
  160.                 dis1[0]=(unsigned char)b;
  161.         else
  162.                 dis1[0]=0;
  163.         temp=a%1000;
  164.         b=temp/100;
  165.         if(b!=0)
  166.                 dis1[1]=(unsigned char)b;
  167.         else
  168.                 dis1[1]=0;
  169.         temp=temp%100;
  170.         b=temp/10;
  171.         if(b!=0)
  172.                 dis1[2]=(unsigned char)b;
  173.         else
  174.                 dis1[2]=0;
  175.         b=temp%10;
  176.         if(b!=0)
  177.                 dis1[3]=(unsigned char)b;
  178.         else
  179.                 dis1[3]=0;
  180. }

  181. void main ()
  182. {
  183.   init();
  184.   lcd_init ();
  185.   read_tlc2543(cha);
  186.   delay(10);
  187.   //read_tlc2543(cha);
  188.   date_v=read_tlc2543(cha);
  189.   convert(date_v,dis2);
  190.   lcd_dis(0x00,dis2);
  191.   while(1){}
  192. }


  193. void init1() interrupt 4  //uart中断 ,4为串口中断
  194. {

  195.         if(RI==1)  //收到数据
  196.         {
  197.              unsigned char m=SBUF; //m为计算机发送给串口的数据,例,open //总体思想是,计算机通知串口,我要发数据了
  198.                    RI=0;   //收到清0
  199.   
  200.                if(m=='1')   //判断m这位数据有无\r
  201.          {
  202.                          read_tlc2543(cha);
  203.                             delay(10);
  204.                    //read_tlc2543(cha);
  205.                            date_a=read_tlc2543(cha);
  206.                            convert(date_a,dis1);
  207.                            lcd_dis(0x00,dis1);
  208.                        UART_Putch(dis1[0]);
  209.                          UART_Putch(dis1[1]);
  210.                          UART_Putch(dis1[2]);
  211.                          UART_Putch(dis1[3]);
  212.                        UART_Putch('\n');  // 换行
  213.            
  214.         }
  215.              else if(m=='2')
  216.             {
  217.                          read_tlc2543(chv);
  218.                             delay(10);
  219.                    //read_tlc2543(cha);
  220.                            date_v=read_tlc2543(chv);
  221.                            convert(date_v,dis2);
  222.                            lcd_dis(0x00,dis2);
  223.                          UART_Putch(dis2[0]);
  224.                          UART_Putch(dis2[1]);
  225.                          UART_Putch(dis2[2]);
  226.                          UART_Putch(dis2[3]);
  227.                          UART_Putch('\n');  // 换行
  228.             }  
  229.                      else
  230.                      {
  231.                             UART_Putch('e');
  232.                                UART_Putch('r');
  233.                               UART_Putch('r');
  234.                                UART_Putch('o');
  235.                               UART_Putch('r');
  236.                                UART_Putch('!');
  237.                             UART_Putch('\r');
  238.                             UART_Putch('\n');
  239.                      }
  240.   
  241.    }
  242. }
复制代码


评分

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

查看全部评分

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

使用道具 举报

5#
ID:56002 发表于 2018-9-15 08:07 | 只看该作者
发个电路图看看
回复

使用道具 举报

地板
ID:256747 发表于 2018-7-20 16:22 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:53978 发表于 2018-5-25 20:06 | 只看该作者
慢慢学习
回复

使用道具 举报

沙发
ID:300719 发表于 2018-4-26 23:37 | 只看该作者
请问这是测直流还是交流呀
回复

使用道具 举报

楼主
ID:136090 发表于 2016-10-16 14:18 | 只看该作者
有谁做出来过没?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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