找回密码
 立即注册

QQ登录

只需一步,快速开始

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

如何根据这个单片机程序来画出流程图呢?求指导

[复制链接]
跳转到指定楼层
楼主
ID:900367 发表于 2021-4-3 18:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于本论坛禁止伸手党,所以向大家请教一下大致的实现方法与思路,理清头绪后我自己来实现,谢谢大家

流程图,是51单片机连mq2气体传感器,LED灯,光敏,风扇,1602a液晶,温湿度传感器进行工作
有键盘:温度,湿度和切换+-模式,有上极限值

***************************main.c**********************
  1. #include "stc12c5a60s2.h"
  2. #include "intrins.h"
  3. #include "stdio.h"
  4. #include "math.h"
  5. #include "string.h"
  6. #include <stdlib.h>
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define u8 unsigned char
  10. #define u16 unsigned int
  11. #define vu8 unsigned char
  12. #define vu16 unsigned int
  13. #define vu32 unsigned long int
  14. vu8  sys[4];

  15. vu8  dat11[5];        
  16. void delayms(int z)//延时函数
  17. {
  18.         int x,y;
  19.         for(x=110*6;x>0;x--)
  20.                 for(y=z;y>0;y--);
  21. }

  22. #define delay_ms delayms
  23. #include "1602_12864.h"
  24. #include "eeprom.h"
  25. #include "adc.h"
  26. #include "usart.h"
  27. #include "ds18b20.h"
  28. #include "dht11.h"
  29. #include "display.h"
  30. #include "int.h"
  31. sbit k1=P2^5;
  32. sbit k2=P2^6;
  33. sbit k3=P2^7;
  34. sbit fs=P1^5;
  35. sbit led=P1^6;
  36. sbit gm=P1^3;
  37. vu8 CardID[4];
  38. void main(void)//
  39. {
  40.                 vu16 i,status,k,mq2;
  41.     LCD_Init();//液晶初始化
  42.                 Usart_Config(1);//串口1初始化
  43.                 Timer0_Init();//定时器0初始化
  44.                 SysRead((u8 *)&sys[0],4);//系统读取参数
  45.                 InitADC();
  46.                 while(1)
  47.     {
  48.                                 mq2=GetADCResult(7)/(1024.0/99.0);//mq-2气体传感器
  49.                                 DH11_GetTempDamp();//dht11温湿度传感器
  50.                                 if(gm==1)
  51.                                         led=0;//开灯
  52.                                 else
  53.                                         led=1;//关灯
  54.                                 display2(TempNow,DampNow,&sys[0],&sys[1]);
  55.                                 if((TempNow>sys[0])||(DampNow>sys[1]))   //风扇
  56.                                 {
  57.                                         fs=0;//打开风扇
  58.                                 }
  59.                                 else
  60.                                 {
  61.                                         fs=1;//关闭
  62.                                 }
  63.                                 k++;
  64.                                 if(k>12)    //通过SIM800a模块发送数据给手机app
  65.                                 {
  66.                                                 k=0;
  67.                                                 sendchar(1,'S');//固定字符S
  68.                                                 sendchar(1,'0');                                                
  69.                                                 sendchar(1,'1');
  70.                                                 sendchar(1,'0');        
  71.                                                 sendchar(1,TempNow/10+48);
  72.                                                 sendchar(1,TempNow%10+48);                                                
  73.                                                 sendchar(1,',');
  74.                                                 sendchar(1,DampNow/10+48);
  75.                                                 sendchar(1,DampNow%10+48);                                                
  76.                                                 sendchar(1,',');        
  77.                                                 sendchar(1,mq2/10+48);
  78.                                                 sendchar(1,mq2%10+48);                                                
  79.                                                 sendchar(1,',');
  80.                                                 sendchar(1,(vu8)gm+48);        
  81.                                                 sendchar(1,'E');//固定字符E                                       
  82.                                 }
  83.                                 delayms(100);
  84.                 }
  85. }

  86. ************************1602a液晶显示器****************************
  87. display.h

  88. #define disname1 "T1"
  89. #define disname2 "T2"
  90. #define disname3 "T3"
  91. #define disname4 "T4"
  92. #define disname1max 99
  93. #define disname2max 99
  94. #define disname3max 99
  95. #define disname4max 99

  96. sbit keys=P2^5;
  97. sbit key1=P2^6;
  98. sbit key2=P2^7;
  99. sbit key3=P3^7;
  100. sbit key4=P2^4;
  101. vu8 AddFlag=0;
  102. //display2(TempNow,DampNow,&sys[0],&sys[1]);        
  103. void display1(vu8 a1,vu8 *val1h)//只显示一组比较值
  104. {
  105.          if(keys==0)
  106.          {
  107.                                 (*val1h)--;
  108.                                 if((*val1h)>disname1max)
  109.                                         (*val1h)=disname1max;
  110.                                 SysSave((u8 *)&sys[0],2);
  111.          }
  112.          if(key1==0)
  113.          {
  114.                                 (*val1h)++;
  115.                                 if((*val1h)>disname1max)
  116.                                         (*val1h)=0;
  117.                         SysSave((u8 *)&sys[0],2);
  118.          }
  119.          LCD_DisStr(0,0,disname1);
  120.          LCDW_Dat(':');
  121.          LCDW_Dat(a1/10+48);
  122.          LCDW_Dat(a1%10+48);               
  123.          LCD_DisStr(1,0,"H:");
  124.          LCDW_Dat(*(val1h)/10+48);
  125.          LCDW_Dat(*(val1h)%10+48);
  126. }        

  127. void display2(vu8 a1,vu8 a2,vu8 *val1h,vu8 *val2h)

  128. {
  129.          if(keys==0)
  130.          {
  131.                         delayms(10);
  132.                   if(keys==0)
  133.                                 AddFlag=1-AddFlag;
  134.                         while(keys==0);
  135.          }
  136.          if(key1==0)
  137.          {
  138.                   if(AddFlag==0)
  139.                         {
  140.                                 (*val1h)++;
  141.                                 if((*val1h)>disname1max)
  142.                                         (*val1h)=0;
  143.                         }
  144.                         else
  145.                         {
  146.                                 (*val1h)--;
  147.                                 if((*val1h)>disname1max)
  148.                                         (*val1h)=disname1max;
  149.                         }                        
  150.                         SysSave((u8 *)&sys[0],2);
  151.          }
  152.          if(key2==0)
  153.          {
  154.                   if(AddFlag==0)
  155.                         {
  156.                                 (*val2h)++;
  157.                                 if((*val2h)>disname2max)
  158.                                     (*val2h)=0;
  159.                         }
  160.                         else
  161.                         {
  162.                                 (*val2h)--;
  163.                                 if((*val2h)>disname2max)
  164.                                         (*val2h)=disname2max;
  165.                         }               
  166.                         SysSave((u8 *)&sys[0],2);
  167.          }
  168.          LCD_DisStr(0,0,disname1);
  169.          LCDW_Dat(':');
  170.          LCDW_Dat(a1/10+48);
  171.          LCDW_Dat(a1%10+48);               
  172.          LCD_DisStr(0,12,"H:");
  173.          LCDW_Dat(*(val1h)/10+48);
  174.          LCDW_Dat(*(val1h)%10+48);
  175.          LCD_DisStr(1,0,disname2);
  176.          LCDW_Dat(':');
  177.          LCDW_Dat(a2/10+48);
  178.          LCDW_Dat(a2%10+48);        
  179.          LCD_DisStr(1,12,"H:");
  180.          LCDW_Dat(*(val2h)/10+48);
  181.          LCDW_Dat(*(val2h)%10+48);
  182. }        

  183. //显示4个参数,可调其值
  184. void display4(vu8 *val1,vu8 *val2,vu8 *val3,vu8 *val4)
  185. {         if(keys==0)
  186.          {
  187.                         delayms(10);
  188.                   if(keys==0)
  189.                                 AddFlag=1-AddFlag;
  190.                         while(keys==0);
  191.          }
  192.          if(key1==0)
  193.          {
  194.                   if(AddFlag==0)
  195.                         {
  196.                                 (*val1)++;
  197.                                 if((*val1)>disname1max)
  198.                                         (*val1)=0;
  199.                         }
  200.                         else
  201.                         {
  202.                                 (*val1)--;
  203.                                 if((*val1)>disname1max)
  204.                                         (*val1)=disname1max;
  205.                         }                        
  206.                         SysSave((u8 *)&sys[0],4);
  207.          }
  208.          if(key2==0)
  209.          {
  210.                   if(AddFlag==0)
  211.                         {
  212.                                 (*val2)++;
  213.                                 if((*val2)>disname2max)
  214.                                         (*val2)=0;
  215.                         }
  216.                         else
  217.                         {
  218.                                 (*val2)--;
  219.                                 if((*val2)>disname2max)
  220.                                         (*val2)=disname2max;
  221.                         }               
  222.                         SysSave((u8 *)&sys[0],4);
  223.          }
  224.          if(key3==0)
  225.          {
  226.                   if(AddFlag==0)
  227.                         {
  228.                                 (*val3)++;
  229.                                 if((*val3)>disname3max)
  230.                                         (*val3)=0;
  231.                         }
  232.                         else
  233.                         {
  234.                                 (*val3)--;
  235.                                 if((*val3)>disname3max)
  236.                                         (*val3)=disname3max;
  237.                         }               
  238.                         SysSave((u8 *)&sys[0],4);
  239.          }        
  240.          if(key4==0)

  241.          {
  242.                   if(AddFlag==0)
  243.                         {

  244.                                 (*val4)++;

  245.                                 if((*val4)>disname4max)

  246.                                         (*val4)=0;

  247.                         }

  248.                         else

  249.                         {

  250.                                 (*val4)--;

  251.                                 if((*val4)>disname4max)

  252.                                         (*val4)=disname4max;
  253.                         }               

  254.                         SysSave((u8 *)&sys[0],4);
  255.          }                  

  256.          LCD_DisStr(0,0,disname1);
  257.          LCDW_Dat(':');
  258.          LCDW_Dat(*(val1)/10+48);
  259.          LCDW_Dat(*(val1)%10+48);               
  260.          LCD_DisStr(0,16-strlen(disname2)-3,disname2);

  261.           LCDW_Dat(':');
  262.          LCDW_Dat(*(val2)/10+48);
  263.          LCDW_Dat(*(val2)%10+48);

  264.          LCD_DisStr(1,0,disname3);
  265.          LCDW_Dat(':');
  266.          LCDW_Dat(*(val3)/10+48);
  267.          LCDW_Dat(*(val3)%10+48);        
  268.          LCD_DisStr(1,16-strlen(disname4)-3,disname4);

  269.          LCDW_Dat(':');
  270.          LCDW_Dat(*(val4)/10+48);
  271.          LCDW_Dat(*(val4)%10+48);
  272. }        
