找回密码
 注册

QQ登录

只需一步,快速开始

搜索

c8051f040单片机做一个PID恒压控制的功能

[复制链接]
eng 发表于 2021-6-22 01:23:26 | 显示全部楼层 |阅读模式
  1. 12位ADC模拟量输入配设置
  2. void ADC0_Init (void) //
  3.     {
  4.      char SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page

  5.      SFRPAGE = ADC0_PAGE;

  6.      ADC0CN = 0x80;                      // ADC0 enabled; normal tracking   1000 0000  ADC0使能
  7.                                          // mode; ADC0 conversions are initiated
  8.                                          // when writing 1 to ad0busy flag; ADC0 data is
  9.                                          // right-justified

  10.      REF0CN = 0x03;                      // Enable on-chip VREF,  0011 电压基准寄存器 基准电压选择 内部基准电压到VREF引脚
  11.                                          // and VREF output buffer
  12.      AMX0CF = 0x00;                      // ALL inputs are single-ended (default)  信号采集单端输入  AMX0CF: AMUX0 配置寄存器
  13.      AMX0SL = 0x06;                      // 选择P3偶数引脚
  14.      AMX0PRT = 0x01;                     // 选择P3.0作为初始模拟输入
  15.      ADC0CF = 0x98;                      // ADC conversion clock = 1.10592MHz, Gain=1   1001 1000  20分频    conversion转换 PGA放大增益为1 转换的时钟周期
  16.      SFRPAGE = SFRPAGE_SAVE;             // Restore SFR page
  17.     }


  18. 模拟量采集
  19. SFRPAGE = SFRPAGE_SAVE;
  20.      num++;        //扫描6次,使用6个数码管
  21.      count++;
  22.         if(num==6)
  23.             num=0;
  24.         if(count == 5)
  25.         {
  26.          count = 0;
  27.          SFRPAGE_SAVE = SFRPAGE;        // Save Current SFR page
  28.          SFRPAGE = ADC0_PAGE;

  29.          AMX0SL = 0x06;                      // 选择P3偶数引脚  0110  AMX0AD3-0 都配置为单端输入
  30.          AMX0PRT = 0x01;                     // 选择P3.0作为初始模拟输入 0001

  31.          for(t = 0;t<8;t++)          // 第一路循环采样
  32.             {
  33.              AD0INT = 0;
  34.              AD0BUSY = 1;//写1采样一次
  35.              while(!AD0INT);
  36.              accumulator += ADC0;
  37.              for(s = 0; s<6;s++)         //延时6个周期
  38.                 {
  39.                  ;
  40.                 }
  41.             }
  42.          real0 = (int)((accumulator >> 3));                 //20190814
  43.          PID1_OUT();
  44.          accumulator = 0;

  45.          AMX0SL = 0x06;                      // 选择P3偶数引脚 0110
  46.          AMX0PRT = 0x04;  

  47. 负压数据
  48. temp = (int)((1-real0/4096.0)*690);                //20190426
  49.         StrTab[0]=led_code[18];        //显示P
  50.         StrTab[1]=led_code[0];         //显示0
  51.         StrTab[2]=0xBF;                //显示"-"          20190426
  52.         StrTab[3]=led_code[temp/100] & 0X7F;        //显示负压整数部分并且显示小数点
  53.         StrTab[4]=led_code[(temp%100)/10];
  54.         StrTab[5]=led_code[temp%10];
  55.         break;
复制代码
1.png 2.png
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|手机版|小黑屋|ELEOK |网站地图

GMT+8, 2024-4-26 00:18

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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