找回密码
 立即注册

QQ登录

只需一步,快速开始

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

第14章-精密电压表_电流表_显示器_计数器

  [复制链接]
跳转到指定楼层
楼主
51单片机轻松入门—基于STC15W4K系列(C语言版)
李友全
编著 详见:http://www.51hei.com/bbs/dpj-37954-1.html

14章 电压表\电流表\显示器\计数器
通过本模块的学习制作,可以进一步熟悉高精度ADC的运用,单片机 内部DataFlash的读写、动态显示程序的编写(包括小数的显示)以及自 定义的SPI主从机数据通信原理,测试中,本模块可以直接插接到第一章

介绍的单片机实验板“通用计数器/显示器接口”上使用。


1 功能说明与电路原理分析

同一个模块,通过硬件上的简单设置可实现4种不同的功能


K3(P4.2)
K4(P4.3)
模块功能

K1(P3.6)
K2(P3.7)
电压表档位
输入阻抗
0
0
电流表

0
0
2.0480V
2MΩ
0
1
计数器

0
1
20.480V

1
0
显示器

1
0
204.80V
1MΩ

1

1

电压表(默认)

1

1

20.480V(默 认)

① 电压表说明:

使用18位MCP3421A0T-E/CH芯片作ADC,通过软件校准的方式可使整个模块电压测量误差 最大值不大于量程的±0.05%,在电路上,2V档由外部信号直接输入ADC,其它档位使用
1MΩ电阻降压,然后使用MCP6V01T-E/SN 轨到轨自动调零运放作ADC输入电压跟随器,由
于精度要求高,普通运放无法满足要求。

② 电流表说明: 使用0.1Ω/0.5W的电流取样电阻,可测量0~2A范围内的电流,取样出来的电压信号不经过电

压跟随器,直接送入ADC芯片。
③ 通用显示器说明:
外部单片机通过CLK与DAT两条信号线向模块送入数据,模块能显示0~99999范围内整数或小 数值,外部单片机需要一次向模块发送5个字节的数据,第1字节表示模块地址,默认值为0
,在多个模块CLK与DAT并接在一起的情况下,只有与发送地址相符的模块才接收与处理总线
上的数据,第2、3、4字节是需要显示的数据,第2字节是数据高字节,第3字节是数据中间 字节,4字节是数据低字节,第5字节确定需要显示的小数位数,所有字节都是按高位在前, 低位在后的顺序发送,每一位的发送是外部单片机先把数据位放到DAT线上,然后拉低CLK线
,模块内部是在CLK下降沿后读取DAT线上的状态,经测试,模块在22.1184MHz工作频率下外

部单片机数据发送时钟脉冲高电平1uS、低电平5uS条件下工作正常,也就是说发送一组数据 的最短时间需要大约(1 + 5)×8×5 = 240uS,为了提高稳定性,可以适当降低通信时钟频 率(主要是延长脉冲低电平时间),但也不能过低,要求一组数据必须在0.2秒内传送完成

,超过0.2秒,模块自动清除前面已收到的不完整的数据,这样保证了数据传送的可靠性。
④ 计数器说明: 外部脉冲信号通过DAT线送入模块,每产生一个脉冲下降沿,计数器数值加1,超过最大值
99999后从0开始循环,要求外部脉冲信号低电平不能大于0.6V,高电平不能小于2V,高电平 最大值也不能超过40V,模块具有断电自动存储数据的功能,可通过开关将CLK线接GND,上
电瞬间即可将显示的计数值清零。


