找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 2804|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

stm32單片機智能窗簾系統(tǒng)設(shè)計 再次燒入時就不行了 附程序原理圖PCB

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1024398 發(fā)表于 2022-5-8 08:21 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
500黑幣
在某一個寶入的,但是再燒入時就不行了。
是基于STM32單片機的智能窗簾,程序是有問題奮斗了一晚上,實在不行了,有沒有大佬有里面的驅(qū)動程序



Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


STM32單片機源程序如下:
  1. #include "my_include.h"
  2. //**All notes can be deleted and modified**//
  3. #define MAX_SET_SIZE 7
  4. u16 setParaTab[MAX_SET_SIZE]={0,50,32,65,20,8*100,9*100};//要設(shè)置的閾值 順序為 0空白非設(shè)置狀態(tài) 1光照 2溫度 3濕度 4雨滴
  5. u8 setParaCount =0;//當(dāng)前要設(shè)置的變量在數(shù)組中位置

  6. u8 setMode =0;//設(shè)置模式
  7. u8 updataDis =1;//需要更新顯示標(biāo)志

  8. u16 timeStart1 = 8*100;//設(shè)置 開始時間為08:00
  9. u16 timeStop1 = 9*100;//設(shè)置 結(jié)束時間為09:00

  10. char dis0[50];//液晶顯示暫存數(shù)組
  11. char dis1[128];//液晶顯示暫存數(shù)組

  12. #define F_SIZE      16
  13. #define MyLCD_Show(m,n,p)     LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(24,n),p,F_SIZE,false)
  14. #define ALLPARA_START_Y 3 //數(shù)據(jù)顯示行的起始值

  15. int nowYedi = 0;//液滴檢測
  16. int nowLigh = 0;//ad采集結(jié)果 光照值

  17. u8 disFlag = 0;//更新顯示

  18. u8 rememberTiemSe=0xff;//記錄當(dāng)前秒數(shù)據(jù) 數(shù)據(jù)沒有變化不更新顯示 因為lcd更新顯示很浪費時間
  19. u8 devOpenFLag =0;//用于記錄設(shè)備是否需要打開狀態(tài)
  20. u16 time_now = 0;//計算當(dāng)前的時間,用于比較

  21. void OnGetEspMessage(const _esp_msg_obj *espMsgRec)
  22. {
  23.     char *strPtr;
  24.     if((strPtr=strstr(espMsgRec->payload,"RTC"))!=NULL)//接收到rtc字符串 *RTC20200420173611#
  25.     {
  26.         My_RTC_SetStr(strPtr+3);//設(shè)置時間
  27.     }
  28.     if((strPtr=strstr(espMsgRec->payload,"LG"))!=NULL)//接收到LG字符串 *50#
  29.     {
  30.         setParaTab[1]=ParseInteger(strPtr+2,2);//提取光照
  31.     }
  32.     if((strPtr=strstr(espMsgRec->payload,"WD"))!=NULL)//接收到rtc字符串
  33.     {
  34.         setParaTab[2]=ParseInteger(strPtr+2,2);//提取光照
  35.     }
  36.     if((strPtr=strstr(espMsgRec->payload,"SD"))!=NULL)//接收到rtc字符串
  37.     {
  38.         setParaTab[3]=ParseInteger(strPtr+2,2);//提取光照
  39.     }
  40.     if((strPtr=strstr(espMsgRec->payload,"YD"))!=NULL)//接收到rtc字符串
  41.     {
  42.         setParaTab[4]=ParseInteger(strPtr+2,2);//提取光照
  43.     }
  44.     if((strPtr=strstr(espMsgRec->payload,"TIME"))!=NULL)//接收到字符串*TIME0800-0900#
  45.     {
  46.         timeStart1 = ParseInteger(strPtr+4,4);//計算閾值
  47.         timeStop1 = ParseInteger(strPtr+9,4);//計算閾值
  48.     }
  49.     if((strPtr=strstr(espMsgRec->payload,"MD"))!=NULL)//接收到字符串
  50.     {
  51.         if(*(strPtr+2)=='2')setMode = 2;//定時模式
  52.         else if(*(strPtr+2)=='1')setMode = 1;//手動模式
  53.         else if(*(strPtr+2)=='0')setMode = 0;//自動模式
  54.     }
  55.     if(setMode == 1)//手動模式下才進行控制
  56.     {
  57.         if((strPtr=strstr(espMsgRec->payload,"LD"))!=NULL)//接收到字符串
  58.         {
  59.             if(*(strPtr+2)=='1')led_gl = LED_ON;//打開
  60.             else if(*(strPtr+2)=='0')led_gl = LED_OFF;//關(guān)閉
  61.         }
  62.         if((strPtr=strstr(espMsgRec->payload,"DV"))!=NULL)//接收到字符串
  63.         {
  64.             if(*(strPtr+2)=='1')devOpenFLag = 1;//打開
  65.             else if(*(strPtr+2)=='0')devOpenFLag = 0;//關(guān)閉
  66.         }
  67.     }
  68.     updataDis=1;//需要更新顯示參數(shù)
  69. }

  70. void initLcdDisplay(void);//初始化液晶顯示
  71. void scanKeyAnddealKey(void);
  72. void displayOfCollectedData(void);

  73. void write_FlashBuf(void);
  74. void read_FlashBuf(void);
  75. void init_FlashBuf(void);
  76. void keySetTime( void );

  77. int main(void)
  78. {
  79.     USARTx_Init(USART1,9600); //初始化串口 及波特率
  80.     USARTx_Init(USART2,2400);
  81.     My_RTC_Init(false); //初始化 rtc
  82.     My_ADC_Init(ADC1);
  83.     My_KEY_Init();
  84.     My_LED_Init(); //輸出初始化
  85.    
  86.     init_FlashBuf();//初始化flash中數(shù)據(jù)
  87.    
  88.     led_gl=0;//上電硬件動作下
  89.     delay_ms(200);
  90. led_gl=1;

  91.     LCD_Init();   //tft初始化
  92.     DHT11_Init();//初始化dht11
  93.     LCD_Clear(Color16_BLACK);//清全屏
  94.     BACK_COLOR=Color16_BLACK;FRONT_COLOR=Color16_LIGHTBLUE;
  95.     keySetTime();//進入按鍵設(shè)置時鐘 如果是有無線通信的情況下 該按鍵設(shè)置可以取消
  96.     MyLCD_Show(1,1,"WiFi init.. ");//顯示
  97.     MyLCD_Show(1,2,"Please Waitting.. ");//顯示
  98.     Esp8266_Init_StationAP("AUAISOUT000","");
  99.     initLcdDisplay(); //上電初始化顯示內(nèi)容
  100.     My_StepMotor_Init();//步進電機驅(qū)動 初始化
  101.             
  102.     while(1)
  103.     {
  104.         scanKeyAnddealKey(); //按鍵掃描及處理
  105.         if(disFlag == 1)//更新顯示
  106.         {
  107.             disFlag =0;
  108.             FRONT_COLOR=Color16_LIGHTBLUE;
  109.             if(rememberTiemSe!=calendar.second) //時間發(fā)生了變化 更新顯示
  110.             {
  111.                 rememberTiemSe = calendar.second;//記錄此刻時間
  112.                 sprintf((char*)dis0,"%04d-%02d-%02d %02d:%02d:%02d %d ",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second,calendar.week);//年月日周
  113.                 MyLCD_Show(4,1,dis0);//顯示
  114.             }
  115.    
  116.             nowYedi = 99 -  My_ADC_GetPercent(ADC1,ADC_Channel_1,1,50,1850)*0.99;//m通道采集n次 然后將采集結(jié)果按照50-1800轉(zhuǎn)化為0-100顯示 也就是顯示比例
  117.             if(nowYedi > 100) nowYedi= 99;//防止出現(xiàn)超過100%數(shù)據(jù)
  118.             
  119.             nowLigh = My_ADC_GetLight(ADC1,ADC_Channel_2,1); //讀取ad值 轉(zhuǎn)化為0-1000
  120.             DHT11_ReadData(0);
  121.             
  122.             displayOfCollectedData();//顯示采集到的數(shù)據(jù) 并進行數(shù)據(jù)對比

  123.             if(setMode == 0)//自動模式 異常數(shù)據(jù) 報警
  124.             {
  125.                 if(nowLigh<setParaTab[1]){led_gl = LED_ON;} //光線過低 打開
  126.                 else {led_gl = LED_OFF;}
  127.                 if(nowLigh<setParaTab[1]||(DHT11_GetHumi(0)>setParaTab[3])||(nowYedi>setParaTab[4]))
  128.                     {devOpenFLag = 0;} //關(guān)閉設(shè)備
  129.                 else {devOpenFLag = 1;}
  130.             }
  131.             else if(setMode == 2)//定時模式
  132.             {
  133.                 time_now = calendar.hour*100 + calendar.minute;//計算當(dāng)前時間
  134.                 if(time_now>=timeStart1 && time_now<=timeStop1)//如果當(dāng)前在定時時間范圍內(nèi)
  135.                 {devOpenFLag = 1;}//打開設(shè)備
  136.                 else
  137.                 {devOpenFLag = 0;} //關(guān)閉設(shè)備
  138.             }
  139.             
  140.             if(devOpenFLag==1) //無論哪一種模式下 需要控制步進電器旋轉(zhuǎn)到一周
  141.             {My_StepMotor_RotateToAngle(0,360);} //轉(zhuǎn)動一周
  142.             else
  143.             {My_StepMotor_RotateToAngle(0,0);}//轉(zhuǎn)動回原位置

  144.                     
  145.             sprintf((char*)dis1,"*D%04d%02d%02d%02d%02d%02d",calendar.year,calendar.month,calendar.day,calendar.hour,calendar.minute,calendar.second);//年月日周
  146.             sprintf(dis1,"G%03dT%03dH%03dY%03d",nowLigh,DHT11_GetTemp(0),DHT11_GetHumi(0),nowYedi);
  147.             sprintf((char*)dis1,"P%04d%04d",timeStart1,timeStop1);
  148.             sprintf(dis1,"g%03dt%03dh%03dy%03d",setParaTab[1],setParaTab[2],setParaTab[3],setParaTab[4]);
  149.             sprintf(dis1,"%s%sM%d#",(devOpenFLag == 1)?"R1":"R0",(led_gl == 0)?"L1":"L0",(int)setMode);
  150.             
  151.             My_ESP8266_SendStrToAll(dis1);//發(fā)送數(shù)據(jù)
  152.         }
  153.         My_ESP8266_Process();//處理串口數(shù)據(jù)
  154.     }   
  155. }

  156. void scanKeyAnddealKey(void)
  157. {
  158.         u8 i ;
  159.         u8 disYplace=0; //顯示所在行遞增變量
  160.         My_KeyScan();
  161.         if(KeyIsPress(KEY_4))
  162.         {
  163.             setMode++;//模式切換
  164.             if(setMode >= 3 )setMode =0;//模式切換
  165.         }
  166.         switch(setMode)
  167.         {
  168.             case 0: //自動模式
  169.                         if(KeyIsPress(KEY_1))
  170.                         {
  171.                             setParaCount++;//切換設(shè)置當(dāng)前參數(shù)
  172.                             if(setParaCount>=MAX_SET_SIZE-2)
  173.                             {
  174.                                 setParaCount=0;//設(shè)置當(dāng)前參數(shù)
  175.                                 write_FlashBuf();//將設(shè)置量寫入flash
  176.                             }
  177.                         }
  178.                         if(KeyIsPress(KEY_2))
  179.                         {
  180.                             if(setParaTab[setParaCount]<100)setParaTab[setParaCount]++;
  181.                         }
  182.                         if(KeyIsPress(KEY_3))
  183.                         {
  184.                             if(setParaTab[setParaCount]>0)setParaTab[setParaCount]--;
  185.                         }
  186.                         break;
  187.             case 1: //手動模式
  188.                         if(KeyIsPress(KEY_3)){led_gl = !led_gl;} //手動切換狀態(tài)
  189.                         if(KeyIsPress(KEY_2)){devOpenFLag=0;}//啟動
  190.                         if(KeyIsPress(KEY_1)){devOpenFLag =1;}//手動切換狀態(tài)
  191.                         setParaCount=0;//取消設(shè)置
  192.                         break;
  193.             default: break;
  194.         }
  195.         if(HasKeyEvent()||updataDis==1)//有任何按鍵按下 或者需要數(shù)據(jù)更新 否則更新過于頻繁浪費時間
  196.         {
  197.             if(updataDis==1)write_FlashBuf();//將設(shè)置量寫入flash 可能串口數(shù)據(jù)有更新
  198.             updataDis =0;//需要數(shù)據(jù)更新 處理
  199.             disYplace=ALLPARA_START_Y;
  200.             FRONT_COLOR=Color16_LIGHTGRAY;
  201.             for(i=1;i<MAX_SET_SIZE-2;i++) //顯示設(shè)置位置及設(shè)置參數(shù) 設(shè)置數(shù)組第一個數(shù)據(jù)為空白非設(shè)置參數(shù) 所以從1開始
  202.             {
  203.                 sprintf(dis0,"%d  ",setParaTab[i]);
  204.                 MyLCD_Show(20,disYplace,dis0);//顯示
  205.                 if(i == setParaCount)
  206.                     {MyLCD_Show(19,disYplace++,">");}//對所在設(shè)置位置 顯示>
  207.                 //**All notes can be deleted and modified**//
  208.             }
  209.         }
  210. }


  211. void initLcdDisplay(void) //初始化液晶顯示
  212. {
  213.     u8 disYplace=0; //顯示所在行遞增變量
  214.    
  215.     LCD_Clear(Color16_BLACK);//清全屏
  216.     BACK_COLOR=Color16_BLACK;
  217.     FRONT_COLOR=Color16_LIGHTBLUE;
  218. //MyLCD_Show(5,0,"智能家居設(shè)備",24,0);//顯示
  219.     LCD_ShowString(LCD_GetPos_X(24,5),LCD_GetPos_Y(24,0),"智能家居設(shè)備",24,false);
  220.     FRONT_COLOR=Color16_LIGHTBLUE;
  221.     MyLCD_Show(4,2,"  參數(shù)         閾值   ");//顯示
  222.     FRONT_COLOR=Color16_LIGHTGRAY;disYplace=ALLPARA_START_Y; //開始依次顯示
  223.     MyLCD_Show(1,disYplace++,"光照: ");//顯示
  224.     MyLCD_Show(1,disYplace++,"溫度: ");//顯示
  225.     MyLCD_Show(1,disYplace++,"濕度: ");//顯示
  226.     MyLCD_Show(1,disYplace++,"雨水: ");//顯示
  227.     MyLCD_Show(1,disYplace++,"設(shè)備狀態(tài): ");//顯示
  228.     MyLCD_Show(1,disYplace++,"LED狀態(tài) : ");//顯示
  229.     MyLCD_Show(1,disYplace++,"模式: ");//顯示
  230.     MyLCD_Show(1,disYplace++,"開時間段: ");//顯示

  231. }

  232. void displayOfCollectedData(void) //在disFlag 中處理
  233. {
  234.     static u8  remDevFlag =0xff;//記錄上一次 繼電器 設(shè)置狀態(tài)
  235.     static u8  remLedFlag =0xff;//記錄上一次 led 設(shè)置狀態(tài)
  236.     static u8 rememberMode =0xff;//記錄上一次設(shè)置狀態(tài)
  237.     static u16  remStartTp =0xffff;//記錄上一次 起始時間點
  238.     static u16  remStopTp =0xffff;//記錄上一次 結(jié)束時間點
  239.         
  240.     u8 disYplace=0;//顯示所在行遞增變量
  241.         
  242.     disYplace=ALLPARA_START_Y; //檢測異常參數(shù)
  243.     if(nowLigh<=setParaTab[1]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  244.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  245.     sprintf(dis0,"%2d ",nowLigh);
  246.     MyLCD_Show(7,disYplace++,dis0);//顯示

  247.     if(DHT11_GetTemp(0)>setParaTab[2]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  248.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  249.     sprintf(dis0,"%02d'C ",DHT11_GetTemp(0));
  250.     MyLCD_Show(7,disYplace++,dis0);//顯示

  251.     if(DHT11_GetHumi(0)>setParaTab[3]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  252.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  253.     sprintf(dis0,"%02d%% ",DHT11_GetHumi(0));
  254.     MyLCD_Show(7,disYplace++,dis0);//顯示

  255.     if(nowYedi>setParaTab[4]){FRONT_COLOR=Color16_RED;}//切換 顯示顏色
  256.     else FRONT_COLOR=Color16_LIGHTBLUE;//切換 顯示顏色
  257.     sprintf(dis0,"%2d ",nowYedi);
  258.     MyLCD_Show(7,disYplace++,dis0);//顯示

  259.     FRONT_COLOR=Color16_LIGHTBLUE;
  260.     if(remDevFlag != devOpenFLag) //繼電器狀態(tài)發(fā)生變化
  261.     {
  262.         remDevFlag = devOpenFLag;
  263.         if(devOpenFLag == 0)MyLCD_Show(11,disYplace," 關(guān) ");//顯示
  264.         else MyLCD_Show(11,disYplace," 開 ");//顯示
  265.     }disYplace++;
  266.    
  267.     if(remLedFlag != led_gl) //LED狀態(tài)發(fā)生變化
  268.     {
  269.         remLedFlag = led_gl;
  270.         if(led_gl == LED_OFF)MyLCD_Show(11,disYplace," 關(guān) ");//顯示
  271.         else MyLCD_Show(11,disYplace," 開 ");//顯示
  272.     }disYplace++;
  273.    
  274.     if(rememberMode != setMode)
  275.     {
  276.         rememberMode = setMode;//記錄設(shè)置模式
  277.         if(setMode == 0)MyLCD_Show(6,disYplace,"  自動  ");//顯示
  278.         else if(setMode == 1)MyLCD_Show(6,disYplace,"  手動  ");//顯示
  279.         else if(setMode == 2)MyLCD_Show(6,disYplace,"  定時  ");//顯示
  280.     }disYplace++;

  281.     if(remStartTp!=timeStart1 || remStopTp!=timeStop1)
  282.     {
  283.         remStartTp = timeStart1;remStopTp=timeStop1;
  284.         sprintf(dis0,"%02d:%02d-%02d:%02d ",timeStart1/100,timeStart1%100,timeStop1/100,timeStop1%100);
  285.         MyLCD_Show(11,disYplace,dis0);//顯示
  286.     }disYplace++;
  287.    
  288. }

  289. //#define FLASH_SAVE_ADDR  0X0800f800  
  290. #define FLASH_SAVE_ADDR             FLASH_BASE_ADDR+(STM32_FLASH_SIZE-1)*STM_SECTOR_SIZE
  291. // STM32F103C8T6 64KB FLASH,20KB RAM,1個扇區(qū)1KB,程序起始0x0800000到0x0800FFFF
  292. //建議使用0X0800e800 0X0800f000 0X0800F800
  293. /******************把數(shù)據(jù)保存到單片機內(nèi)部eepom中******************/
  294. void write_FlashBuf(void)
  295. {
  296.         setParaTab[5]=timeStart1;
  297.         setParaTab[6]=timeStop1;
  298.     My_STMFlash_Write(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數(shù)據(jù)
  299. }

  300. /******************把數(shù)據(jù)從單片機內(nèi)部eepom中讀出來*****************/
  301. void read_FlashBuf(void)
  302. {
  303.     My_STMFlash_Read(FLASH_SAVE_ADDR,(u16*)setParaTab,MAX_SET_SIZE);//讀取數(shù)據(jù)
  304.     timeStart1=setParaTab[5];
  305.     timeStop1 =setParaTab[6];
  306. }

  307. ……………………

  308. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

STM32單片機智能窗簾窗戶衣TFT屏138-STM32-138-RW2_4.7z

7.69 MB, 下載次數(shù): 26

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:1024398 發(fā)表于 2022-5-8 15:21 | 只看該作者
麻煩老哥們幫幫忙,
回復(fù)

使用道具 舉報

板凳
ID:96682 發(fā)表于 2022-5-9 11:25 來自觸屏版 | 只看該作者
把原程序燒入目標(biāo)芯片前還需正確設(shè)置各選項環(huán)節(jié),不知樓主的問題出在哪里
回復(fù)

使用道具 舉報

地板
ID:123289 發(fā)表于 2022-5-9 11:28 | 只看該作者
一步步地調(diào)試,看看哪里與你的程序不符。
回復(fù)

使用道具 舉報

5#
ID:1024398 發(fā)表于 2022-5-9 12:35 來自觸屏版 | 只看該作者
源程序是有問題的,被刪減了幾行
回復(fù)

使用道具 舉報

6#
ID:1025260 發(fā)表于 2022-5-10 07:12 來自觸屏版 | 只看該作者
源程序有問題,多調(diào)試一下
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表