久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

51單片機和步進電機的自動升降旗幟系統(tǒng)設(shè)計資料 含程序與電路等

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:380893 發(fā)表于 2018-7-30 15:32 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本系統(tǒng)采用單片機+LCD1602液晶+語音模塊+ULN2003驅(qū)動芯片+5線4相步進電機+按鍵模塊+遙控器模塊設(shè)計而成。
按鍵說明:
從左邊第一個起,升旗鍵、降旗鍵、停止鍵。
  
1. 單片機型號:STC89C52/51、AT89C52/51、AT89S52/51 可任選。

2.按下上升按鍵后,旗幟勻速上升,同時流暢地演奏歌。

3.上升到最高端時自動停止上升,歌停奏。

4.按下下降按鍵后,旗幟勻速下降,降旗的時間不放歌曲,下降到最低端時自動停止。

5.為避免誤動作,旗幟在最高端時,按上升鍵不起作用;旗幟在最低端時,按下降鍵不起作用。

6.液晶第二行數(shù)字即時顯示旗幟所在的高度。

7.可以通過遙控器控制旗幟升降和停止。

8.有旗幟升降和停止指示燈。


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


元件清單        
元件標號    元件名稱    數(shù)量
C1    10uf電解電容    1
C2, C3    30pf瓷片電容    2
C4    100uf電解電容    1
C6    470uf電解電容    1
D1, D2    IN4007二極管    2
IR1    1838紅外一體接收頭+紅外遙控    1
J1    電源接口    1
"K1, K2, K3, K4, K5, K6,
K7
"    輕觸按鍵    7
L1, L2, L3, L4    3mm紅色led燈    4
P1    LCD1602液晶顯示屏+16P插座    1
P2    4針排針    1
P4    排針+步進電機+旗桿    1
PR1    103排阻    1
R1    3K電阻    1
R2, R9    10K電阻    2
R3, R4    1K電阻    2
SP1    喇叭    1
SW1    自鎖開關(guān)    1
U1    STC89C52單片機+DIP40插座    1
U2    WT588D -16語音模塊+2*8P 圓頭插座    1
U3    ULN2003芯片+DIP16插座    1
Y1    12M晶振    1

