找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 5458|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

STM32自動(dòng)光控窗簾程序+Proteus仿真圖 H橋L298驅(qū)動(dòng)電機(jī)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
基于STM32F103設(shè)計(jì)的智能光控窗簾,包含STM32芯片、光敏電阻、LCD1602顯示屏、電機(jī)驅(qū)動(dòng)控制模塊等。
備注:通過ARM內(nèi)部的ADC采集光敏電阻電壓,判斷電壓值
光強(qiáng)檢測(cè)模塊:光敏電阻,對(duì)光照強(qiáng)度不同,阻值不同。并通過ARM內(nèi)部的ADC采集光敏電阻電壓,判斷電壓值。電壓值低于設(shè)定的值,表示光強(qiáng)太弱,打開窗簾;電壓大于設(shè)定的參考電壓值,表示光強(qiáng)太強(qiáng),關(guān)閉窗簾;光強(qiáng)合適,顯示OK,電機(jī)不轉(zhuǎn),表示窗簾不動(dòng)。

液晶顯示模塊:液晶顯示High,表示光強(qiáng)太強(qiáng);液晶顯示OK,表示光強(qiáng)合適;液晶顯示Low,表示光強(qiáng)太弱LCD1602顯示光強(qiáng)度。
資料內(nèi)部包含STM32程序和Proteus仿真。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)



液晶顯示High,表示光強(qiáng)太強(qiáng)
液晶顯示OK,表示光強(qiáng)合適
液晶顯示Low,表示光強(qiáng)太弱

L298  H橋,電機(jī)驅(qū)動(dòng)芯片
光強(qiáng)太弱,表示光線不好,應(yīng)該開窗
光強(qiáng)太強(qiáng),表示光線強(qiáng),關(guān)窗
光敏電阻,對(duì)光照強(qiáng)度不同,阻值不同
電壓是模擬量,所以使用AD采集,AD值模擬量轉(zhuǎn)數(shù)字量,這樣ARM就可以知道當(dāng)前電壓值

單片機(jī)源程序如下:
  1. #include "stm32f10x.h"
  2. #include "bsp-lcd1602.h"
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "adc.h"


  6. void L298_GPIO( void )
  7. {
  8.         GPIO_InitTypeDef GPIO_InitStructure;         
  9.         
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  11.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  12.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  13.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
  14.         GPIO_Init(GPIOC, &GPIO_InitStructure);        
  15. }

  16. void OPEN(void)        //left moto is runing, but right moto is brake
  17. {
  18.         GPIO_SetBits(GPIOC,GPIO_Pin_5);
  19.         GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  20.         GPIO_ResetBits(GPIOC,GPIO_Pin_3);
  21.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  22.         GPIO_SetBits(GPIOC,GPIO_Pin_1);        
  23.         GPIO_SetBits(GPIOC,GPIO_Pin_0);
  24. }
  25. void CLOSE(void)        //right moto is runing, but left moto is brake
  26. {
  27.         GPIO_ResetBits(GPIOC,GPIO_Pin_5);
  28.         GPIO_ResetBits(GPIOC,GPIO_Pin_4);
  29.         GPIO_SetBits(GPIOC,GPIO_Pin_3);
  30.         GPIO_ResetBits(GPIOC,GPIO_Pin_2);
  31.         GPIO_SetBits(GPIOC,GPIO_Pin_1);        
  32.         GPIO_SetBits(GPIOC,GPIO_Pin_0);
  33. }

  34. void STOP(void)        //right moto is runing, but left moto is brake
  35. {
  36.         GPIO_SetBits(GPIOC,GPIO_Pin_5);
  37.         GPIO_SetBits(GPIOC,GPIO_Pin_4);
  38.         GPIO_SetBits(GPIOC,GPIO_Pin_3);
  39.         GPIO_SetBits(GPIOC,GPIO_Pin_2);
  40.         GPIO_SetBits(GPIOC,GPIO_Pin_1);        
  41.         GPIO_SetBits(GPIOC,GPIO_Pin_0);
  42. }


  43. int main(void)
  44. {
  45. int a,b,c,d;
  46.         float temp;
  47.         
  48.         delay_init();                     //延時(shí)函數(shù)初始化                  
  49.         LCD1602_Init();
  50.     ADC1_GPIO_Config();
  51.         L298_GPIO();
  52.     ADC_Config();  
  53.         LCD1602_ShowStr(0,0,"  Auto curtain ",15);
  54.         LCD1602_ShowStr(0,1,"Light:",6);
  55.         
  56.         while(1)
  57.         {
  58.                 b=ADC_GetConversionValue(ADC1);
  59.                 temp=b*(3.4/4096)*10;
  60.                 //表示光線太弱
  61.                 if( temp < 8 )
  62.                 {
  63.                         LCD1602_ShowStr(7,1,"open ",4);
  64.                         OPEN();
  65.                 }
  66.                 else
  67.                 {
  68.                         if( temp < 25)                                //光線合適
  69.                         {
  70.                                 LCD1602_ShowStr(7,1,"OK  ",4);
  71.                                 STOP();
  72.                         }
  73.                         else                                                //光線太強(qiáng)
  74.                         {
  75.                                 LCD1602_ShowStr(7,1,"close",4);
  76.                                 CLOSE();
  77.                         }
  78.                 }
  79. //                a=temp/1;
  80. //                c=temp*10;
  81. //                d=c%10;
  82. //                LCD_ShowNum(11,0,a);
  83. //                LCD_ShowNum(13,0,d);
  84.         }
  85. }
