找回密码
 立即注册

QQ登录

只需一步,快速开始

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

电压电流1602单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:545003 发表于 2019-5-22 19:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


单片机源程序如下:

  1. /**********************BST-V51实验开发板例程************************
  2. *  平台:BST-V51 + Keil U3 + STC89C52
  3. *  名称:AD模块实验

  4. *  晶振:11.0592MHZ
  5. *  说明:免费开源,不提供源代码分析.
  6. ******************************************************************/
  7. /*-----------------------------------------------
  8.   名称:IIC协议 PCF8591ADDA转换                  显示有4个,注意只有2个可以调节电压的
  9.   内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压通过液晶显示,并输出模拟量,用LED亮度渐变指示
  10. ------------------------------------------------*/
  11. #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
  12. #include <intrins.h> //包含NOP空指令函数_nop_();
  13. #include<LCD1602.h>

  14. #define AddWr 0x90   //写数据地址
  15. #define AddRd 0x91   //读数据地址
  16.   #define uint unsigned int
  17.          #define uchar unsigned char
  18. uint num1;   
  19. sbit RST=P2^4;   //时钟 加上后可以关掉DS1302芯片输出
  20. sbit Sda=P2^0;       //定义总线连接端口
  21. sbit Scl=P2^1;
  22. sbit dula=P2^6;
  23. sbit wela=P2^7;

  24. bit ADFlag;          //定义AD采样标志位
  25. unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
  26. data unsigned char  Display[8];//定义临时存放数码管数值
  27. /*------------------------------------------------
  28.                     延时程序
  29. ------------------------------------------------*/
  30. void mDelay(unsigned char j)
  31. {
  32.   unsigned int i;
  33.   for(;j>0;j--)
  34.      {
  35.           for(i=0;i<125;i++)
  36.              {;}
  37.           }
  38.   }
  39. /*------------------------------------------------
  40.                     初始化定时器1
  41. ------------------------------------------------*/
  42. void Init_Timer1(void)
  43. {
  44. TMOD |= 0x10;                             
  45. TH1=0xff;                              /* Init value */
  46. TL1=0x00;
  47. //PT1=1;                   /* 优先级    */
  48. EA=1;                      /* interupt enable */
  49. ET1=1;                     /* enable timer1 interrupt */
  50. TR1=1;  
  51. }
  52. /*------------------------------------------------
  53.                     启动IIC总线
  54. ------------------------------------------------*/
  55.   void Start(void)
  56.   {
  57.    Sda=1;
  58.    _nop_();
  59.    Scl=1;
  60.    _nop_();
  61.    Sda=0;
  62.    _nop_();
  63.    Scl=0;
  64.   }


  65. /*------------------------------------------------
  66.                     停止IIC总线
  67. ------------------------------------------------*/
  68.   void Stop(void)
  69.   {
  70.    Sda=0;
  71.    _nop_();
  72.    Scl=1;
  73.    _nop_();
  74.    Sda=1;
  75.    _nop_();
  76.    Scl=0;
  77.    }


  78. /*------------------------------------------------
  79.                    应答IIC总线
  80. ------------------------------------------------*/
  81.    void Ack(void)
  82.    {
  83.     Sda=0;
  84.         _nop_();
  85.         Scl=1;
  86.         _nop_();
  87.         Scl=0;
  88.         _nop_();
  89.         }


  90. /*------------------------------------------------
  91.                  非应答IIC总线
  92. ------------------------------------------------*/
  93.         void NoAck(void)
  94.         {
  95.          Sda=1;
  96.          _nop_();
  97.          Scl=1;
  98.          _nop_();
  99.          Scl=0;
  100.          _nop_();
  101.          }


  102. /*------------------------------------------------
  103.               发送一个字节
  104. ------------------------------------------------*/
  105.          void Send(unsigned char Data)
  106.          {
  107.           unsigned char BitCounter=8;
  108.           unsigned char temp;

  109.           do
  110.             {
  111.                  temp=Data;
  112.                  Scl=0;
  113.                  _nop_();
  114.                  if((temp&0x80)==0x80)
  115.                     Sda=1;
  116.                  else
  117.                     Sda=0;

  118.                         Scl=1;
  119.                         temp=Data<<1;
  120.                         Data=temp;
  121.                         BitCounter--;
  122.                   }
  123.           while(BitCounter);
  124.               Scl=0;
  125.           }


  126. /*------------------------------------------------
  127.                读入一个字节并返回
  128. ------------------------------------------------*/
  129.           unsigned char Read(void)
  130.           {
  131.            unsigned char temp=0;
  132.            unsigned char temp1=0;
  133.            unsigned char BitCounter=8;

  134.            Sda=1;
  135.            do
  136.              {
  137.                   Scl=0;
  138.       _nop_();
  139.                   Scl=1;
  140.                   _nop_();
  141.                   if(Sda)
  142.                      temp=temp|0x01;
  143.                   else
  144.                      temp=temp&0xfe;

  145.                   if(BitCounter-1)
  146.                      {
  147.                           temp1=temp<<1;
  148.                           temp=temp1;
  149.                           }
  150.                           BitCounter--;
  151.                          }
  152.                 while(BitCounter);
  153.                 return(temp);
  154.           }

  155. /*------------------------------------------------
  156.                     写入DA数模转换值
  157. ------------------------------------------------*/
  158.           void DAC(unsigned char Data)
  159.           {
  160.                    Start();
  161.                    Send(AddWr); //写入芯片地址
  162.                    Ack();
  163.                    Send(0x40);  //写入控制位,使能DAC输出
  164.                    Ack();
  165.                    Send(Data);  //写数据
  166.                    Ack();
  167.                    Stop();
  168.                  
  169.            }

  170. /*------------------------------------------------
  171.                  读取AD模数转换的值,有返回值
  172. ------------------------------------------------*/
  173.           unsigned char ReadADC(unsigned char Chl)
  174.           {
  175.        unsigned char Data;
  176.                    Start();        //写入芯片地址
  177.                    Send(AddWr);
  178.                    Ack();
  179.                    Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
  180.                                   //Chl的值分别为0、1、2、3,分别代表1-4通道
  181.                    Ack();
  182.                    Start();
  183.                    Send(AddRd);    //读入地址
  184.                    Ack();
  185.                    Data=Read();    //读数据
  186.                    Scl=0;
  187.                    NoAck();
  188.                    Stop();
  189.                    return Data;   //返回值
  190.           }

  191. void cmg(void)//数码管锁存函数                   关时钟DS1302
  192. {
  193. dula=1;
  194. P0=0x00;
  195. dula=0;
  196. wela=1;
  197. P0=0x00;
  198. wela=0;
  199. RST=0;                //                关时钟DS1302
  200. }


  201. /*------------------------------------------------
  202.                    主程序
  203. ------------------------------------------------*/
  204.         void main()
  205.         {
  206.          unsigned char num,temp1,temp2;                   //DA数模输出变量
  207.          unsigned char ADtemp,ADtemp0,ADtemp1,ADtemp2;          //定义中间变量
  208.          InitLcd();
  209.      mDelay(20);
  210.      Init_Timer1();
  211.          cmg();                                //数码管锁存
  212.          while(1)
  213.               {
  214.        DAC(num);       //DA输出,可以用LED模拟电压变化
  215.                    num++;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
  216.                    mDelay(20);     //延时用于清晰看出变化
  217.                    if(ADFlag)      //定时采集输入模拟量
  218.            {
  219.                    ADFlag=0;
  220.            ADtemp=ReadADC(0);
  221.                 temp1=ADtemp*50.0/255;
  222.                  temp1=ReadADC(0)*500.0/255;
  223.           TempData[0]=temp1/1000;
  224.                 TempData[1]=temp1/100%100;      //处理0通道电压显示
  225.           TempData[2]=temp1/10%10;                         
  226.                 TempData[3]=temp1%10;                                         
  227.                                                  
  228.     ADtemp0=ReadADC(1);
  229.                 TempData[4]=ReadADC(1)*20/1000%100;  //处理1通道电流显示
  230.           TempData[5]=ReadADC(1)*20/100%10;
  231.           TempData[6]=ReadADC(1)*20/10%10;                         
  232.                        
  233.                                                  
  234.     ADtemp1=ReadADC(2);
  235.                 TempData[7]=ReadADC(2)*200/10000%100;   //处理2通道电压显示
  236.                 TempData[8]=ReadADC(2)*200/1000%10;  
  237.           TempData[9]=ReadADC(2)*200/100%10;                         
  238.                 TempData[10]=ReadADC(2)*200%10;                                         
  239.                        
  240.         ADtemp=ReadADC(2);
  241.                 temp2=ADtemp*50.0/255;
  242.                  temp2=ReadADC(2)*500.0/255;
  243.           TempData[7]=temp2/1000;
  244.                 TempData[8]=temp2/100%100;      //处理0通道电压显示
  245.           TempData[9]=temp2/10%10;                         
  246.                 TempData[10]=temp2%10;               


  247.     ADtemp2=ReadADC(3);       
  248.                 TempData[11]=ReadADC(3)*20/1000%100;//处理3通道电流显示
  249.           TempData[12]=ReadADC(3)*20/100%10;
  250.           TempData[13]=ReadADC(3)*20/10%10;                         
  251.                
  252.     disp();
  253.                    }}}

  254. /*------------------------------------------------
  255.                    定时器中断程序
  256. ------------------------------------------------*/
  257. void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
  258. {

  259. static unsigned int j;
  260. TH1=0xfb;                //重新赋值
  261. TL1=0x00;
  262. j++;
  263. if(j==200)
  264.     {j=0;ADFlag=1;} //定时置位AD采样标志位
  265.          
  266.    // P0=Display[count];//用于动态扫描数码管
  267.    // P2=count;
  268.    // count++;
  269.   // if(count==8)     //表示扫描8个数码管
  270.    //   count=0;


  271. }
复制代码

所有资料51hei提供下载:
电压电流1602.zip (53.4 KB, 下载次数: 35)


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

使用道具 举报

沙发
ID:1 发表于 2019-5-23 03:05 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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