單片機源程序如下:
  1. #include <reg52.h>                 //調(diào)用單片機頭文件
  2. #define uchar unsigned char  //無符路字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符路整型 宏定義        變量范圍0~65535
  4. #include "eeprom52.h"          //單片機存儲控制程序調(diào)用
  5. #include "LCD1602.h"         //LCD1602控制顯示程序調(diào)用

  6. sbit  VSDA = P3^5;         //語音控制IO口定義
  7. sbit  VCS  = P3^6;  
  8. sbit  VSCL = P3^7;
  9. sbit  key_1=P1^0;         //控制按鍵IO口
  10. sbit  key_2=P1^1;
  11. sbit  key_3=P1^2;
  12. sbit  key_4=P1^3;
  13. sbit  key_5=P1^4;
  14. sbit  key_6=P1^5;

  15. sbit led_1=P1^6;        //系統(tǒng)指示燈IO口
  16. sbit led_2=P1^7;
  17. sbit led_3=P3^0;
  18. sbit led_4=P3^1;



  19. uchar code zz[]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09}; //步進電機正轉(zhuǎn)動數(shù)據(jù)數(shù)組
  20. uchar code fz[]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};//步進電機反轉(zhuǎn)動數(shù)據(jù)數(shù)組

  21. uint UP_dat=0,Below_dat=0,Current_dat=0;
  22. //上移動的角度數(shù)據(jù)變量,下移動的角度數(shù)據(jù)變量,當前位置數(shù)據(jù)變量
  23. uchar Current_Height=0,circulation,speed_dat,dat_A;
  24. //當前旗幟的高度數(shù)據(jù)變量,步進電機循環(huán)控制變量,轉(zhuǎn)動速度控制變量,顯示當前高度變量
  25. uchar sys_state,state;
  26. //系統(tǒng)狀態(tài)變量 ,工作流程控制變量

  27. uchar irbyte[4];
  28. //分析紅外數(shù)據(jù)存數(shù)的32位數(shù)據(jù);
  29. uchar irtime,irflag,bitnum,irdateok;
  30. //脈沖周期計時便利阿尼哥,分析數(shù)據(jù)標志位,數(shù)據(jù)存入數(shù)組下標變量 ,數(shù)據(jù)接受完成標志位
  31. uchar irdate[33];
  32. //紅外信號的數(shù)據(jù)存儲數(shù)組

  33. /***********************小延時函數(shù)**************************/
  34. void  delay_us (unsigned int us)
  35. {

  36.         while(us--)
  37.         {
  38.                 _nop_();
  39.         }
  40. }

  41. /********************************************************************
  42. * 名稱 : delay_1ms()
  43. * 功能 : 延時1ms函數(shù)
  44. * 輸入 : q
  45. * 輸出 : 無
  46. ***********************************************************************/
  47. void delay_1ms(uint q)
  48. {
  49.         uint i,j;
  50.         for(i=0;i<q;i++)
  51.                 for(j=0;j<115;j++);
  52. }
  53.                                    
  54.                                           
  55. /************ 延時函數(shù)  *****************/
  56. void delay_uint(uint z)
  57. {
  58.    while(z--);
  59. }

  60. /***************清楚紅外信號暫存數(shù)組中的數(shù)據(jù)******************/
  61. void qing(void)         
  62. {
  63.    uint i;
  64.         for(i=0;i<33;i++)
  65.         {
  66.          irdate[i]=0;
  67.         }

  68. }
  69. /****************分析紅外信號32位數(shù)據(jù)***************/
  70. void deal_with(void)                  
  71. {
  72.         uchar i,j,k,temp;
  73.         k=1;
  74.         for(j=0;j<4;j++)
  75.         {
  76.                 for(i=0;i<8;i++)  //每8位數(shù)據(jù)切換一個數(shù)組單元
  77.                 {        
  78.                         temp=temp>>1;
  79.                         if(irdate[k]>7)          //根據(jù)脈沖周期的時長判斷紅外數(shù)據(jù)
  80.                         {
  81.                                 temp=temp|0x80;        
  82.                         }
  83.                         k++;
  84.                 }
  85.                 irbyte[j]=temp;
  86.         }
  87. }


  88. /***********************三線發(fā)碼子程序************************/
  89. void Send_threelines(unsigned char addr)   //控制語音模塊播放那段地址的語音
  90. {
  91.    unsigned char i;
  92.         VCS=0;
  93.         delay_1ms(5);  /* 片選拉低5ms */
  94.     for(i=0;i<8;i++)
  95.         {
  96.                 VSCL=0;
  97.                 if(addr&0x01)
  98.                 {
  99.                         VSDA=1;
  100.                 }
  101.                 else
  102.                         VSDA=0;
  103.                 addr>>=1;
  104.                 delay_us(150); /* 150us */
  105.                 VSCL=1;
  106.                 delay_us(150); /* 150us */
  107.         }
  108.         VCS=1;
  109.         delay_1ms(30);
  110. }


  111. /***************液晶初始化顯示函數(shù)**************/
  112. void show_init(void)
  113. {
  114.         LCD1602_write(0,0xC0);
  115.         LCD1602_writebyte("Height:14.0cm");//顯示旗桿總長度

  116.         LCD1602_write(0,0x80);
  117.         LCD1602_writebyte("C_Height:");        //顯示當前高度
  118.         LCD1602_write(1,0x30+Current_Height/100%10);   //十位
  119.         LCD1602_write(1,0x30+Current_Height/10%10);        //個位
  120.         LCD1602_writebyte(".");
  121.         LCD1602_write(1,0x30+Current_Height%10);  //0.1位
  122.         LCD1602_writebyte("cm");        //單位
  123. }

  124. void show(void)          //系統(tǒng)循環(huán)顯示函數(shù)
  125. {
  126.         LCD1602_write(0,0x89);                   //顯示當前旗幟高度
  127.         LCD1602_write(1,0x30+Current_Height/100%10);
  128.         LCD1602_write(1,0x30+Current_Height/10%10);
  129.         LCD1602_writebyte(".");
  130.         LCD1602_write(1,0x30+Current_Height%10);
  131. }

  132. //sys_state=0  為 旗低的狀態(tài)
  133. //sys_state=1 為 旗頂?shù)臓顟B(tài)
  134. //sys_state=2 為 半旗的狀態(tài)
  135. //sys_state=3 為 正在運行的一個狀態(tài)
  136. //sys_state=4 為 停止的一個狀態(tài)

  137. void key_code(void)        //系統(tǒng)按鍵檢測控制程序
  138. {
  139.         if(irdateok==1)        //如果紅外信號接收完成標志位觸發(fā)  則
  140.         {
  141.                 irdateok=0;
  142.                 deal_with();  //分析紅外數(shù)據(jù)
  143.         }
  144.         if((!key_1||irbyte[2]==0x44)&&sys_state==0)          //如果升全旗按鍵按下(按鍵以及紅外遙控)  并旗幟處于最低部
  145.         {                                                        //延時去抖
  146.                 delay_uint(1000);
  147.                 if(!key_1||irbyte[2]==0x44)        //再次判斷按鍵按下        
  148.                 {
  149.                         while(!key_1||irbyte[2]==0x44) //等待按鍵釋放
  150.                         {
  151.                                 qing();
  152.                                 deal_with();
  153.                         }
  154.                         state=1;        //跳轉(zhuǎn)升全旗流程節(jié)點
  155.                         sys_state=3;  //置為系統(tǒng)當前狀態(tài)
  156.                         led_1=0;         //對應(yīng)指示燈
  157.                 }        
  158.         }

  159.         if((!key_2||irbyte[2]==0x40)&&sys_state==1)          //如果將旗旗按鍵按下(按鍵以及紅外遙控)并旗幟處于最頂部
  160.         {
  161.                 delay_uint(1000); //延時去抖
  162.                 if(!key_2||irbyte[2]==0x40)        //再次判斷按鍵按下
  163.                 {
  164.                         while(!key_2||irbyte[2]==0x40) //等待按鍵釋放
  165.                         {
  166.                                 qing();
  167.                                 deal_with();
  168.                         }
  169.                         led_2=0;        //對應(yīng)指示燈        
  170.                         state=3;         //跳轉(zhuǎn)將全旗流程節(jié)點
  171.                         sys_state=3;  //置為系統(tǒng)當前狀態(tài)
  172.                 }        
  173.         }

  174.         if((!key_3||irbyte[2]==0x07)&&sys_state==0)         //如果升半旗按鍵按下(按鍵以及紅外遙控)并旗幟處于最低部
  175.         {
  176.                 delay_uint(1000);//延時去抖
  177.                 if(!key_3||irbyte[2]==0x07)         //再次判斷按鍵按下
  178.                 {
  179.                         while(!key_3||irbyte[2]==0x07)        //等待按鍵釋放
  180.                         {
  181.                                 qing();
  182.                                 deal_with();
  183.                         }         
  184.                         led_3=0;         //對應(yīng)指示燈
  185.                         state=5;        //跳轉(zhuǎn)升半旗流程節(jié)點
  186.                         sys_state=3;   //置為系統(tǒng)當前狀態(tài)
  187.                 }        
  188.         }

  189.         if((!key_4||irbyte[2]==0x15)&&sys_state==2)        //如果半旗降下按鍵按下(按鍵以及紅外遙控)并旗幟處于最半旗狀態(tài)
  190.         {
  191.                 delay_uint(1000); //延時去抖
  192.                 if(!key_4||irbyte[2]==0x15)         //再次判斷按鍵按下
  193.                 {
  194.                         while(!key_4||irbyte[2]==0x15)        //等待按鍵釋放
  195.                         {
  196.                                 qing();
  197.                                 deal_with();
  198.                         }
  199.                         state=8;         //跳轉(zhuǎn)半旗將下流程節(jié)點
  200.                         led_4=0;   //對應(yīng)指示燈
  201.                         sys_state=3;   //置為系統(tǒng)當前狀態(tài)
  202.                 }        
  203.         }

  204.         if(!key_5||irbyte[2]==0x43)           //復(fù)位按鍵復(fù)發(fā)
  205.         {
  206.                 delay_uint(1000);        //延時去抖
  207.                 if(!key_5||irbyte[2]==0x43)        //再次判斷按鍵按下
  208.                 {
  209.                         while(!key_5||irbyte[2]==0x43)        //等待按鍵釋放
  210.                         {
  211.                                 qing();
  212.                                 deal_with();
  213.                         }
  214.                         state=11;          //跳轉(zhuǎn)旗幟返回最低端節(jié)點
  215.                         sys_state=3; //置為系統(tǒng)當前狀態(tài)
  216.                         led_1=led_2=led_3=led_4=1;         //對應(yīng)指示燈
  217.                 }        
  218.         }

  219.         if(!key_6||irbyte[2]==0x09)         //復(fù)位按鍵復(fù)發(fā)
  220.         {
  221.                 delay_uint(1000);                //延時去抖
  222.                 if(!key_6||irbyte[2]==0x09)        //再次判斷按鍵按下
  223.                 {
  224.                         while(!key_6||irbyte[2]==0x09)
  225.                         {
  226.                                 qing();
  227.                                 deal_with();
  228.                         }
  229.                         Send_threelines(1);//停止語音播報
  230.                         state=0;
  231.                         sys_state=4;                //停止當前旗幟動作
  232.                         Below_dat=0;
  233.                         UP_dat=0;
  234.                         led_1=led_2=led_3=led_4=1; //取消指示燈
  235.                 }        
  236.         }
  237. }
  238. //sys_state=0  為 旗低的狀態(tài)
  239. //sys_state=1 為 旗頂?shù)臓顟B(tài)
  240. //sys_state=2 為 半旗的狀態(tài)
  241. //sys_state=3 為 正在運行的一個狀態(tài)
  242. //uint UP_dat=0,Below_dat=0;
  243. void Control_code(void)
  244. {
  245.         switch(state)
  246.         {
  247.                 case 0:          //停止轉(zhuǎn)動
  248.                         P2 &= 0xf0;         
  249.                         P2 |= 0x00;
  250.                 break;
  251.                 case 1:          //升全旗 并播音
  252.                         Send_threelines(0);        
  253.                         UP_dat=8800;
  254.                         state=2;
  255.                 break;
  256.                 case 2:         //判斷是否升到最頂端
  257.                         if(UP_dat==0)
  258.                         {
  259.                                 state=0;
  260.                                 sys_state=1;
  261.                                 led_1=1;
  262.                                 Current_dat=8800;
  263.                         }
  264.                 break;
  265.                 case 3:           //將全旗
  266.                         Below_dat=8800;
  267.                         state=4;
  268.                 break;
  269.                 case 4:          //判斷是否將到最低端
  270.                         if(Below_dat==0)
  271.                         {
  272.                                 state=0;
  273.                                 sys_state=0;
  274.                                 led_2=1;        
  275.                                 Current_dat=0;
  276.                         }
  277.                 break;
  278.                 case 5:         //升全旗 并播音
  279.                         Send_threelines(0);        
  280.                         UP_dat=8800;
  281.                         state=6;
  282.                 break;
  283.                 case 6:         //判斷是否升到最頂端  并降半旗
  284.                         if(UP_dat==0)
  285.                         {
  286.                                 Below_dat=2933;
  287.                                 state=7;
  288.                         }
  289.                 break;
  290.                 case 7:         //判斷是否將到半旗狀態(tài)
  291.                         if(Below_dat==0)
  292.                         {
  293.                                 state=0;
  294.                                 sys_state=2;
  295.                                 led_3=1;
  296.                                 Current_dat=8800-2933;                        
  297.                         }
  298.                 break;
  299.                 case 8:                //升半旗
  300.                         UP_dat=2933;
  301.                         state=9;
  302.                 break;                                                   
  303.                 case 9:           //判斷是否上升完成    并降全旗
  304.                         if(UP_dat==0)
  305.                         {
  306.                                 Below_dat=8800;
  307.                                 state=10;
  308.                         }
  309.                 break;
  310.                 case 10:        //判斷是否將到最低端
  311.                         if(Below_dat==0)
  312.                         {
  313.                                 state=0;
  314.                                 sys_state=0;
  315.                                 led_4=1;
  316.                                 Current_dat=0;                        
  317.                         }
  318.                 break;
  319.                 case 11:           //停止語音播報  并將旗幟降到最低端
  320.                         Send_threelines(1);
  321.                         UP_dat=0;
  322.                         Below_dat=Current_dat;
  323.                         state=12;
  324.                 break;
  325.                 case 12:        //判斷是否將到最低端
  326.                         if(Below_dat==0)
  327.                         {
  328.                                 state=0;
  329.                                 sys_state=0;                        
  330.                         }
  331.                 break;
  332.         }
  333.         Current_Height=Current_dat/62.8;        //當前旗幟高度計算
  334.         if(Current_Height>140) Current_Height=140;
  335.         if(dat_A!=Current_Height) //如果顯示的旗幟高度不等于實際高度  從新賦值并保存
  336.         {
  337.                 dat_A=Current_Height;
  338.                 SectorErase(0x2000);   //保存當前報讀
  339.                 byte_write(0x2000,Current_Height);
  340.         }

  341. }

  342. void Time_init(void)  //定時器初始化配置
  343. {
  344.         TMOD = 0x20;               
  345.         TH1 = 0x00;               
  346.         TL1 = 0x00;               
  347.         ET1 = 1;        
  348.         TR1 = 1;                                
  349. }


  350. void main(void)         //系統(tǒng)主程序
  351. {
  352.         Time_init(); //        調(diào)用定時器初始化配置程序
  353.         EA=1;                 //打開總中斷
  354.         EX0=1;                 //打開外部中斷0
  355.         IT0=1;                  //配置觸發(fā)方式
  356.         delay_uint(20000);        // 系統(tǒng)等待延時
  357.         Current_Height=byte_read(0x2000);         //讀取EEPROM中存儲的數(shù)據(jù)
  358.         if(Current_Height>140) Current_Height=0;   //如果當前高度數(shù)據(jù)不正確則重新賦值
  359.         if(Current_Height==0) sys_state=0;        //判讀當前系統(tǒng)工作模式
  360.         else if(Current_Height==140)sys_state=1;
  361.         else if(Current_Height>90&&Current_dat<100) sys_state=2;
  362.         else sys_state=4;
  363.         Current_dat=Current_Height*62.8;          //高度計算
  364.         if(Current_dat>8800) Current_dat=8800;
  365.         LCD1602_cls();         //液晶屏初始化程序調(diào)用
  366.         show_init();        //顯示內(nèi)容初始化調(diào)用程序
  367.         while(1)
  368.         {
  369.                 show();           //顯示函數(shù)
  370.                 key_code();        //按鍵處理函數(shù)
  371.                 Control_code();         //系統(tǒng)控制函數(shù)
  372.         }
  373. }

  374. void Time_2() interrupt 3
  375. {
  376.         irtime++;
  377.         speed_dat++;
  378.         if(speed_dat>17)   //8600-8800  旗桿走一桿110mm         
  379.         {
  380.                 speed_dat=0;
  381.                 if(UP_dat!=0)
  382.                 {
  383.                         P2 &= 0xf0;
  384.                         P2 |= zz[circulation];         //步進電機控制
  385.                         circulation=(circulation+1)%8;
  386.                         UP_dat--;
  387.                         if(Current_dat<8800) Current_dat++;
  388.                 }
  389.                 if(Below_dat!=0)
  390.                 {
  391.                          P2 &= 0xf0;
  392.                         P2 |= fz[circulation]; //步進電機控制
  393.                         circulation=(circulation+1)%8;
  394.                         Below_dat--;
  395.                         if(Current_dat!=0) Current_dat--;
  396.                 }        

  397.         }
  398. }

  399. void int0() interrupt 0  //外部中斷0 中斷程序    用于接收紅外數(shù)據(jù)信號         
  400. {
  401.         if(irflag==1)
  402.         {
  403.                 if(irtime>32)  //判斷起始信號
  404.                 {
  405.                         bitnum=0;
  406.                 }
  407.                 irdate[bitnum]=irtime;
  408.                 irtime=0;
  409.                 bitnum++;
  410.                 if(bitnum==33)           //連續(xù)接收32為數(shù)據(jù)  則為一組數(shù)據(jù)接收完成
  411.                 {
  412.                         bitnum=0;
  413.                         irdateok=1;           //觸發(fā)接收完成標志位
  414.                 }
  415.         }
  416.         else
  417.         {
  418.                 irflag=1;
  419.                 irtime=0;
  420.         }
  421. }
