找回密码
 立即注册
查看: 253|回复: 16

有用合集 | PID, 串口绘图,虚拟数码管

[复制链接]
  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
    发表于 2024-4-3 23:31:17 | 显示全部楼层 |阅读模式
    //虚拟数码管显示
            SBUF = 0x37;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x53;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x45;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x47;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x53;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x00;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x00;B_TX1_Busy = 1;        while(B_TX1_Busy);
            SBUF = 0x00;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);

    SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x33;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x33;B_TX1_Busy = 1;        while(B_TX1_Busy);
    SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);
    //虚拟数码管显示
    //打开串口后打开虚拟数码码就可以看了1131131 这七个数了。



    //----------------------------------------------------------------------------

    https://www.stcaimcu.com/forum.p ... e=2&extra=#pid70193

    上面用的是stc32G芯片测试的串口绘图功能。用的是最新的ISPV6.94  用6.91也是可以的。这个在哪里找到呢?在STC调试接口菜单下,需要接串口助手打开相对应该的串口。
    然后在程序中为了方便看设置个1秒一次发送串口数据,比如200 100  这样就出现了图中的样子。还要设置成2个通道,这样就可以调试自己的程序了。
    为什么里面的100不在100上而在125上? 这是因为线图可以根据自己的需要调位置。只需要自己把标尺调节到0上就可以了。不会出现数据不配套了。
    这样比如我们去试PID调节温度,就可以先看一下升温曲线然后再加入参数来调整了。  昨天把好懂的PID也搞到程序里面。 其实感觉这个PID调整主要不是为了调温度做的。不过要先会了这简单的。
    如果看不到数据,可能是设置的区间不对。按住CTRL滚动鼠标可以改数据范围。

    p1.png
    p2.png
    通过以上的图可以看出,就算是我加热器可以做到1秒加热10度,也可以通过每秒10次或10次以上的决断法(高关低开)实现控温但是因为因加热太快或测温还不够块而造成
    有一定的回差值。不可能完全稳定到一个温度一直不动。




    1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-6 13:07:30 | 显示全部楼层
    本帖最后由 qepuemc 于 2024-4-6 13:11 编辑

    经过这几天的研究做出来PID的测试把代码分享出来,有意思测试的朋友拿测试吧。 程序中不对的地方我给去掉。
    先发个图
    qq3.png

    再次提醒串口绘图时端口一定要打开选对。
    最后根据out也就是PP+II+DD的值算PWM的对应关系。

    1. //pid温度控制部分1(123)
    2. //一个简单的PID控制程序通常包括三个部分:比例环节(P),积分环节(I)和微分环节(D)。
    3. // 设置参数
    4. //这个程序可以在51单片机stc32G12K128上正常运行
    5. //STC-ISP串口调试功能强大,设置串口绘图要打开对的端口免的没有数据设置双字低位在前(十分重要)
    6. //1,定义部分做好设置,仿真测试用一个变量模拟数据变华看效果。如果出现效果说明PID程序正常再考虑实际调整
    7. //如果只是为了控制温度用单片机控制固态继电器的开关,相关于人手控制阀门蓄水,根据情况确定检测周期和决定开不开关就可以了。比如1秒决断1-50次。
    8. //关于采样速度。如果加热采样要1-5秒才可以采样处理完成,则控制不可以太快处理,所以采样一定要快。
    9. //关于加热速度,如果一秒就可以加热10度或更多,则有时候需要加热零点几秒以内就要关使得加热不稳定,所以加热不可以太快会引起超调
    10. //PID控结果是一个加热数据,更据这个数据给到PWM处理实现控制,所以参数需要根据具体情况调整。
    11. //在程序中根据需要确定程序的执行周期是多少比如1000ms 100ms
    12. float Kp = 1; // 比例系数
    13. float Ki = 0.1; // 积分系数
    14. float Kd = 0.01;// 微分系数
    15. long PP=0; //过程运算// 计算比例项
    16. long II=0; //过程运算// 计算积分项
    17. long DD=0; //过程运算// 计算微分项
    18. long error = 0;                          //本次误差(距离目标值的误差)
    19. long error_prev = 0;  //上一次误差
    20. long derivative =0; // 导数 用于计算微分项
    21. long integral = 0;                 //积分项
    22. long output=0;                                //输出项
    23. long setpoint = 300; // 设定目标值SV
    24. long process_value=0;  //测量值PV
    25. long process_value_mn=0;  //测量值PV模拟
    26. /*
    27. Kp (比例系数), Ki (积分系数), Kd (微分系数):这些参数用于调节PID控制器的比例、积分和微分部分的影响。
    28. setpoint (目标值):系统所需达到的目标数值。
    29. error_prev (上一次误差):存储上一步的误差值,用于计算微分项。
    30. integral (积分项):用于存储积分部分的累积误差。
    31. process_value (过程值):从传感器中读取的当前系统值。
    32. P (比例项):根据当前误差和比例系数计算得出的部分。
    33. I (积分项):根据积分系数和累积误差计算得出的部分。
    34. D (微分项):根据微分系数和当前误差与上一次误差之差计算得出的部分。
    35. output (PID输出):将比例、积分和微分项相加得到的PID控制器的最终输出。
    36. control_signal (控制信号):将PID输出发送给执行器以控制系统。
    37. while (true) { ... }:这是一个无限循环,表示控制器将持续运行。
    38. */
    39. //pid温度控制部分1(123)
    复制代码




    //下面再有就是main里面的了
    1. //正常屏幕显示区域下 500ms处理一次
    2.         
    3.         
    4.         
    5.         
    6. //pid温度控制部分2(123)
    7.         // 读取当前值
    8.    
    9.         
    10.                 //process_value=adcdat8;  //adcdat8为取得的本次测量值
    11.         
    12.         //模拟数据
    13.                 if (process_value_mn<=310)
    14.                 {
    15.                         process_value_mn=process_value_mn+1;
    16.                 }
    17.         if (process_value_mn>=350)
    18.         {process_value_mn=process_value_mn-1;}
    19.         
    20.                 if (process_value_mn<=250)
    21.                 process_value_mn=process_value_mn+1;
    22.                 //模拟数据
    23.                
    24.         process_value=process_value_mn;
    25.     // 计算误差
    26.         
    27.         if (setpoint>process_value)
    28.         {error = setpoint - process_value;}
    29.         if (setpoint<=process_value)
    30.         {error = 0;}
    31.         
    32.     // 计算比例项
    33.     PP = Kp * error;
    34.     // 计算积分项
    35.     integral = integral + error;
    36.     II = Ki * integral;
    37.     // 计算微分项
    38.     derivative = error - error_prev;
    39.     DD = Kd * derivative;
    40. if (derivative>8000 || integral>8000)
    41.         
    42. derivative=0;
    43. integral=0;
    44.     // 计算PID输出
    45.     output = PP + II + DD;
    46.     // 输出控制信号
    47.     // 更新误差
    48.     error_prev = error;
    49.                 //如果output小于0说明过冲了需要关闭设置output为0
    50.                 if (output<=0)
    51.                 {output=0;}
    52.                 //如果output大于30000说明需要开到最大
    53.                 if (output>=6553)
    54.                 {output=6553;}
    55.                
    56.                
    57. /////////////////////////////////////////////////////////更新pWM
    58. pwm7set=output*10;
    59.                 //if (adcdat8>setpoint)
    60.         //        {pwm7set=65533;}
    61. /////////////////////////////////////////////////////////
    62.                 PWMB_CCR7H = (u8)(pwm7set >> 8); //设置占空比时间
    63.     PWMB_CCR7L = (u8)(pwm7set);
    64. /////////////////////////////////////////////////////////
    65.                
    66. //pid温度控制部分2(123)
    67.         
    68.                 //SBUF = 0x31;B_TX1_Busy = 1;        while(B_TX1_Busy);
    69.         //        SBUF = 0xf5;B_TX1_Busy = 1;        while(B_TX1_Busy);
    70. //显示数据1 设定值SV
    71.         /*        
    72. PrintString1(" SV ");
    73. UART_Send_dat(setpoint);        
    74. PrintString1(" PV ");
    75. UART_Send_dat(process_value_mn);        
    76.                
    77. PrintString1(" error ");
    78. UART_Send_dat(error);        
    79.                
    80.         PrintString1(" output ");
    81. UART_Send_dat(output);
    82. PrintString1(" PP ");
    83. UART_Send_dat(PP);
    84. PrintString1(" II ");
    85. UART_Send_dat(II);
    86. PrintString1(" DD ");
    87. UART_Send_dat(DD);
    88.                 */
    89.                
    90.         
    91. //显示设置值
    92. SBUF = setpoint;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    93. SBUF = setpoint>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    94.                
    95.                
    96. //显示测量值
    97. SBUF = process_value;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    98. SBUF = process_value>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    99.                
    100.                
    101. //显示PP3
    102. SBUF = PP;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    103. SBUF = PP>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    104.                
    105. //显示II
    106. SBUF = II;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    107. SBUF = II>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    108.         
    109. //显示DD
    110. SBUF = DD;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    111. SBUF = DD>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    112. //显示output
    113. SBUF = output;B_TX1_Busy = 1;        while(B_TX1_Busy);   //串口发200 每秒一次方便观看
    114. SBUF = output>>8;B_TX1_Busy = 1;        while(B_TX1_Busy);//串口发100 每秒一次方便观看
    115.         
    116.                 /*
    117. PrintString1("output ");
    118. UART_Send_dat(0);
    119. PrintString1(" PP ");
    120. UART_Send_dat(90);
    121. PrintString1(" II ");
    122. UART_Send_dat(II);
    123. PrintString1(" DD ");
    124. UART_Send_dat(100);
    125. PrintString1(" adcdat8");
    126. UART_Send_dat(150);
    127. */        
    128.         
    129.         
    130. //pid温度控制部分2(123)
    131.         
    132.         //pid温度控制部分3(123)
    133.         
    134.         //pid温度控制部分3(123)
    复制代码

    回复 支持 1 反对 0 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:49
  • 签到天数: 159 天

    [LV.7]常住居民III

    25

    主题

    733

    回帖

    1833

    积分

    金牌会员

    积分
    1833
    发表于 2024-4-6 13:22:12 | 显示全部楼层
    回复 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-13 19:31:25 | 显示全部楼层
    本帖最后由 qepuemc 于 2024-4-13 19:43 编辑

    STC32G12K128  LQFP32这个型号好用。好焊接,也可以直接仿真,可以用USB直接仿真还有可以用P1.6 1.7 做串口输出。可以单步调试。
    另外求助 SBUF = 0x37;B_TX1_Busy = 1;        while(B_TX1_Busy);   为什么仿真时运行到这行代码程序就OVER死机了。求懂的人说一下
    自己回答:
    //中断
    P24=0;
                            {SBUF = 0xAA;B_TX1_Busy = 1;        while(B_TX1_Busy);}
    //中断

    P25=0;
    用CRTL+F11运行跳过就可以了。这样就可以让仿真更细致了。哈哈
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-13 21:53:27 | 显示全部楼层
    关于串口共用:TTL可以和蓝牙模块共存,不可以和TTL共存也不可以和485共存。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-14 00:05:08 来自手机 | 显示全部楼层
    IMG_20240413_231843.jpg
    关于485通讯芯片的用法可以去家里装看一下。我在那边已经开源。以后会陆续开源更多东西。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-21 21:50:30 | 显示全部楼层
    本帖最后由 qepuemc 于 2024-4-21 21:54 编辑

    关于测温之NTC电阻,这个看到网上说的东西乱七八遭,比如10K说明是在25度的时候是10K。利用分压的原理就行测试。
    VREF2.5的情况下。ADC大约是0-2.5V只要知道电阻大约如在0度。50度100度,150  200度时候的电阻值就可以算出分压ADC。
    实际情况是用了一些神奇的说法做出来的。不过我的验证结果就是没什么意思了。不需要放大。
    最后我根据实验箱例子做出来了。不过要把数减去200 。为什么?我也不知道。不然太不准。这个一直没能研究的原因就是无法标定。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-24 14:07:18 | 显示全部楼层
    本帖最后由 qepuemc 于 2024-4-24 22:22 编辑

    关于NTC热电阻的标定之我的方式
    10k NTC  分压电阻10K

    温度    电阻        ADC               
    -20        97120        2284908        68746        68746        137.492                137.492
    -15        72980        2216162        82122        82122        164.244                164.244
    -10        55340        2134040        95490        95490        190.98                190.98
    -5        42340        2038550        108914        108914        217.828                217.828
    0        32660        1929636        121186        121186        242.372                242.372
    5        25400        1808450        131027        131027        262.054                262.054
    10        19900        1677423        137343        137343        274.686                274.686
    15        15710        1540080        140140        140140        280.28                280.28
    20        12490        1399940        139163        139163        278.326                278.326
    25        10000        1260777        136222        136222        272.444                272.444
    30        8058        1124555        128705        128705        257.41                257.41
    35        6532        995850        120050        120050        240.1                240.1
    40        5326        875800        109615        109615        219.23                219.23
    45        4368        766185        98915        98915        197.83                197.83
    50        3602        667270        88040        88040        176.08                176.08
    55        2986        579230        77530        77530        155.06                155.06
    60        2488        501700        67800        67800        135.6                135.6
    65        2082        433900        58800        58800        117.6                117.6
    70        1751        375100                                       
                                                           


    标定方式电阻箱

    例子:
    if (adc_average<=1399940 && adc_average>1260777)
    {       
    wendu=200+(1399940-adc_average)/2783.26;
    }

    输入10K电阻测试时,ADC值 1261484-adc1261489

    [13:58:29.459]收←◆adc1261485
    xsbl24.9
    wendu24.9

    [13:58:30.463]收←◆adc1261489
    xsbl24.9
    wendu24.9

    [13:58:31.467]收←◆adc1261487
    xsbl24.9
    wendu24.9

    [13:58:32.471]收←◆adc1261484
    xsbl24.9
    wendu24.9
    真实数据。STC棒棒的。不用放大器超准了。采集600个求平均
    // 计算平均值 下面是采集的关键代码
    adc_average = adc_calculate_average()*2525000/4096;

    效果一会发图
    IMG_20240424_140802.jpg
    总结一下。网上说了各种的方法。我认为都不可取。应该是结合软件和硬件才可以。硬件电路方面就是10k对10k分压。然后出现0~2.5伏给到AdC脚。然后用电阻箱给对应的电阻值测得相对应的Adc值。然后每隔五度进行线性标定。根据我的经验。测-20-70还是可以的。再高了或者低了可能效果就不好了。也就是说NPC测温度测温范围比较小。这样也容易比较准确。以上只是我自己的观点。希望对你有用。
    下面的图片就是做个了结吧,Ntc的。
    IMG_20240424_221907.jpg
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-25 21:24:48 | 显示全部楼层
    本帖最后由 qepuemc 于 2024-4-25 23:06 编辑

    关于用STC32G LQFP32封装的芯片直接驱动P2和P0做位码显示4位数码管的PCB开源和原程序。已经总节成比较简单的代码比校好分离。分离出来。(源自由STC32例程包)
    IMG_20240425_212859.jpg
    先发程序
    1. /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序            */
    2. /*************  功能说明    **************
    3. 本例程基于STC32G为主控芯片的实验箱进行编写测试.
    4. 使用Keil C251编译器,Memory Model推荐设置XSmall模式,默认定义变量在edata,单时钟存取访问速度快。
    5. edata建议保留1K给堆栈使用,空间不够时可将大数组、不常用变量加xdata关键字定义到xdata空间。
    6. 用STC的MCU的IO方式驱动8位数码管。
    7. 显示效果为: 数码时钟.
    8. 使用Timer0的16位自动重装来产生1ms节拍,程序运行于这个节拍下, 用户修改MCU主时钟频率时,自动定时于1ms.
    9. 下载时, 选择时钟 24MHZ (用户可自行修改频率).
    10. ******************************************/
    11. #include "comm\STC32G.h"//文件目录需要可以改一下
    12. #include "stdio.h"
    13. #include "intrins.h"
    14. #define MAIN_Fosc        22118400UL                                                                                         
    15. #define Timer0_Reload   (65536UL -(MAIN_Fosc / 1000))       //Timer 0 中断频率, 1000次/秒
    16. /*************  本地常量声明    **************/
    17. unsigned char code t_display[]={                       //段码P2
    18. //   0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
    19.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
    20. //black  -   H    J    K    L    N    o   P    U     t    G    Q    r   M    y
    21.     0x00,0x40,0x76,0x1E,0x70,0x38,0x37,0x5C,0x73,0x3E,0x78,0x3d,0x67,0x50,0x37,0x6e,
    22.     0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF,0x46};    //0. 1. 2. 3. 4. 5. 6. 7. 8. 9. -1
    23. unsigned char code T_COM[]={0x01,0x02,0x04,0x08};      //位码P0低4位
    24. unsigned char  LED8[4];        //显示缓冲
    25. unsigned char  display_index=0;  //显示位索引
    26. bit B_1ms;          //1ms标志
    27. unsigned int msecond;   //秒计算
    28. /********************** 显示时钟函数 ************************/
    29. void displayled(void)
    30. {
    31.     //右边往左数第一位     
    32.                 LED8[0] =1;  
    33.     LED8[1] =2;
    34.     LED8[2] =3;
    35.     LED8[3] =4;
    36.                 //右边往左数第四位
    37. }
    38. /******************** 主函数 **************************/
    39. void main(void)
    40. {
    41.   
    42. /*
    43.     WTST = 0;  //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
    44.     EAXFR = 1; //扩展寄存器(XFR)访问使能
    45.     CKCON = 0; //提高访问XRAM速度
    46. */
    47. //LED设置引脚(STC直接驱动数码管模块定时器0设置)
    48.         P2M0 = 0xff; P2M1 = 0x00;
    49.         P0M0 = 0xff; P0M1 = 0x00;
    50. //LED设置引脚
    51. //定时器0设置
    52.     T0x12 = 1;  //Timer0 set as 1T, 16 bits timer auto-reload,
    53.     TH0 = (unsigned char)(Timer0_Reload / 256);
    54.     TL0 = (unsigned char)(Timer0_Reload % 256);
    55.     ET0 = 1;    //Timer0 interrupt enable
    56.     TR0 = 1;    //Tiner0 run
    57.     EA = 1;     //打开总中断  
    58. //定时器0设置(STC直接驱动数码管模块定时器0设置)
    59. //数码管全亮测试功能(STC直接驱动数码管模块上电测试)
    60.                 LED8[0] =0xFF;
    61.     LED8[1] =0xFF;
    62.     LED8[2] =0xFF;
    63.     LED8[3] =0xFF;
    64. //数码管全亮测试功能(STC直接驱动数码管模块上电测试)
    65.     while(1)
    66.     {
    67.                         //(STC直接驱动数码管模块)
    68.         if(B_1ms)   //1ms到
    69.         {
    70.             B_1ms = 0;
    71.                                                 if(++msecond >= 1000)   //1秒到
    72.             {
    73.                 msecond = 0;
    74.                 displayled();
    75.             }
    76.                
    77.         }
    78.                         //(STC直接驱动数码管模块)
    79.     }
    80. }
    81. //用一个DisplayScan进行数码管的扫描显示用定时器0实现1ms切换一次的不断刷新显示数码管(STC直接驱动数码管模块)
    82. /********************** 显示扫描函数 ************************/
    83. void DisplayScan(void)
    84. {   
    85.         P0 = ~T_COM[3-display_index];                                                        //共阴需要取反                        //8位7改4
    86.         P2 = t_display[LED8[display_index]];                                                //共阴不用取反                                       
    87.     if(++display_index >= 4)    display_index = 0;  //8位结束回0          //8位改4位
    88. }
    89. /********************** Timer0 1ms中断函数 ************************/
    90. void timer0 (void) interrupt 1
    91. {
    92.     DisplayScan();  //1ms扫描显示一位
    93.     B_1ms = 1;      //1ms标志
    94. }
    95. //用一个DisplayScan进行数码管的扫描显示用定时器0实现1ms切换一次的不断刷新显示数码管(STC直接驱动数码管模块)
    复制代码



    再发PCB部分

    PCB预览

    PCB预览

    PCB_6.5okokPCB_PT100测温LQFp32不用TM1640直接显示LED_2024-04-25.rar (51.27 KB, 下载次数: 4)



    //显示数码管更新内容
    xsbl=105;
    LED8[0]=xsbl % 10;       
    LED8[1]=xsbl % 100/10;
    LED8[2]=xsbl % 1000/100;
    LED8[3]=xsbl % 10000/1000;

    //特别显示功能(数码管)
    //第4位
    if (xsbl<1000)
    {
    LED8[3]=0x10;//屏蔽无效显示
            if (fushu==1)
    {
    LED8[3]=0x11;//如果是负数就改成一个负号
    }
    }       

    if (xsbl<100)
    {
    LED8[3]=0x10;//屏蔽无效显示
    LED8[2]=0x10;//屏蔽无效显示
           
            if (fushu==1)
    {
    LED8[2]=0x11;//屏蔽无效显示
    }
    }

    LED8[1]=LED8[1]+0x20;//显示小数点1位
           
    //特别显示功能(数码管)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 08:58
  • 签到天数: 42 天

    [LV.5]常住居民I

    11

    主题

    112

    回帖

    232

    积分

    中级会员

    积分
    232
     楼主| 发表于 2024-4-27 00:07:13 | 显示全部楼层
    好吧STC8H8K64U显示数码管也显示了。14行代码。
    1. /*************  功能说明    **************
    2. 本例程基于STC8H8K64U为主控芯片的实验箱进行编写测试,STC8G、STC8H系列芯片可通用参考.
    3. ******************************************/
    4. #include "stc8h.h"       //包含此头文件后,不需要再包含"reg51.h"头文件
    5. void main()
    6. {         
    7.       P0M0 = 0x00; P0M1 = 0x00;
    8.                         P2M0 = 0xff;        P2M1 = 0x00;        
    9.     while (1)
    10.         {       
    11.                 P2=0x3f;
    12.                 P0=0x00;                       
    13.         }
    14. }
    复制代码
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-6 01:09 , Processed in 0.078240 second(s), 68 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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