部分程序预览(完整代码请下载附件): 第14章(电压_电流表_计数器_显示器).rar (821.41 KB, 下载次数: 275)

  1. /*显示程序,用STC15F2K60S2做显示芯片
  2. // 硬件说明:P42   P43                                    P36      P37
  3.                          0            0            电流表               0            0            1.9999V
  4.                          0            1            计数器                   0            1            19.999V
  5.                          1            0            显示器                   1            0            199.99V
  6.                          1            1            电压表                   1            1            999.99V
  7.                        
  8. // 待显示数据由主机传来,定义5个字节的显示代码
  9. // 第一字节是本机的地址码,对本机而言,必须是“0”
  10. // 接下来三字节是要显示的数据(高字节在前,低字节在后)
  11. // 第五个字节是要显示的小数点位置,可能值是0-4,表示显示几位小数
  12. //分别代表:0——不显示 1——十位,2——百位,3——千位        ,4——万位 ,个位后小数点固定不显示
  13.             99999     9999.9   999.99   99.999    9.9999
  14. //接线:P07 P06 P05 P04 P03 P02 P01 P00
  15. //          e    d   h   c   g   a   f   b
  16. //0           0    0   1   0   1   0   0   0   0x28
  17. //1     1    1   1   0   1   1   1   0   0xee
  18. //2     0    0   1   1   0   0   1   0   0x32
  19. //3     1    0   1   0   0   0   1   0   0xa2
  20. //4     1    1   1   0   0   1   0   0   0xe4
  21. //5     1    0   1   0   0   0   0   1   0xa1
  22. //6     0    0   1   0   0   0   0   1   0x21
  23. //7     1    1   1   0   1   0   1   0   0xea
  24. //8     0    0   1   0   0   0   0   0   0x20
  25. //9     1    0   1   0   0   0   0   0   0xa0
  26. //A     0    1   1   0   0   0   0   0         0x60
  27. //b     0    0   1   0   0   1   0   1         0x25
  28. //C     0    0   1   1   1   0   0   1          0x39
  29. //d     0    0   1   0   0   1   1   0          0x26
  30. //E     0    0   1   1   0   0   0   1         0x31
  31. //F     0    1   1   1   0   0   0   1         0x71
  32. //H     1    1   1   1   1   1   1   1         0xff

  33. //显示位接线                P15  P14  P13  P16  P12
  34. //            (高位)1    2    3    4          5(低位)

  35. //P32(INT0)接时钟线,P33(INT1)接数据线*/

  36. #include "STC15F2K60S2.H "                   // 包含STC15F2K60S2单片机寄存器定义文件
  37. #include "UART.H"            
  38. #include <intrins.h>
  39. #include "mcp3421.H"
  40. #include "myfun.h"
  41. #include "PowerDown_save.H"
  42. #define         Hidden         16
  43. #define     Address  0                // 本机地址,不同显示模块修改此数值即可
  44. #define TimeOver 500             // 定义一个超时值(5字节通信),500*2ms=1S,允许最慢2秒传送完一帧数据

  45. sbit         CLK=P3^2;                // 外部输入的时钟端
  46. sbit         DAT=P3^3;                    // 外部输入的数据端

  47. unsigned char code DispCode[]={0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71,0xff};/*/显示代码*/
  48. unsigned char code DispBit[]={0xdf,0xef,0xf7,0xbf,0xfb};         //位码表 (左边最高位)11011111(P1)  11101111(P1)  11110111(P1)  10111111(P1) 11111011(P1)(右边最低位)
  49. unsigned long        DispData=0;                            // 用来显示的值
  50. unsigned char   DispBuf[5]={0,0,0,0,0};        // 显示缓冲区 DispBuf[0]是左边最高位 DispBuf[4]是右边最低位
  51. unsigned char temp0,temp1,temp2,temp3,temp4;    // 最高位 temp0        ,最低位 temp4,5位最大显示99 999,只接收3字节,显示缓冲5字节。   

  52. unsigned char   RecDatCount;                // 接收的数据位数计数器
  53. unsigned char        bdata         RecDat;                // 接收到的数据
  54. sbit        RecDat0=RecDat^0;                // 定义接收数据的末位为RecDat0,这要求RecDat位于bdata空间中       
  55. bit                ReciveOK ;                                // 接收完成标志,为1,说明已接收到完整的5个字节,可进行数据处理了
  56. unsigned char        DotCnt=1;                        // 显示小数位数。
  57. unsigned char   InAddress=0;                // 外部输入地址,确定是否与本机地址相同
  58. bit                StartOverCount;                        // 一旦有接收中断,则置位该位,如果收到40位,则清该位
  59. unsigned int           OverCount;                        // 超时计数器,当有接收中断发生,就让这个计数器开始计数(每个T0中
  60. // 断计数一次,如果这个计数器计到了500(即1秒)仍没有被清除,说明接收有误,由主程序清 RecDatCount       

  61. extern struct POWER_UP Power_up;                 // 计数器变量

  62. // 中断程序用于完成5字节数据接收(1字节地址、3字节长整数、1字节小数位数说明)
  63. void ReciveDate() interrupt 0        // 外部中断0(int0)中断处理程序
  64. {       
  65.         if(StartOverCount==0)  StartOverCount=1;        // 开启溢出计时器
  66.         RecDatCount++;                        // 中断次数(0-40)

  67.         RecDat=RecDat<<1;                    // 主机是先发送高位,后发送低位
  68.         if(DAT)
  69.                 RecDat0=1;
  70.         else       
  71.                 RecDat0=0;
  72.         if(RecDatCount==8)                    // 接收完第一个字节
  73.         {
  74.                 InAddress=RecDat;                // 保存外部输入的地址
  75.         }
  76.         else if(RecDatCount==16)        // 第2个数据,长整数最高字节
  77.         {       
  78.                 if(InAddress==Address)             // 地址相符才处理数据,方便多模块并联使用
  79.                         DispData=RecDat*65536;                
  80.         }
  81.         else if(RecDatCount==24)        //  第3个数据,长整数中间字节
  82.         {       
  83.                 if(InAddress==Address)        // 地址相符才处理数据,方便多模块并联使用
  84.                         DispData=DispData+RecDat*256;
  85.         }        
  86.         else if(RecDatCount==32)        //  第4个数据,长整数最低字节
  87.         {       
  88.                 if(InAddress==Address)        // 地址相符才处理数据,方便多模块并联使用
  89.                         DispData+=RecDat;
  90.         }
  91.         else if(RecDatCount==40)         // 否则就是第5个数据,即小数点显示位数
  92.         {       
  93.                 if(InAddress==Address)        // 地址相符才处理数据,方便多模块并联使用
  94.                         DotCnt=RecDat;       
  95.                 ReciveOK=1;                                // 要求刷新显示器
  96.                 RecDatCount=0;                        // 中断次数(0-40)
  97.                 StartOverCount=0;                // 接收到40个字符,清标志
  98.                 OverCount=0;                        // 清超时计数器
  99.                 RecDat=0;
  100.         }
  101. }

  102. void EX0_Init()     // 外中断0用于数据接收 CLK 输入端口
  103. {
  104.         IT0=1;                        // 外部引脚下降沿触发(CLK时钟信号)
  105.         EX0=1;                        // 外中断int0中断允许
  106.         PX0=1;                        // 将外中断置为高级中断,定时器T0低级中断
  107.         EA=1;                        // 比较器断0电存储只能使用低级中断,无法更改。
  108. }

  109. void EX1_Init()     // 外中断1用于数据接收 DAT 输入端口与计数器脉冲输入口
  110. {
  111.         IT1=1;                // 设置为下降沿触发,用于计数器脉冲输入
  112.         EX1=1;          // 开外部中断1
  113.         PX1=1;                        // 将外中断1置为高级中断,定时器T0低级中断
  114.         EA=1;                    // 开总中断
  115. }

  116. void Timer0_Init()       // 初始化定时器0用于动态显示程序
  117. {
  118.         TMOD &= 0xF0;                       // 设置定时器模式
  119.         TMOD |= 0x01;                       // 设置定时器模式                                                     
  120.         TH0=(65536-4000)/256 ;           // 计数脉冲周期 T=1/F= 1/(22.1184/12)= 0.5425uS
  121.         TL0=(65536-4000)%256 ;           // 4000*0.5425=2.17mS
  122.         TR0=1;                                   // T0开始运行
  123.         ET0=1;                                   // 定时器T0中断允许
  124.     PT0=0;                                   // 将定时器置为低级中断
  125.         EA=1;
  126. }  

  127. // 定时器 T0 用于完成5位数码管论流点亮
  128. void Timer0() interrupt 1        // 定时器T0的中断处理代码
  129. {
  130.         unsigned char temp;                         // 动态显示中间变量
  131.         static unsigned char Count;                // 用于统计当前正显示哪一位(先显示左边最高位)
  132.         //********* 数据接收过程的时间限制 ************
  133.         if(StartOverCount)                        // 如果要求计数的标志是1
  134.                 OverCount++;                        // 计数器加1
  135.         //********* 正式动态显示程序 ******************
  136.         P1|=0x7c;                                // 关断前次显示0111 1100       
  137.         temp=DispBit[Count];         
  138.     P1&=temp;                   // 开启P1位控制
  139.                        
  140.         temp=DispBuf[Count];    // 5位显示缓冲器BCD码               
  141.         P0=DispCode[temp];            // 查字形码表格(0-16)
  142.        
  143.         if(Count<4)                        // 显示小数点(最右端小数点不显示)
  144.         {
  145.                 if(DotCnt==(4-Count))
  146.                 {
  147.                         P0&=0xDF;            // 点亮小数点h位置 1101 1111
  148.                 }       
  149.         }
  150.         Count++;
  151.         if(Count==5) Count=0;
  152.         TH0=(65536-4000)/256 ;          // 计数脉冲周期 T=1/F= 1/(22.1184/12)= 0.5425uS
  153.         TL0=(65536-4000)%256 ;    // 4000*0.5425=2.17mS
  154. }

  155. void long_to_bcd(unsigned long temp)
  156. {
  157.         unsigned char temp0,temp1,temp2,temp3,temp4;    // 最高位 temp0        ,最低位 temp4,5位最大显示99 999,只接收3字节,显示缓冲5字节。
  158.        
  159.         temp%=100000;                // 如果收到的数超过10 0000则仅取小于10 0000的值
  160.         temp4 = temp % 10;                // 获得个位
  161.         temp3 = temp / 10 % 10;           // 获得十位
  162.         temp2 = temp / 100 % 10;          // 获得百位
  163.         temp1 = temp / 1000 % 10;         // 获得千位
  164.         temp0 = temp / 10000 % 10;        // 获得万位                       

  165.         if((temp0==0)&&(DotCnt<4))        // 如果最高位等于0,而显示的小数位数小于4位
  166.                 DispBuf[0]=Hidden;                // 那么最高位应该消隐
  167.         else
  168.                 DispBuf[0]=temp0;                // 否则将这个数送入最高位

  169.         if((temp0==0)&&(temp1==0)&&(DotCnt<3))        // 最高位、次高位同时为0,且小数位数小于3位
  170.                 DispBuf[1]=Hidden;
  171.         else
  172.                 DispBuf[1]=temp1;

  173.         if((temp0==0)&&(temp1==0)&&(temp2==0)&&(DotCnt<2))       
  174.                                 // 最高位、次高位、第三位均为0,且小数位数小于2位时消隐
  175.                 DispBuf[2]=Hidden;
  176.         else
  177.                 DispBuf[2]=temp2;
  178.                                        
  179.         if((temp0==0)&&(temp1==0)&&(temp2==0)&&(temp3==0)&&(DotCnt<1))       
  180.                                 // 最高位、次高位、第三位、第四位均为0,且小数位数小于1位(无)时消隐
  181.                 DispBuf[3]=Hidden;
  182.         else
  183.                 DispBuf[3]=temp3;

  184.         DispBuf[4]=temp4;                      // 最低位直接显示                       
  185. }

  186. void main(void)
  187. {   
  188.         //////////////////////// 电压电流表变量 ///////////////////
  189.         unsigned char        test_data[3]={0x00,0x00,0x00};           // 存放 MCP3421 AD转换结果
  190.         long aa;                                   // 计算 MCP3421电压值的中间变量
  191.         float VIN3421;                           // 计算出来的MCP3421原始电压
  192.         long  V3421;               // 显示时用于将数据扩大1000或10000倍                  
  193.         ///////////////////////////////////////////////////////////
  194.         UART_init();                           // 串口初始化(占用定时器1)9600/22.1184MHz
  195.         printf("串口初始化完毕");
  196.         Timer0_Init();                           // 初始化定时器0用于动态显示程序
  197.        
  198.         ReciveOK=1;                           // 要求刷新显示器
  199.         CLK=1;                                       // 数据接收端口初始化
  200.         DAT=1;

  201.         DispData=0X00;                       // 上电显示0.0000
  202.         DotCnt=4;                  // 上电显示0.0000

  203.         /*************************************************************************
  204.         // 2A电流表,电流取样电阻:0.1Ω/0.5W,
  205.         *************************************************************************/
  206.         if ((P42==0)&&(P43==0))                // 电流表
  207.         {        
  208.                 DotCnt=4;                                // 2V档,保留4位小数,2.0480A        
  209.                 WrToMCP3421(SlaveADDR, 0x9C);           // 1001 1100           18位分辨率
  210.                 delay300ms();        
  211.                 while(1)
  212.                 {
  213.                         aa=test_data[0]<<8;
  214.                         aa=aa+test_data[1];
  215.                         aa=aa<<8;
  216.                         aa=aa+        test_data[2];
  217.                         VIN3421=2.048*aa/131071;                // 得到取样电阻上的电压值
  218.                
  219.                         VIN3421=VIN3421/0.1;                  // I=U/R
  220.                         VIN3421=VIN3421-0.000;                    // 要求零输入零输出
  221.                         if  (VIN3421<0 ) VIN3421=0;                // 数码管没编写显示负数的功能,电脑能直接显示负数
  222.                
  223.                         printf("I= :%.5f     ",VIN3421);
  224.                         // 浮点数转长整数
  225.                         V3421=VIN3421*10000;                 // 2V档,保留4位小数        ,2.0480
  226.                         long_to_bcd(V3421);                                                  
  227.                
  228.                         delay300ms();                            //  延时避免硬接频繁操作
  229.                         delay300ms();
  230.                 }
  231.         }
  232.         /*************************************************************************
  233.         //  计数器,        DAT为计数脉冲输入端,上电瞬间如果CLK=0则清除计数值
  234.         *************************************************************************/
  235.         if ((P42==0)&&(P43==1))                  
  236.         {               
  237.                 DotCnt=0;                         // 计数器不显示小数
  238.                 ReadFLASH();                                  // 读取单片机内部FLASH中保存的重要数据,只需2个时钟。
  239.                 comparator_init();                        // 比较器掉电中断初始化
  240.                 EraseFLASH();                      // 扇区擦除需要21mS
  241.                 EX1_Init();                 // 外部计数端口初始化
  242.                 while(1);                 
  243.         }
  244.         /*************************************************************************
  245.         // 5位通用显示器
  246.         *************************************************************************/
  247.         if ((P42==1)&&(P43==0))                         
  248.         {                         
  249.                 DotCnt =4;              // 上电时显示0.0000  
  250.                 EX0_Init();                            // 外中断0用于数据接收时钟输入端口  
  251.                 while(1)
  252.                 {
  253.                         if(ReciveOK)                // 如果收到了40位数据,将数值转BCD码放入显示缓冲器。
  254.                         {
  255.                                 long_to_bcd(DispData);                               
  256.                                 ReciveOK=0;       
  257.                         }
  258.                         if(OverCount>=TimeOver)                    // 出现了超时错误
  259.                         {
  260.                                 RecDatCount=0;                            // 将接收计数器清零
  261.                                 StartOverCount=0;                    // 接收到40个字符,清除计数标志
  262.                                 OverCount=0;                            // 清超时计数器
  263.                         }
  264.                 }
  265.         }

  266.         /*************************************************************************
  267.         // 18位分辨率电压表
  268.         *************************************************************************/
  269.         if ((P42==1)&&(P43==1))       
  270.         {
  271.                 if ((P36==0)&&(P37==0))    DotCnt=4;            // 2V档,保留4位小数        ,2.0480
  272.                 if ((P36==0)&&(P37==1))    DotCnt=3;            // 20V档,保留3位小数, 20.048
  273.                 if ((P36==1)&&(P37==0))    DotCnt=2;            // 200V档,保留2位小数, 200.48
  274.                 if ((P36==1)&&(P37==1))    DotCnt=2;            // 1000V档,保留2位小数, 999.99
  275.                
  276.                 WrToMCP3421(SlaveADDR, 0x9C);           // 1001 1100           18位分辨率
  277.                 delay300ms();
  278.        
  279.                 while(1)
  280.                 {
  281.                         RdFromMCP3421(SlaveADDR, test_data,3);  //连续读取3个字节数据
  282.                         aa=test_data[0]<<8;
  283.                         aa=aa+test_data[1];
  284.                         aa=aa<<8;
  285.                         aa=aa+        test_data[2];
  286.                         VIN3421=2.048*aa/131071;
  287.                         if ((P36==0)&&(P37==0))                   // 2V档
  288.                         {
  289.                                 VIN3421=VIN3421*1.00;                // 2V档,无衰减,精密校准
  290.                                 printf("2V :%.5f     ",VIN3421);
  291.                                 V3421=VIN3421*10000;               // 2V档,保留4位小数        ,2.0480
  292.                         }
  293.                         if ((P36==0)&&(P37==1))                   // 20V档
  294.                         {
  295.                                 VIN3421=VIN3421*10.00;                // 20V档,10倍衰减+衰减电阻误差补偿
  296.                                 printf("20V :%.4f     ",VIN3421);
  297.                                 V3421=VIN3421*1000;               // 20V档,保留3位小数        ,20.480
  298.                         }
  299.                         if ((P36==1)&&(P37==0))                   // 200V档
  300.                         {
  301.                                 VIN3421=VIN3421*100.00;                // 200V档,100倍衰减+衰减电阻误差补偿
  302.                                 printf("200V :%.3f     ",VIN3421);
  303.                                 V3421=VIN3421*100;                   // 200V档,保留2位小数,204.80
  304.                         }
  305.                         if ((P36==1)&&(P37==1))                   // 1000V档
  306.                         {
  307.                                 VIN3421=VIN3421*1.00;                // 2V档,无衰减,精密校准
  308.                                 printf("2V :%.5f     ",VIN3421);
  309.                                 V3421=VIN3421*10000;               // 2V档,保留4位小数        ,2.0480
  310.                         }
  311.                
  312.                         VIN3421=VIN3421*10.00;          // 20V档,10倍衰减+衰减电阻误差补偿
  313.                                                 //
  314.                         VIN3421=VIN3421-0.000;                // 要求零输入零输出
  315.                         if  (VIN3421<0 ) VIN3421=0;                // 数码管没编写显示负数的功能,电脑能直接显示负数
  316.                
  317.                         printf("20V :%.5f     ",VIN3421);
  318.                         // 浮点数转长整数
  319.                         if ((P36==0)&&(P37==0))   V3421=VIN3421*10000;            // 2V档,保留4位小数        ,2.0480
  320.                         if ((P36==0)&&(P37==1))   V3421=VIN3421*1000;             // 20V档,保留3位小数, 20.048
  321.                         if ((P36==1)&&(P37==0))   V3421=VIN3421*100;            // 200V档,保留2位小数, 200.48
  322.                         if ((P36==1)&&(P37==1))   V3421=VIN3421*100;            // 1000V档,保留2位小数, 999.99

  323.                         long_to_bcd(V3421);                                                  
  324.                
  325.                         delay300ms();                   //  延时避免硬接频繁操作
  326.                         delay300ms();
  327.                 }               
  328.         }                
  329. }

  330. void X1_ISR(void) interrupt 2           // 外部中断1中断函数实现计数功能
  331. {
  332.     Power_up.times++;
  333.         long_to_bcd(Power_up.times);
  334. }  