復(fù)制代碼


所有資料51hei提供下載:
51單片機自動升國旗完整資料.rar (3.46 MB, 下載次數(shù): 111)




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

使用道具 舉報

沙發(fā)
ID:923199 發(fā)表于 2021-5-18 13:07 | 只看該作者
哪位大神能根據(jù)這個電路畫一個protues仿真圖嗎?
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美成人一区二免费视频软件 | 欧美一级淫片007 | 欧美一区2区三区3区公司 | 久久麻豆精品 | 国产色片在线 | 激情六月丁香婷婷 | 九九久久久 | 婷婷五月色综合香五月 | 国产精品视频久久久 | 欧美一区免费 | 国产日韩欧美在线 | 欧美日韩午夜精品 | 欧美一区二区三区在线观看 | 另类视频区 | 久久免费精品视频 | 国产精品一区二区久久久久 | 精品国产1区2区3区 在线国产视频 | 日本精品一区二区三区视频 | 国产日韩欧美一区 | 日韩伦理一区二区 | 操操操av | 福利一区在线观看 | 在线黄av | 欧美一区二区三区 | 精品久久久久久久 | 亚洲免费久久久 | 欧美日韩在线视频观看 | 亚洲欧洲精品一区 | 日韩精品一区二区三区视频播放 | 久久久久国产精品一区 | 在线亚洲一区二区 | 中文字幕第十一页 | 亚洲国产一区二区三区在线观看 | 日韩影院在线观看 | 国产精品福利在线观看 | 一级a性色生活片久久毛片波多野 | 91精品国产综合久久精品图片 | 粉嫩粉嫩芽的虎白女18在线视频 | 亚洲视频三 | 久久精品国产久精国产 | 亚洲精品久久久蜜桃 |