找回密码
 立即注册

QQ登录

只需一步,快速开始

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

ADC-使用外部TL431基准计算外部电压 单片机程序

[复制链接]
跳转到指定楼层
楼主
ID:516397 发表于 2019-11-6 13:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. ******************************************/

  2. #define MAIN_Fosc                22118400L        //定义主时钟

  3. #include        "STC15Fxxxx.H"


  4. /***********************************************************/

  5. #define DIS_DOT                0x20
  6. #define DIS_BLACK        0x10
  7. #define DIS_                0x11

  8. #define P1n_pure_input(bitn)                P1M1 |=  (bitn),        P1M0 &= ~(bitn)

  9. /****************************** 用户定义宏 ***********************************/

  10.         #define        Cal_MODE         0        //每次测量只读1次ADC. 分辨率0.01V
  11. //        #define        Cal_MODE         1        //每次测量连续读16次ADC 再平均计算. 分辨率0.01V

  12. #define        Timer0_Reload        (65536UL -(MAIN_Fosc / 1000))                //Timer 0 中断频率, 1000次/秒

  13. /*****************************************************************************/






  14. /*************        本地常量声明        **************/
  15. u8 code t_display[]={                                                //标准字库
  16. //         0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
  17.         0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
  18. //black         -     H    J         K          L           N        o   P         U     t    G    Q    r   M    y
  19.         0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
  20.         0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};        //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1

  21. u8 code T_COM[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};                //位码


  22. /*************        IO口定义        **************/
  23. sbit        P_HC595_SER   = P4^0;        //pin 14        SER                data input
  24. sbit        P_HC595_RCLK  = P5^4;        //pin 12        RCLk        store (latch) clock
  25. sbit        P_HC595_SRCLK = P4^3;        //pin 11        SRCLK        Shift data clock


  26. /*************        本地变量声明        **************/

  27. u8         LED8[8];                //显示缓冲
  28. u8        display_index;        //显示位索引
  29. bit        B_1ms;                        //1ms标志

  30. u16        msecond;

  31. u16        Bandgap;

  32. u16        Get_ADC10bitResult(u8 channel);        //channel = 0~7






  33. /**********************************************/
  34. void main(void)
  35. {
  36.         u8        i;
  37.         u16        j;

  38.         P0M1 = 0;        P0M0 = 0;        //设置为准双向口
  39.         P1M1 = 0;        P1M0 = 0;        //设置为准双向口
  40.         P2M1 = 0;        P2M0 = 0;        //设置为准双向口
  41.         P3M1 = 0;        P3M0 = 0;        //设置为准双向口
  42.         P4M1 = 0;        P4M0 = 0;        //设置为准双向口
  43.         P5M1 = 0;        P5M0 = 0;        //设置为准双向口
  44.         P6M1 = 0;        P6M0 = 0;        //设置为准双向口
  45.         P7M1 = 0;        P7M0 = 0;        //设置为准双向口
  46.         
  47.         display_index = 0;
  48.         P1ASF = (1<<2) + (1<<3);        //P1.2 P1.3做ADC
  49.         P1M1 |= (0xc0);        P1M0 &= ~(0xc0);        //P1.2 P1.3设置成高阻
  50.         ADC_CONTR = 0xE0;                        //90T, ADC power on
  51.         
  52.         Timer0_1T();
  53.         Timer0_AsTimer();
  54.         Timer0_16bitAutoReload();
  55.         Timer0_Load(Timer0_Reload);
  56.         Timer0_InterruptEnable();
  57.         Timer0_Run();
  58.         EA = 1;                                                //打开总中断
  59.         
  60.         for(i=0; i<8; i++)        LED8[i] = 0x10;        //上电消隐

  61.         
  62.         while(1)
  63.         {
  64.                 if(B_1ms)        //1ms到
  65.                 {
  66.                         B_1ms = 0;
  67.                         if(++msecond >= 300)        //300ms到
  68.                         {
  69.                                 msecond = 0;

  70.                         #if (Cal_MODE == 0)
  71.                         //=================== 只读1次ADC, 10bit ADC. 分辨率0.01V ===============================
  72.                                 Get_ADC10bitResult(2);                                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
  73.                                 Bandgap = Get_ADC10bitResult(2);        //读外部基准TL431对应的ADC
  74.                                 Get_ADC10bitResult(3);                                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
  75.                                 j = Get_ADC10bitResult(3);                        //读外部电压ADC
  76.                                 j = (u16)((u32)j * 250 / Bandgap);        //计算外部电压, TL431电压为2.50V, 测电压分辨率0.01V
  77.                         #endif
  78.                         //==========================================================================

  79.                         //===== 连续读16次ADC 再平均计算. 分辨率0.01V =========
  80.                         #if (Cal_MODE == 1)
  81.                                 Get_ADC10bitResult(2);                                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
  82.                                 for(j=0, i=0; i<16; i++)
  83.                                 {
  84.                                         j += Get_ADC10bitResult(2);                //读外部基准TL431对应的ADC
  85.                                 }
  86.                                 Bandgap = j >> 4;        //16次平均

  87.                                 Get_ADC10bitResult(3);                                //通道改变, 先读一次并丢弃结果, 让内部的采样电容的电压等于输入值.
  88.                                 for(j=0, i=0; i<16; i++)
  89.                                 {
  90.                                         j += Get_ADC10bitResult(3);                //读外部电压ADC
  91.                                 }
  92.                                 j = j >> 4;        //16次平均
  93.                                 j = (u16)((u32)j * 250 / Bandgap);        //计算外部电压, TL431电压为2.50V, 测电压分辨率0.01V
  94.                         #endif
  95.                         //==========================================================================
  96.                
  97.                                 LED8[5] = j / 100 + DIS_DOT;        //显示外部电压值
  98.                                 LED8[6] = (j % 100) / 10;
  99.                                 LED8[7] = j % 10;

  100.                         //        j = Bandgap;
  101.                         //        LED8[0] = j / 1000;                //显示Bandgap ADC值
  102.                         //        LED8[1] = (j % 1000) / 100;
  103.                         //        LED8[2] = (j % 100) / 10;
  104.                         //        LED8[3] = j % 10;
  105.                
  106.                         }
  107.                 }
  108.         }
  109. }
  110. /**********************************************/

  111. //========================================================================
  112. // 函数: u16        Get_ADC10bitResult(u8 channel)
  113. // 描述: 查询法读一次ADC结果.
  114. // 参数: channel: 选择要转换的ADC.
  115. // 返回: 10位ADC结果.
  116. // 版本: V1.0, 2012-10-22
  117. //========================================================================
  118. u16        Get_ADC10bitResult(u8 channel)        //channel = 0~7
  119. {
  120.         ADC_RES = 0;
  121.         ADC_RESL = 0;

  122.         ADC_CONTR = (ADC_CONTR & 0xe0) | 0x08 | channel;         //start the ADC
  123.         NOP(4);

  124.         while((ADC_CONTR & 0x10) == 0)        ;        //wait for ADC finish
  125.         ADC_CONTR &= ~0x10;                //清除ADC结束标志
  126.         return        (((u16)ADC_RES << 2) | (ADC_RESL & 3));
  127. }


  128. /**************** 向HC595发送一个字节函数 ******************/
  129. void Send_595(u8 dat)
  130. {               
  131.         u8        i;
  132.         for(i=0; i<8; i++)
  133.         {
  134.                 dat <<= 1;
  135.                 P_HC595_SER   = CY;
  136.                 P_HC595_SRCLK = 1;
  137.                 P_HC595_SRCLK = 0;
  138.         }
  139. }
复制代码

ADC-使用外部TL431基准计算外部电压.zip

58.51 KB, 下载次数: 33, 下载积分: 黑币 -5

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

使用道具 举报

沙发
ID:98875 发表于 2019-12-5 14:08 | 只看该作者
通道2和通道3的硬件怎么连?能给个参考图吗?谢谢!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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