复制代码


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

使用道具 举报

沙发
ID:140358 发表于 2016-10-4 07:19 来自手机 | 只看该作者
很好!很实用的
回复

使用道具 举报

板凳
ID:84250 发表于 2016-12-30 16:56 | 只看该作者
楼主编程风格严谨,值得我们学习,赞
回复

使用道具 举报

地板
ID:200118 发表于 2017-5-24 23:22 | 只看该作者
下载学习
回复

使用道具 举报

5#
ID:216902 发表于 2017-7-3 20:22 | 只看该作者
学习 MCP3421 ADC
回复

使用道具 举报

6#
ID:421232 发表于 2018-12-12 19:42 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:288930 发表于 2019-1-18 13:57 | 只看该作者
谢谢分享!
回复

使用道具 举报

8#
ID:384252 发表于 2019-4-30 12:00 | 只看该作者
没有用过18位的ADC,不知道这么高精度的ADC读出来的值是否会稳定呢?另外,使用18位ADC采样的电压值,在数码管上显示会跳动吗?
回复

使用道具 举报

9#
ID:717268 发表于 2020-3-27 23:38 | 只看该作者
本人觉得此处使用18位的ADC时,输出显示位数可以扩充到十万为甚至百万位。
回复

使用道具 举报

10#
ID:800180 发表于 2020-7-14 09:02 | 只看该作者
STC15F2K60S2芯片引脚功能有没有
回复

使用道具 举报

11#
ID:501595 发表于 2020-7-26 08:53 来自手机 | 只看该作者
正好需要,下载下来做一个看看
回复

使用道具 举报

12#
ID:895892 发表于 2021-3-24 20:19 | 只看该作者
好教材值得收藏
回复

使用道具 举报

13#
ID:1007039 发表于 2022-3-8 21:32 | 只看该作者
已下载收藏,慢慢学习。
回复

使用道具 举报

14#
ID:968906 发表于 2023-4-6 16:24 | 只看该作者
没有用过18位的ADC,不知道这么高精度的ADC读出来的值是否会稳定呢?另外,使用18位ADC采样的电压值,在数码管上显示会跳动吗?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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