复制代码


****************************dht11温湿度传感器***************************
dht11.h

  1. #define STC_1T

  2. sbit PIN_DHT11=P1^2;
  3. vu8 TempNow=0x01,DampNow=0x01;
  4. #ifdef STC_1T
  5.         void  Delay_10us(void)
  6.         {
  7.                 uchar i;
  8.                 i--;
  9.                 i--;
  10.                 i--;
  11.                 i--;
  12.                 i--;
  13.                 i--;
  14.                 i--;
  15.                 i--;
  16.                 i--;
  17.                 i--;
  18.                 i--;
  19.                 i--;        
  20.                 i--;
  21.                 i--;
  22.                 i--;
  23.                 i--;
  24.                 i--;
  25.                 i--;
  26.                 i--;
  27.                 i--;
  28.                 i--;
  29.                 i--;
  30.         }
  31.         vu8  COM(void)


  32.         {     
  33.                 uchar i,date=0,timeout;
  34.                 Delay_10us();        
  35.                 for(i=0;i<8;i++)           
  36.                 {
  37.                         date<<=1;
  38.                         timeout=2;        
  39.                         while((!PIN_DHT11)&&(timeout++))
  40.                                 Delay_10us();
  41.                         if(timeout==1)
  42.                                 break;//3¬ê±íË3ö
  43.                         //50usòÔoó¼ì2a

  44.                         Delay_10us();
  45.                         Delay_10us();
  46.                         Delay_10us();
  47.                         Delay_10us();
  48.                         Delay_10us();
  49.                         if(PIN_DHT11)
  50.                         {
  51.                                 date|=1;
  52.                                 timeout=2;
  53.                                 while((PIN_DHT11)&&(timeout++));
  54.                                 if(timeout==1)
  55.                                         break;//3¬ê±íË3ö
  56.                         }
  57.                 }        
  58.                 return date;
  59.         }
  60.         //éÏμçoó1ÃëμÄêy¾YÎ趨,2»òaéÏà-μç×è,2»è»IO¿úÎT·¨à-μí
  61.         void DH11_GetTempDamp(void)
  62.         {
  63.                 u16 i,y;
  64.                 vu8 tab[5],timeout;

  65.                 PIN_DHT11=0;
  66.                 for(i=110*6;i>0;i--)
  67.                         for(y=25;y>0;y--);
  68.                 PIN_DHT11=1;
  69.                 Delay_10us();
  70.                 Delay_10us();
  71.                 Delay_10us();
  72.                 Delay_10us();

  73.                 if(!PIN_DHT11)  
  74.                 {                        
  75.                         timeout=2;         
  76.                         while((!PIN_DHT11)&&(timeout++))
  77.                                 Delay_10us();
  78.                         timeout=2;
  79.                         while((PIN_DHT11)&&(timeout++));
  80.                                 Delay_10us();
  81.                         for(i=0;i<5;i++)
  82.                                 tab[i]=COM();                        
  83.                         PIN_DHT11=1;         
  84.                         if(tab[4]==(tab[0]+tab[1]+tab[2]+tab[3]))
  85.                         {
  86.                                 TempNow=tab[2];//tab[0]êÇêa¶èμÄÕûêy,tab[1]êÇD¡êy,tab[2]êÇζèÕûêy,tab[3]êÇêa¶èD¡êy
  87.                                                            //tab[4]êÇD£Ñéoí,êÇÇóoíoóμÄ×îμíλ
  88.                                 DampNow=tab[0];
  89.                         }                  
  90.                 }
  91.         }

  92. #else
  93. uchar TAB[4];
  94. uchar  U8FLAG,U8temp;
  95. uchar  U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  96. uchar  U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
  97. uchar  U8comdata;

  98. void  Delay_10us(void)
  99. {
  100.         uchar i;
  101.         i--;
  102.         i--;
  103.         i--;
  104.         i--;
  105.         i--;
  106.         i--;
  107. }

  108. void  COM(void)
  109. {     

  110.         uchar i;
  111.         Delay_10us();        
  112.         for(i=0;i<8;i++)           

  113.         {
  114.                 U8FLAG=2;        
  115.                 while((!PIN_DHT11)&&U8FLAG++);
  116.                 Delay_10us();
  117.                 Delay_10us();
  118.                 Delay_10us();
  119.                 U8temp=0;
  120.                 if(PIN_DHT11)

  121.                         U8temp=1;
  122.                 Delay_10us();
  123.                 U8FLAG=2;
  124.                 while((PIN_DHT11)&&U8FLAG++);         
  125.                 if(U8FLAG==1)

  126.                         break;                    
  127.                 U8comdata<<=1;
  128.                 U8comdata|=U8temp;
  129.         }         
  130. }


  131. void DH11_GetTempDamp(void)
  132. {
  133.         PIN_DHT11=0;
  134.         delayms(15);
  135.         PIN_DHT11=1;
  136.         Delay_10us();
  137.         Delay_10us();
  138.         Delay_10us();
  139.         Delay_10us();
  140.         PIN_DHT11=1;         
  141.         if(!PIN_DHT11)  
  142.         {
  143.                 U8FLAG=2;         
  144.                 while((!PIN_DHT11)&&U8FLAG++);
  145.                 U8FLAG=2;
  146.                 while((PIN_DHT11)&&U8FLAG++);         
  147.                 COM();
  148.                 U8RH_data_H_temp=U8comdata;
  149.                 COM();
  150.                 U8RH_data_L_temp=U8comdata;
  151.                 COM();
  152.                 U8T_data_H_temp=U8comdata;
  153.                 COM();
  154.                 U8T_data_L_temp=U8comdata;
  155.                 COM();
  156.                 U8checkdata_temp=U8comdata;
  157.                 PIN_DHT11=1;         
  158.                 U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
  159.                 if(U8temp==U8checkdata_temp)
  160.                 {
  161.                         U8RH_data_H=U8RH_data_H_temp;
  162.                         U8RH_data_L=U8RH_data_L_temp;
  163.                         U8T_data_H=U8T_data_H_temp;
  164.                         U8T_data_L=U8T_data_L_temp;
  165.                         U8checkdata=U8checkdata_temp;
  166.                 }
  167.                 TAB[0]=U8T_data_H/10;
  168.                 TAB[1]=U8T_data_H%10;         
  169.                 TAB[2]=U8RH_data_H/10;
  170.                 TAB[3]=U8RH_data_H%10;
  171.                 TempNow=U8T_data_H;
  172.                 DampNow=U8RH_data_H;
  173.         }
  174. }


  175. #endif
复制代码

视频https://share.weiyun.com/1FUq9s1c
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:584814 发表于 2021-4-9 08:55 | 只看该作者
第一步,通读全部程序,并理解;
第二步,根据程序过程写出各函数表达的目标;
第三步,结合全程序的理解和各函数的表达写出事件全过程;
第四步,不要已懂装不懂关键是要自己动手而不是只想伸手。
当然也有一步就可以完成的:高价上某一个宝
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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