找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1591|回复: 3
收起左侧

这个单片机程序的思路?看不懂

[复制链接]
ID:724177 发表于 2020-4-25 21:31 | 显示全部楼层 |阅读模式
本人c学的很差,下面是哥们写的程序,看不懂思路,没法写文档啊,求大佬指点迷津。(stc89c52的恒温控制系统)下面是主函数。

  1. #include "reg52.h"
  2. #include<stdio.h>
  3. #include "1602.h"
  4. #include "delay.h"
  5. #include "bsp_ds18b20.h"
  6. #include "bsp_key.h"

  7. #define SWITCH_ON  0
  8. #define SWITCH_OFF 1
  9. sbit SWITCH_IO1 = P2^6; //定义降温开关IO
  10. sbit SWITCH_IO2 = P2^5; //定义升温开关IO

  11. sbit BEEP = P2^7;//定义蜂鸣器IO
  12. unsigned char Set_temperature = 25; //定义控制温度变量 初始值25度
  13. bit Set_flag = 0;//定义设置标志位 0是未设置状态 1是设置状态

  14. void main()
  15. {
  16.     unsigned char i;
  17.     char buff[20];
  18.     unsigned char key_num = 0;//定义键值临时变量
  19.     float temp = 0;//定义温度临时变量
  20.     LCD_Init();           //初始化液晶
  21.     DelayMs(20);          //延时有助于稳定
  22.     LCD_Clear();          //清屏
  23.     Lcd_User_Chr();       //写入自定义字符
  24.     for(i=0; i<40; i++)//上电启动读取40次温度值
  25.     {
  26.         temp = ds18b20ReadTemperature();//读取温度
  27.         DelayMs(10); //延时10ms
  28.     }
  29.     while (1)//进入循环
  30.     {
  31.         temp = ds18b20ReadTemperature();//读取温度
  32.         if(temp > 0 && temp < 100)//如果读取温度大于0小于100
  33.         {
  34.             Ds18b20_temperature = temp; //温度赋值      
  35.         }
  36.         /*************显示温度**************/
  37.         if(Ds18b20_temperature < 10)
  38.             sprintf(buff,"Temp:  %0.1f", Ds18b20_temperature); //温度组包
  39.         else
  40.             sprintf(buff,"Temp: %0.1f", Ds18b20_temperature);
  41.         LCD_Write_String(3,0,buff);
  42.         sprintf(buff,"Set : %02d", (int)Set_temperature);
  43.         LCD_Write_String(3,1,buff);//更新显存
  44.         key_num = keyScan();//读取键值
  45.         if(key_num != 0)//如果键值不为0
  46.         {
  47.             switch(key_num)
  48.             {
  49.                 case 1://按键1按下
  50.                     Set_flag = !Set_flag;//设置标志位取反 0是未设置状态 1是设置状态
  51.                     if(Set_flag == 0)//根据设置标志位显示箭头指示
  52.                         LCD_Write_Char(0, 1, ' ');
  53.                     else
  54.                         LCD_Write_Char(0, 1, '>');
  55.                     break;
  56.                 case 2:
  57.                     if(Set_flag == 1)//如果当前状态为设置状态
  58.                     {
  59.                         Set_temperature++ ; //温度+1
  60.                         if(Set_temperature > 99)//最大值限位
  61.                             Set_temperature = 99;
  62.                     }
  63.                     break;
  64.                 case 3:
  65.                     if(Set_flag == 1)//如果当前状态为设置状态
  66.                     {
  67.                         Set_temperature--; //温度-1
  68.                         if(Set_temperature > 99)//最小值限位
  69.                             Set_temperature = 0;
  70.                     }
  71.                     break;                                                              
  72.             }               
  73.         }
  74.         if((int)Ds18b20_temperature == Set_temperature)//如果当前温度等于设定温度
  75.         {
  76.             SWITCH_IO1 = SWITCH_OFF;//散热开关关闭
  77.             SWITCH_IO2 = SWITCH_OFF;//加热开关关闭
  78.             BEEP = SWITCH_OFF;//蜂鸣器报警关闭
  79.         }
  80.         else if((int)Ds18b20_temperature > Set_temperature)//如果当前温度大于设定温度
  81.         {
  82.             SWITCH_IO1 = SWITCH_ON;//散热开关关闭
  83.             SWITCH_IO2 = SWITCH_OFF;//加热开关开启
  84.             BEEP = SWITCH_ON;//蜂鸣器报警开启
  85.         }
  86.         else if((int)Ds18b20_temperature < Set_temperature)//如果当前温度小于设定温度
  87.         {
  88.             SWITCH_IO1 = SWITCH_OFF;//散热开关关闭
  89.             SWITCH_IO2 = SWITCH_ON;//加热开关开启
  90.             BEEP = SWITCH_ON;//蜂鸣器报警开启
  91.         }

  92.     }
  93. }
复制代码




回复

使用道具 举报

ID:462827 发表于 2020-4-26 01:30 | 显示全部楼层
注释都写这么详细了你还看不懂,那真的是不适合编程。这个还只是简单地比较然后升降温,要是PID那你更是看天书了。
回复

使用道具 举报

ID:731058 发表于 2020-4-26 02:11 来自手机 | 显示全部楼层
把c语言的书多看看,多敲就对了
回复

使用道具 举报

ID:282850 发表于 2020-4-26 15:05 | 显示全部楼层
你哥们已经良心大大地好了,基本每句都用汉语注释,其实有1/10的注释就正常了。
汉语是看不懂呢,还是....?
LCD_Init();           //初始化液晶
   LCD_Clear();          //清屏
这些基本上没人会注释。

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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