找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8H3K64S2单片机驱动128x32 OLED电压电流表

[复制链接]
跳转到指定楼层
楼主
电压电流显示波动严重不准 请教ADC采集程

  1. /***************************************************
  2. * STC8H3K64S2驱动128x32 OLED电压电流表程序
  3. * 功能:0-500V电压 0-999mA电压电流表
  4. * 作者:HSGhxq
  5. * 版本:V1.0
  6. * 日期:2026-01-10
  7. ***************************************************/

  8. #include "STC8H.H"
  9. #include <intrins.h>

  10. // OLED定义
  11. #define OLED_ADDRESS 0x78  // OLED I2C地址
  12. #define OLED_CMD     0x00  // 写命令
  13. #define OLED_DATA    0x40  // 写数据

  14. // ADC定义
  15. #define ADC_CH_VOLTAGE 0   // 电压测量通道 (P1.0)
  16. #define ADC_CH_CURRENT 1   // 电流测量通道 (P1.1)

  17. // 引脚定义
  18. sbit SCL = P3^2;  // OLED时钟
  19. sbit SDA = P3^3;  // OLED数据

  20. // 电压电流参数
  21. unsigned int voltage_adc = 0;   // 电压ADC值
  22. unsigned int current_adc = 0;   // 电流ADC值
  23. float voltage_value = 0;      // 电压值
  24. float current_value = 0;      // 电流值
  25. bit display_flag = 0;           // 显示标志,0=开机界面,1=主界面

  26. // 全局变量
  27. unsigned int timer_count = 0;

  28. // 函数声明
  29. void Delay_us(unsigned int n);
  30. void Delay_ms(unsigned int n);
  31. void I2C_Start(void);
  32. void I2C_Stop(void);
  33. void I2C_Ack(void);
  34. void I2C_NoAck(void);
  35. bit I2C_WaitAck(void);
  36. void I2C_SendByte(unsigned char dat);
  37. void OLED_WriteCmd(unsigned char cmd);
  38. void OLED_WriteData(unsigned char dat);
  39. void OLED_Init(void);
  40. void OLED_SetPos(unsigned char x, unsigned char y);
  41. void OLED_Clear(void);
  42. void OLED_ShowChar_8x8(unsigned char x, unsigned char y, unsigned char ch);
  43. void OLED_ShowString_8x8(unsigned char x, unsigned char y, unsigned char *str);
  44. void Show_Boot_Screen(void);
  45. void Show_Main_Screen(void);
  46. void ADC_Init(void);
  47. unsigned int Get_ADC_Result(unsigned char channel);
  48. void Measure_Voltage_Current(void);
  49. void Timer0_Init(void);


  50. code unsigned char ASCII_8x8[][8] =
  51.         {
  52.     // 0-9
  53.     {0x3E,0x7F,0x71,0x59,0x4D,0x7F,0x3E,0x00},  // 0
  54.     {0x40,0x42,0x7F,0x7F,0x40,0x40,0x00,0x00},  // 1
  55.     {0x62,0x73,0x59,0x49,0x6F,0x66,0x00,0x00},  // 2
  56.     {0x22,0x63,0x49,0x49,0x7F,0x36,0x00,0x00},  // 3
  57.     {0x18,0x1C,0x16,0x53,0x7F,0x7F,0x50,0x00},  // 4
  58.     {0x27,0x67,0x45,0x45,0x7D,0x39,0x00,0x00},  // 5
  59.     {0x3C,0x7E,0x4B,0x49,0x79,0x30,0x00,0x00},  // 6
  60.     {0x03,0x03,0x71,0x79,0x0F,0x07,0x00,0x00},  // 7
  61.     {0x36,0x7F,0x49,0x49,0x7F,0x36,0x00,0x00},  // 8
  62.     {0x06,0x4F,0x49,0x69,0x3F,0x1E,0x00,0x00},  // 9

  63.     // 字母A-Z
  64.     {0x7C,0x7E,0x0B,0x09,0x7F,0x7F,0x00,0x00},  // A
  65.     {0x7F,0x7F,0x49,0x49,0x7F,0x36,0x00,0x00},  // B
  66.     {0x3E,0x7F,0x41,0x41,0x63,0x22,0x00,0x00},  // C
  67.     {0x7F,0x7F,0x41,0x41,0x7F,0x3E,0x00,0x00},  // D
  68.     {0x7F,0x7F,0x49,0x49,0x41,0x41,0x00,0x00},  // E
  69.     {0x7F,0x7F,0x09,0x09,0x01,0x01,0x00,0x00},  // F
  70.     {0x3E,0x7F,0x41,0x49,0x7B,0x3A,0x00,0x00},  // G
  71.     {0x7F,0x7F,0x08,0x08,0x7F,0x7F,0x00,0x00},  // H
  72.     {0x00,0x41,0x7F,0x7F,0x41,0x00,0x00,0x00},  // I
  73.     {0x20,0x60,0x40,0x40,0x7F,0x3F,0x00,0x00},  // J
  74.     {0x7F,0x7F,0x1C,0x36,0x63,0x41,0x00,0x00},  // K
  75.     {0x7F,0x7F,0x40,0x40,0x40,0x40,0x00,0x00},  // L
  76.     {0x7F,0x7F,0x06,0x0C,0x06,0x7F,0x7F,0x00},  // M
  77.     {0x7F,0x7F,0x0E,0x1C,0x7F,0x7F,0x00,0x00},  // N
  78.     {0x3E,0x7F,0x41,0x41,0x7F,0x3E,0x00,0x00},  // O
  79.     {0x7F,0x7F,0x09,0x09,0x0F,0x06,0x00,0x00},  // P
  80.     {0x3E,0x7F,0x41,0x51,0x7F,0x3E,0x00,0x00},  // Q
  81.     {0x7F,0x7F,0x09,0x19,0x7F,0x66,0x00,0x00},  // R
  82.     {0x26,0x6F,0x49,0x49,0x7B,0x32,0x00,0x00},  // S
  83.     {0x01,0x01,0x7F,0x7F,0x01,0x01,0x00,0x00},  // T
  84.     {0x3F,0x7F,0x40,0x40,0x7F,0x3F,0x00,0x00},  // U
  85.     {0x1F,0x3F,0x60,0x60,0x3F,0x1F,0x00,0x00},  // V
  86.     {0x7F,0x7F,0x30,0x18,0x30,0x7F,0x7F,0x00},  // W
  87.     {0x63,0x77,0x1C,0x1C,0x77,0x63,0x00,0x00},  // X
  88.     {0x07,0x0F,0x78,0x78,0x0F,0x07,0x00,0x00},  // Y
  89.     {0x61,0x71,0x59,0x4D,0x47,0x43,0x00,0x00},  // Z

  90.     // 小写字母
  91.     {0x20,0x74,0x54,0x54,0x7C,0x78,0x00,0x00},  // a
  92.     {0x7F,0x7F,0x44,0x44,0x7C,0x38,0x00,0x00},  // b
  93.     {0x38,0x7C,0x44,0x44,0x44,0x00,0x00,0x00},  // c
  94.     {0x38,0x7C,0x44,0x44,0x7F,0x7F,0x00,0x00},  // d
  95.     {0x38,0x7C,0x54,0x54,0x5C,0x18,0x00,0x00},  // e
  96.     {0x04,0x7E,0x7F,0x05,0x05,0x00,0x00,0x00},  // f
  97.     {0x98,0xBC,0xA4,0xA4,0xFC,0x7C,0x00,0x00},  // g
  98.     {0x7F,0x7F,0x04,0x04,0x7C,0x78,0x00,0x00},  // h
  99.     {0x00,0x48,0x7D,0x7D,0x40,0x00,0x00,0x00},  // i
  100.     {0x40,0xC0,0x80,0x80,0xFD,0x7D,0x00,0x00},  // j
  101.     {0x7F,0x7F,0x10,0x38,0x6C,0x44,0x00,0x00},  // k
  102.     {0x00,0x41,0x7F,0x7F,0x40,0x00,0x00,0x00},  // l
  103.     {0x7C,0x7C,0x0C,0x18,0x0C,0x7C,0x78,0x00},  // m
  104.     {0x7C,0x7C,0x04,0x04,0x7C,0x78,0x00,0x00},  // n
  105.     {0x38,0x7C,0x44,0x44,0x7C,0x38,0x00,0x00},  // o
  106.     {0xFC,0xFC,0x24,0x24,0x3C,0x18,0x00,0x00},  // p
  107.     {0x18,0x3C,0x24,0x24,0xFC,0xFC,0x00,0x00},  // q
  108.     {0x7C,0x7C,0x04,0x04,0x0C,0x08,0x00,0x00},  // r
  109.     {0x48,0x5C,0x54,0x54,0x74,0x24,0x00,0x00},  // s
  110.     {0x04,0x3F,0x7F,0x44,0x44,0x00,0x00,0x00},  // t
  111.     {0x3C,0x7C,0x40,0x40,0x7C,0x7C,0x00,0x00},  // u
  112.     {0x1C,0x3C,0x60,0x60,0x3C,0x1C,0x00,0x00},  // v
  113.     {0x3C,0x7C,0x60,0x38,0x60,0x7C,0x3C,0x00},  // w
  114.     {0x44,0x6C,0x38,0x38,0x6C,0x44,0x00,0x00},  // x
  115.     {0x9C,0xBC,0xA0,0xA0,0xFC,0x7C,0x00,0x00},  // y
  116.     {0x4C,0x64,0x74,0x5C,0x4C,0x44,0x00,0x00},  // z
  117.     {0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00},  // -
  118.     {0x00,0x00,0x00,0x14,0x00,0x00,0x00,0x00},  // :
  119.     {0x00,0x36,0x36,0x00,0x00,0x00,0x00,0x00},  // :
  120.     {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},  // 空格
  121.     {0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00},  // _
  122.     {0x00,0x00,0x03,0x03,0x00,0x00,0x00,0x00},  // "
  123.     {0x2A,0x2A,0x1C,0x1C,0x2A,0x2A,0x00,0x00},  // *
  124.     {0x7F,0x7F,0x49,0x49,0x41,0x41,0x00,0x00},  // E
  125.     {0x08,0x08,0x3E,0x08,0x08,0x00,0x00,0x00},  // +
  126.     {0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00},  // .
  127.     {0x20,0x10,0x08,0x04,0x02,0x01,0x00,0x00},  // /
  128.     {0x7F,0x41,0x41,0x41,0x41,0x7F,0x00,0x00},  //
  129.     {0x00,0x08,0x3E,0x08,0x00,0x00,0x00,0x00},  //
  130.     {0x00,0x08,0x1C,0x2A,0x08,0x08,0x00,0x00},  //
  131.     {0x7E,0x42,0x42,0x42,0x42,0x7E,0x00,0x00},  // 0
  132.     {0x00,0x44,0x7E,0x7F,0x40,0x00,0x00,0x00},  // 1
  133.     {0x7E,0x7F,0x49,0x49,0x49,0x49,0x00,0x00},  // A
  134.     {0x3F,0x7F,0x44,0x44,0x44,0x7C,0x38,0x00},  // d
  135.     {0x3E,0x7F,0x41,0x41,0x41,0x63,0x22,0x00},  // C
  136. };


  137. // 开机界面文字
  138. code unsigned char BootText[] = "HSGhxq VER V1.0";

  139. /******************************************************/
  140. void Delay_us(unsigned int n) {
  141.     while(n--) {
  142.         _nop_();
  143.         _nop_();
  144.         _nop_();
  145.         _nop_();
  146.     }
  147. }

  148. void Delay_ms(unsigned int n) {
  149.     unsigned int i, j;
  150.     for(i = 0; i < n; i++)
  151.         for(j = 0; j < 1000; j++);
  152. }

  153. /***************I2C************************************/
  154. void I2C_Start(void) {
  155.     SDA = 1;
  156.     SCL = 1;
  157.     Delay_us(5);
  158.     SDA = 0;
  159.     Delay_us(5);
  160.     SCL = 0;
  161. }

  162. void I2C_Stop(void) {
  163.     SDA = 0;
  164.     SCL = 1;
  165.     Delay_us(5);
  166.     SDA = 1;
  167.     Delay_us(5);
  168. }

  169. void I2C_Ack(void) {
  170.     SDA = 0;
  171.     SCL = 1;
  172.     Delay_us(5);
  173.     SCL = 0;
  174.     SDA = 1;
  175. }

  176. void I2C_NoAck(void) {
  177.     SDA = 1;
  178.     SCL = 1;
  179.     Delay_us(5);
  180.     SCL = 0;
  181. }

  182. bit I2C_WaitAck(void) {
  183.     SDA = 1;
  184.     SCL = 1;
  185.     Delay_us(5);
  186.     CY = SDA;
  187.     SCL = 0;
  188.     return CY;
  189. }

  190. void I2C_SendByte(unsigned char dat) {
  191.     unsigned char i;
  192.     for(i = 0; i < 8; i++) {
  193.         SDA = (dat & 0x80) ? 1 : 0;
  194.         dat <<= 1;
  195.         SCL = 1;
  196.         Delay_us(5);
  197.         SCL = 0;
  198.     }
  199.     I2C_WaitAck();
  200. }

  201. /***************************************************
  202. * OLED函数
  203. ***************************************************/
  204. void OLED_WriteCmd(unsigned char cmd) {
  205.     I2C_Start();
  206.     I2C_SendByte(OLED_ADDRESS);
  207.     I2C_SendByte(OLED_CMD);
  208.     I2C_SendByte(cmd);
  209.     I2C_Stop();
  210. }

  211. void OLED_WriteData(unsigned char dat) {
  212.     I2C_Start();
  213.     I2C_SendByte(OLED_ADDRESS);
  214.     I2C_SendByte(OLED_DATA);
  215.     I2C_SendByte(dat);
  216.     I2C_Stop();
  217. }

  218. void OLED_Init(void) {
  219.     Delay_ms(100);

  220.     OLED_WriteCmd(0xAE);  // 关闭显示

  221.     OLED_WriteCmd(0xD5);  // 设置时钟分频因子
  222.     OLED_WriteCmd(0x80);

  223.     OLED_WriteCmd(0xA8);  // 设置驱动路数
  224.     OLED_WriteCmd(0x1F);  // 32-1

  225.     OLED_WriteCmd(0xD3);  // 设置显示偏移
  226.     OLED_WriteCmd(0x00);

  227.     OLED_WriteCmd(0x40);  // 设置起始行

  228.     OLED_WriteCmd(0xA1);  // 设置段重定向

  229.     OLED_WriteCmd(0xC8);  // 设置COM扫描方向

  230.     OLED_WriteCmd(0xDA);  // 设置COM硬件引脚配置
  231.     OLED_WriteCmd(0x02);

  232.     OLED_WriteCmd(0x81);  // 设置对比度
  233.     OLED_WriteCmd(0x7F);

  234.     OLED_WriteCmd(0xA4);  // 设置全部像素点ON

  235.     OLED_WriteCmd(0xA6);  // 设置正常显示

  236.     OLED_WriteCmd(0xD9);  // 设置预充电周期
  237.     OLED_WriteCmd(0xF1);

  238.     OLED_WriteCmd(0xDB);  // 设置VCOMH电压倍率
  239.     OLED_WriteCmd(0x30);

  240.     OLED_WriteCmd(0x8D);  // 设置充电泵
  241.     OLED_WriteCmd(0x14);

  242.     OLED_WriteCmd(0xAF);  // 开启显示

  243.     OLED_Clear();
  244. }

  245. void OLED_SetPos(unsigned char x, unsigned char y) {
  246.     OLED_WriteCmd(0xB0 + y);               
  247.     OLED_WriteCmd(((x & 0xF0) >> 4) | 0x10);
  248.     OLED_WriteCmd(x & 0x0F);                 
  249. }

  250. void OLED_Clear(void) {
  251.     unsigned char i, j;
  252.     for(i = 0; i < 4; i++) {
  253.         OLED_SetPos(0, i);
  254.         for(j = 0; j < 128; j++) {
  255.             OLED_WriteData(0x00);
  256.         }
  257.     }
  258. }

  259. /***************************************************
  260. * 显示函数
  261. ***************************************************/
  262. void OLED_ShowChar_8x8(unsigned char x, unsigned char y, unsigned char ch)
  263.         {
  264.     unsigned char i, c;

  265.     if(ch >= '0' && ch <= '9') {
  266.         c = ch - '0';
  267.     } else if(ch >= 'A' && ch <= 'Z') {
  268.         c = ch - 'A' + 10;
  269.     } else if(ch >= 'a' && ch <= 'z') {
  270.         c = ch - 'a' + 36;
  271.     } else {
  272.         switch(ch) {
  273.             case '-': c = 62; break;
  274.             case ':': c = 63; break;
  275.             case ' ': c = 64; break;
  276.             case '_': c = 65; break;
  277.             case '.': c = 70; break;
  278.             case '@': c = 71; break;
  279.             case 'm': c = 40; break;
  280.             case 'V': c = 21; break;
  281.             case 'v': c = 21; break;  
  282.             default : c = 64; break;
  283.         }
  284.     }

  285.     OLED_SetPos(x, y);
  286.     for(i = 0; i < 8; i++) {
  287.         OLED_WriteData(ASCII_8x8[c][i]);
  288.     }
  289. }

  290. void OLED_ShowString_8x8(unsigned char x, unsigned char y, unsigned char *str) {
  291.     while(*str) {
  292.         OLED_ShowChar_8x8(x, y, *str);
  293.         x += 8;
  294.         str++;
  295.     }
  296. }

  297. void Show_Boot_Screen(void) {
  298.     OLED_Clear();

  299.     OLED_ShowChar_8x8(0,  1, 'H');
  300.     OLED_ShowChar_8x8(8,  1, 'S');
  301.     OLED_ShowChar_8x8(16, 1, 'G');
  302.     OLED_ShowChar_8x8(24, 1, 'h');
  303.     OLED_ShowChar_8x8(32, 1, 'x');
  304.     OLED_ShowChar_8x8(40, 1, 'q');

  305.     OLED_ShowChar_8x8(54, 1, 'V');
  306.     OLED_ShowChar_8x8(62, 1, 'E');
  307.     OLED_ShowChar_8x8(70, 1, 'R');
  308.     OLED_ShowChar_8x8(78, 1, ' ');
  309.     OLED_ShowChar_8x8(86, 1, 'V');
  310.     OLED_ShowChar_8x8(94, 1, '1');
  311.     OLED_ShowChar_8x8(102,1, ',');
  312.     OLED_ShowChar_8x8(110,1, '0');
  313.         
  314.           OLED_ShowChar_8x8(20, 3, '2');
  315.     OLED_ShowChar_8x8(28, 3, '0');
  316.     OLED_ShowChar_8x8(36, 3, '2');
  317.     OLED_ShowChar_8x8(44, 3, '6');
  318.     OLED_ShowChar_8x8(52, 3, '-');
  319.     OLED_ShowChar_8x8(60, 3, '0');
  320.           OLED_ShowChar_8x8(68, 3, '1');
  321.     OLED_ShowChar_8x8(76, 3, '-');
  322.     OLED_ShowChar_8x8(84, 3, '1');
  323.     OLED_ShowChar_8x8(92, 3, '2');

  324.     Delay_ms(3000);  // 显示3秒
  325.     OLED_Clear();   

  326.     display_flag = 1;
  327. }

  328. void Show_Main_Screen(void) {
  329.     unsigned int volt_int, curr_int;
  330.     unsigned char volt_100, volt_10, volt_1, volt_dec;
  331.     unsigned char curr_100, curr_10, curr_1;

  332.     // 提取电压各位数字
  333.     volt_int = (unsigned int)(voltage_value * 10);
  334.     volt_100 = volt_int / 1000 % 10;
  335.     volt_10 = volt_int / 100 % 10;
  336.     volt_1 = volt_int / 10 % 10;
  337.     volt_dec = volt_int % 10;

  338.     // 提取电流各位数字
  339.     curr_int = (unsigned int)current_value;
  340.     curr_100 = curr_int / 100 % 10;
  341.     curr_10 = curr_int / 10 % 10;
  342.     curr_1 = curr_int % 10;
  343.             
  344.           OLED_ShowChar_8x8(96,  1, 'H');
  345.     OLED_ShowChar_8x8(106, 1, 'S');
  346.     OLED_ShowChar_8x8(116, 1, 'G');
  347.                 OLED_ShowChar_8x8(90,  3, '2');
  348.     OLED_ShowChar_8x8(100, 3, '0');
  349.     OLED_ShowChar_8x8(110, 3, '2');
  350.           OLED_ShowChar_8x8(120, 3, '6');
  351.                
  352.     OLED_ShowChar_8x8(0,  1, 'V');
  353.     OLED_ShowChar_8x8(8,  1, 'O');
  354.     OLED_ShowChar_8x8(16, 1, 'L');
  355.     OLED_ShowChar_8x8(24, 1, ',');

  356.     // 显示电压值
  357.     OLED_ShowChar_8x8(32, 1, volt_100 + '0');
  358.     OLED_ShowChar_8x8(40, 1, volt_10 + '0');
  359.     OLED_ShowChar_8x8(48, 1, volt_1 + '0');
  360.     //OLED_ShowChar_8x8(56, 1, '.');
  361.    // OLED_ShowChar_8x8(64, 1, volt_dec + '0');
  362.     OLED_ShowChar_8x8(56, 1, 'V');

  363.     // 显示电流标题
  364.     OLED_ShowChar_8x8(0,  3, 'C');
  365.     OLED_ShowChar_8x8(8,  3, 'U');
  366.     OLED_ShowChar_8x8(16, 3, 'R');
  367.     OLED_ShowChar_8x8(24, 3, ',');

  368.                                 
  369.     // 显示电流值
  370.     OLED_ShowChar_8x8(32, 3, curr_100 + '0');
  371.     OLED_ShowChar_8x8(40, 3, curr_10 + '0');
  372.     OLED_ShowChar_8x8(48, 3, curr_1 + '0');
  373.     OLED_ShowChar_8x8(56, 3, 'm');
  374.     OLED_ShowChar_8x8(64, 3, 'a');
  375. }

  376. /*********************ADC******************************/
  377. void ADC_Init(void) {

  378.          P1M0 = 0x00;
  379.    P1M1 = 0x00;  



  380.     ADCCFG = 0x0F;     
  381.     ADC_CONTR = 0x80;
  382.     Delay_ms(1);      
  383. }

  384. unsigned int Get_ADC_Result(unsigned char channel) {
  385.     unsigned int result = 0;
  386.     unsigned char i;

  387.     ADC_CONTR = 0x80 | channel;  
  388.     Delay_us(10);               

  389.     for(i = 0; i < 4; i++) {   
  390.         ADC_CONTR |= 0x40;     
  391.         _nop_();
  392.         _nop_();
  393.         while(!(ADC_CONTR & 0x20));  
  394.         ADC_CONTR &= ~0x20;         
  395.        result += (ADC_RES << 8) | ADC_RESL;
  396.     }

  397.     return result >> 2;  
  398. }

  399. void Measure_Voltage_Current(void) {
  400.     unsigned int adc_sum;
  401.     unsigned char i;

  402.     // 多次采样平均
  403.     adc_sum = 0;
  404.     for(i = 0; i < 10; i++) {
  405.         adc_sum += Get_ADC_Result(ADC_CH_VOLTAGE);
  406.         Delay_ms(1);
  407.     }
  408.     voltage_adc = adc_sum / 10;

  409.     // 读取电流ADC值,多次采样平均
  410.     adc_sum = 0;
  411.     for(i = 0; i < 10; i++) {
  412.         adc_sum += Get_ADC_Result(ADC_CH_CURRENT);
  413.         Delay_ms(1);
  414.     }
  415.     current_adc = adc_sum / 10;

  416.     voltage_value = (voltage_adc * 5.0 * 50.0) / 4096.0;

  417.     current_value = (current_adc * 5.0 * 100.0) / 4096.0;

  418.     // 限制范围
  419.     if(voltage_value > 500.0) voltage_value = 500.0;
  420.     if(voltage_value < 0.0) voltage_value = 0.0;

  421.     if(current_value > 999.0) current_value = 999.0;
  422.     if(current_value < 0.0) current_value = 0.0;
  423. }

  424. /**********************定时器0初始化**************************/
  425. void Timer0_Init(void) {
  426.     AUXR |= 0x80;      // 定时器0为1T模式
  427.     TMOD &= 0xF0;      // 设置定时器0为16位自动重装
  428.     TL0 = 0x66;        // 设置定时初值
  429.     TH0 = 0xFC;        // 设置定时初值
  430.     TF0 = 0;           // 清除TF0标志
  431.     TR0 = 1;           // 定时器0开始计时
  432.     ET0 = 1;           // 允许定时器0中断
  433.     EA = 1;            // 打开总中断
  434. }

  435. /********************定时器0中断服务函数***********************/
  436. void Timer0_ISR(void) interrupt 1 {
  437.     timer_count++;
  438.     if(timer_count >= 500) {  // 500ms
  439.         timer_count = 0;
  440.         Measure_Voltage_Current();  // 每500ms更新一次测量值
  441.     }
  442. }


  443. void main(void)
  444.         {
  445.      // 初始化IO口
  446.     P3M0 = 0x0C;  // P3.2, P3.3推挽输出
  447.     P3M1 = 0x00;

  448.     ADC_Init();
  449.     OLED_Init();
  450.     Timer0_Init();     
  451.     Show_Boot_Screen(); // 上电显示版本号

  452.     while(1) {
  453.         if(display_flag)
  454.                                         {
  455.          Show_Main_Screen();
  456.         }      
  457.         Delay_ms(100);
  458.     }
  459.         }
复制代码


IMG20260112211833.jpg (4.93 MB, 下载次数: 0)

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

使用道具 举报

沙发
ID:1133081 发表于 2026-1-13 21:21 | 只看该作者
楼主ADC初始化与官方例程有差别,另外注意12位ADC转换结果右对齐或左对齐在后期计算方法不同。
回复

使用道具 举报

板凳
ID:1161211 发表于 2026-1-14 10:46 | 只看该作者
基准电压是否稳定?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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