復(fù)制代碼

Keil5代碼與Proteus8.8仿真下載(注意不要使用其他版本):
STM32光控窗簾.7z (287.88 KB, 下載次數(shù): 281)
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏9 分享淘帖 頂2 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:526735 發(fā)表于 2022-5-19 12:12 | 只看該作者
你這個(gè)文件只能用Proteus8.8打開,其他版本運(yùn)行就死機(jī)
回復(fù)

使用道具 舉報(bào)

板凳
ID:406994 發(fā)表于 2022-5-23 16:51 | 只看該作者
只能用Proteus8.8這個(gè)版本
回復(fù)

使用道具 舉報(bào)

地板
ID:1028005 發(fā)表于 2022-5-28 11:55 | 只看該作者
繁星落葉 發(fā)表于 2022-5-23 16:51
只能用Proteus8.8這個(gè)版本

如果用proteus8.9畫出來(lái),然后用這個(gè)代碼可以運(yùn)行得出來(lái)嗎
回復(fù)

使用道具 舉報(bào)

5#
ID:1030245 發(fā)表于 2022-5-28 12:04 | 只看該作者
寫的不錯(cuò) 對(duì)自己橫有幫助
回復(fù)

使用道具 舉報(bào)

6#
ID:1028005 發(fā)表于 2022-5-28 12:42 | 只看該作者
繁星落葉 發(fā)表于 2022-5-23 16:51
只能用Proteus8.8這個(gè)版本

用8.9的版本可以嗎
回復(fù)

使用道具 舉報(bào)

7#
ID:993268 發(fā)表于 2022-5-31 16:57 | 只看該作者
8.6版本可以用嗎
回復(fù)

使用道具 舉報(bào)

8#
ID:543845 發(fā)表于 2022-6-23 14:04 | 只看該作者
運(yùn)行后無(wú)反應(yīng)。
回復(fù)

使用道具 舉報(bào)

9#
ID:262 發(fā)表于 2022-6-23 14:29 | 只看該作者
Michael_xie 發(fā)表于 2022-6-23 14:04
運(yùn)行后無(wú)反應(yīng)。

有反應(yīng),你看我運(yùn)行的效果就知道了,你可能沒有使用作者指定的Proteus8.8版本,或者你的安裝有問題

51hei.gif (208.05 KB, 下載次數(shù): 95)

51hei.gif
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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