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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 10215|回復: 37
打印 上一主題 下一主題
收起左側

單片機自動升降旗系統仿真及程序有錯誤

  [復制鏈接]
跳轉到指定樓層
樓主
lcd1602顯示,正轉翻轉停止顯示高度;

基于51單片機做的國旗自動升降系統的proteus仿真原理圖:


如果沒有裝KEIL軟件
找到  .c   .h結尾的文件即為程序。打開方式選擇記事本打開
或者到開發資料里安裝KEIL軟件

單片機源程序如下:
  1. #include <reg52.h>                 //調用單片機頭文件
  2. #define uchar unsigned char  //無符號字符型 宏定義        變量范圍0~255
  3. #define uint  unsigned int         //無符號整型 宏定義        變量范圍0~65535
  4. #include <intrins.h>

  5. unsigned char code zheng[4]={0xfe,0xfd,0xfb,0xf7};//正轉表格
  6. unsigned char code fan[4]={0xf7,0xfb,0xfd,0xfe};//反轉表格

  7. uchar flag_start ;     //啟動標志位  1為起動步進電機 否則關閉電機
  8. uchar flag_z_f;        //正反標志位  0為順時鐘 1為逆時史上轉
  9. uchar flag_shudu = 1;      //4種速度 0,1,2,3,
  10. bit flag_1s;   
  11. uint flag_value;      
  12. uchar time;
  13. uchar gaodu;

  14. sbit red    = P3^2;           //升期  指示燈
  15. sbit green  = P3^3;           //旗停下指示燈
  16. sbit yellow = P3^4;     //降旗  指示燈

  17. sbit rs=P1^4;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  18. sbit rw=P1^5;         //寄存器選擇信號 H:數據寄存器          L:指令寄存器
  19. sbit e =P1^6;         //片選信號   下降沿觸發

  20. sbit wx0 = P2^5;
  21. sbit wx1 = P2^6;
  22. sbit wx2 = P2^7;
  23. uchar key_can_wx;

  24. /***********************語音模塊控制IO口的定義************************/
  25. sbit  VRST = P2^4;
  26. sbit  VBUSY= P2^0;        
  27. sbit  VSDA = P2^1;
  28. sbit  VCS  = P2^2;  
  29. sbit  VSCL = P2^3;


  30. /******************1ms 延時函數*******************/
  31. void delay_1ms(uint q)
  32. {
  33.         uint i,j;
  34.         for(i=0;i<q;i++)
  35.                 for(j=0;j<120;j++);
  36. }

  37. void  delay_us (unsigned int us)
  38. {

  39.         while(us--)
  40.         {
  41.                 _nop_();
  42.         }
  43. }

  44. /***********************三線發碼子程序************************/
  45. void Send_threelines(unsigned char addr)
  46. {
  47.    unsigned char i;

  48.         if(VBUSY == 1)
  49.         {
  50.                 VRST=0;
  51.                 delay_1ms(5);
  52.                 VRST=1;
  53.                 delay_1ms(20); /* 復位拉高20ms*/
  54.                 VCS=0;
  55.                 delay_1ms(5);  /* 片選拉低5ms */
  56.             for(i=0;i<8;i++)
  57.                 {
  58.                         VSCL=0;
  59.                         if(addr&0x01)
  60.                         {
  61.                                 VSDA=1;
  62.                         }
  63.                         else
  64.                                 VSDA=0;
  65.                         addr>>=1;
  66.                         delay_us(150); /* 150us */
  67.                         VSCL=1;
  68.                         delay_us(150); /* 150us */
  69.                 }
  70.                 VCS=1;
  71.                 delay_1ms(200);
  72.         }
  73. }


  74. /********************************************************************
  75. * 名稱 : delay_uint()
  76. * 功能 : 小延時。
  77. * 輸入 : 無
  78. * 輸出 : 無
  79. ***********************************************************************/
  80. void delay_uint(uint q)
  81. {
  82.         while(q--);
  83. }

  84. /********************************************************************
  85. * 名稱 : write_com(uchar com)
  86. * 功能 : 1602命令函數
  87. * 輸入 : 輸入的命令值
  88. * 輸出 : 無
  89. ***********************************************************************/
  90. void write_com(uchar com)
  91. {
  92.         e=0;
  93.         rs=0;
  94.         rw=0;
  95.         P0=com;
  96.         delay_uint(3);
  97.         e=1;
  98.         delay_uint(25);
  99.         e=0;
  100. }

  101. /********************************************************************
  102. * 名稱 : write_data(uchar dat)
  103. * 功能 : 1602寫數據函數
  104. * 輸入 : 需要寫入1602的數據
  105. * 輸出 : 無
  106. ***********************************************************************/
  107. void write_data(uchar dat)
  108. {
  109.         e=0;
  110.         rs=1;
  111.         rw=0;
  112.         P0=dat;
  113.         delay_uint(3);
  114.         e=1;
  115.         delay_uint(25);
  116.         e=0;        
  117. }

  118. /********************************************************************
  119. * 名稱 : write_string(uchar hang,uchar add,uchar *p)
  120. * 功能 : 改變液晶中某位的值,如果要讓第一行,第五個字符開始顯示"ab cd ef" ,調用該函數如下
  121.                   write_string(1,5,"ab cd ef;")
  122. * 輸入 : 行,列,需要輸入1602的數據
  123. * 輸出 : 無
  124. ***********************************************************************/
  125. void write_string(uchar hang,uchar add,uchar *p)
  126. {
  127.         if(hang==1)   
  128.                 write_com(0x80+add);
  129.         else
  130.                 write_com(0x80+0x40+add);
  131.                 while(1)
  132.                 {
  133.                         if(*p == '\0')  break;
  134.                         write_data(*p);
  135.                         p++;
  136.                 }        
  137. }


  138. /***********************lcd1602上顯示兩位十進制數************************/
  139. void write_sfm3_gaodu(uchar hang,uchar add,uchar date)
  140. {
  141.         if(hang==1)   
  142.                 write_com(0x80+add);
  143.         else
  144.                 write_com(0x80+0x40+add);
  145.         write_data(0x30+date/100%10);
  146.         write_data(0x30+date/10%10);
  147.         write_data('.');
  148.         write_data(0x30+date%10);        
  149. }


  150. /********************************************************************
  151. * 名稱 : init_1602()
  152. * 功能 : 初始化1602液晶
  153. * 輸入 : 無
  154. * 輸出 : 無
  155. ***********************************************************************/
  156. void init_1602()      //1602初始化
  157. {
  158.         write_com(0x38);
  159.         write_com(0x0c);
  160.         write_com(0x06);
  161.         delay_uint(1000);
  162.         write_string(1,0,"     Guo Qi      ");
  163.         write_string(2,0,"  gaodu:00.0M     ");
  164. }


  165. /********************獨立按鍵程序*****************/
  166. uchar key_can;         //按鍵值

  167. void key()         //獨立按鍵程序
  168. {
  169.         static uchar key_new;
  170.         key_can = 20;                   //按鍵值還原
  171.         P3 |= 0xe0;
  172.         if((P3 & 0xe0) != 0xe0)                //按鍵按下
  173.         {
  174.                 delay_1ms(1);                     //按鍵消抖動
  175.                 if(((P3 & 0xe0) != 0xe0) && (key_new == 1))
  176.                 {                                                //確認是按鍵按下
  177.                         key_new = 0;
  178.                         switch(P3 & 0xe0)
  179.                         {
  180.                                 case 0xd0: key_can = 1; break;          //得到按鍵值
  181.                                 case 0xb0: key_can = 2; break;          //得到按鍵值
  182.                                 case 0x70: key_can = 3; break;          //得到按鍵值
  183.                         }
  184.                 }                        
  185.         }
  186.         else   //按鍵松開
  187.                 key_new = 1;        
  188. }

  189. /********************獨立按鍵程序*****************/
  190. void key_wuxian()
  191. {
  192.         static uchar key_new;
  193.         key_can_wx = 20;
  194.         if(key_new == 0)
  195.         {
  196.                 key_new = 1;
  197.                 if(wx0 == 1)
  198.                 {
  199.                         key_can_wx = 1;  
  200.                 }
  201.                 if(wx1 == 1)
  202.                 {
  203.                         key_can_wx = 2;   
  204.                 }
  205.                 if(wx2 == 1)
  206.                 {
  207.                         key_can_wx = 3;           
  208.                 }
  209.         }
  210.         if((wx0 == 0) && (wx1 == 0) && (wx2 == 0))
  211.                 key_new = 0;
  212. //        write_sfm2(1,0,key_can_wx);   //按鍵按下顯示按鍵值
  213. }

  214. /*****************按鍵升旗降旗處理*******************/
  215. void key_shenqi()
  216. {
  217.         static uchar value=0;
  218.         if((key_can == 3) || (key_can_wx == 1))   //升旗
  219.         {
  220.                 if(time < 47)
  221.                 {
  222.                         if(value == 0)
  223.                         {
  224.                                 value = 1;
  225.                                 Send_threelines(1);    //播放國歌
  226.                         }
  227.                         flag_z_f = 1;         
  228.                         red = 0;                       //紅燈升旗
  229.                         green = 1;
  230.                         yellow = 1;
  231.                 }
  232.         }
  233.         if((key_can == 2) || (key_can_wx == 2))   //降旗
  234.         {
  235.                 if(time > 0)
  236.                 {
  237.                         value = 0;
  238.                         Send_threelines(2);
  239.                         flag_z_f = 2;         
  240.                         flag_start = 2;
  241.                         flag_value = 0;
  242.                         red = 1;      
  243.                         green = 1;         
  244.                         yellow = 0;          //黃燈降旗
  245.                 }
  246.         }
  247.         if((key_can == 1) || (key_can_wx == 3))  //停下
  248.         {
  249.                 Send_threelines(2);
  250.                 flag_start = 0;
  251.                 red = 1;      
  252.                 green = 0;           //綠燈停下
  253.                 yellow = 1;         
  254.                 value = 0;
  255.         }
  256. }

  257. /*********************定時器0、定時器1初始化******************/
  258. void time_init()         
  259. {
  260.         EA  = 1;                   //開總中斷
  261.         TMOD = 0X11;          //定時器0、定時器1工作方式1
  262.         ET0 = 1;                  //開定時器0中斷
  263.         TR0 = 1;                  //允許定時器0定時
  264. }

  265. void main()
  266. {
  267.         static uchar i;
  268.         P0 = P1 = P2 = P3 = 0XFF;
  269.         init_1602();      //1602初始化
  270.         time_init();
  271.         write_sfm3_gaodu(2,8,gaodu);          //顯示速度m
  272.         while(1)
  273.         {
  274.                 key();
  275.                 key_wuxian();                        //遙控升旗降旗
  276.                 key_shenqi();           //按鍵升旗降旗
  277.                 for(i=0;i<4;i++)        //4相
  278.                 {
  279.                         if(flag_z_f == 1)
  280.                                 P1=zheng[i] //電機正轉
  281.                         if(flag_z_f == 2)
  282.                                 P1=fan[i];   //電機反轉
  283.                         delay_uint(500);        //改變這個參數可以調整電機轉速
  284.                 }
  285.                 if(flag_z_f == 1)           //升旗
  286.                 {
  287.                         if(flag_1s == 1)
  288.                         {
  289.                                 flag_1s = 0;
  290.                                 time ++;     //時間在加
  291.                                 gaodu = time * 4.0191;  
  292.                                 if(time >= 46)   //停下
  293.                                 {
  294.                                         time = 47;
  295.                                         flag_z_f = 0;        
  296.                                         P1 = 0xf0;
  297.                                         red = 1;      
  298.                                         yellow = 1;         
  299.                                         green = 0;//綠燈停下
  300.                                         gaodu = 195;
  301.                                 }
  302.                                 write_sfm3_gaodu(2,8,gaodu);          //顯示速度m
  303.                         }
  304. ……………………

  305. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載(仿真只能用Proteus7.5打開):
hex能仿真,但是程序編譯錯誤,求指導如何修改.7z (38.95 KB, 下載次數: 202)

評分

參與人數 2黑幣 +51 收起 理由
baibai7 + 1 贊一個!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發
ID:195259 發表于 2017-6-1 18:18 | 只看該作者
電機的參數是什么啊
回復

使用道具 舉報

板凳
ID:195259 發表于 2017-6-1 19:06 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

地板
ID:195259 發表于 2017-6-1 19:15 | 只看該作者
我用的時候電機那邊沒反應啊,這是怎么回事
回復

使用道具 舉報

5#
ID:198958 發表于 2017-6-1 20:12 來自手機 | 只看該作者
zhaoshuai 發表于 2017-6-1 19:06
怎么不好用呢

好用啊,如果在底部就不能反轉了,同樣頂部不能正傳
回復

使用道具 舉報

6#
ID:195259 發表于 2017-6-1 21:08 | 只看該作者
什么意思、初學,不太懂,當我按下按鍵的時候,電機左右電平沒有變化
回復

使用道具 舉報

7#
ID:195259 發表于 2017-6-1 21:27 | 只看該作者
l528592564 發表于 2017-6-1 20:12
好用啊,如果在底部就不能反轉了,同樣頂部不能正傳

初學者,不太懂,就是按鍵按下的時候,電機左右電平沒有變化
回復

使用道具 舉報

8#
ID:195259 發表于 2017-6-1 21:39 來自手機 | 只看該作者
l528592564 發表于 2017-6-1 20:12
好用啊,如果在底部就不能反轉了,同樣頂部不能正傳

底部指的是什么啊
回復

使用道具 舉報

9#
ID:198958 發表于 2017-6-2 14:42 來自手機 | 只看該作者
zhaoshuai 發表于 2017-6-1 21:27
初學者,不太懂,就是按鍵按下的時候,電機左右電平沒有變化

步進電機是四個端口需要以次供電的,你去查查資料,我這個是旗升降,底部就是旗的高度為0
回復

使用道具 舉報

10#
ID:195259 發表于 2017-6-2 17:46 | 只看該作者
l528592564 發表于 2017-6-2 14:42
步進電機是四個端口需要以次供電的,你去查查資料,我這個是國旗升降,底部就是國旗的高度為0

哥,但是現在不管怎么按,電機都不轉,是電機參數的事嗎?幫幫忙
回復

使用道具 舉報

11#
ID:198958 發表于 2017-6-3 12:24 來自手機 | 只看該作者
zhaoshuai 發表于 2017-6-2 17:46
哥,但是現在不管怎么按,電機都不轉,是電機參數的事嗎?幫幫忙

你做的實物嗎
回復

使用道具 舉報

12#
ID:195259 發表于 2017-6-3 15:13 | 只看該作者
不是啊,也是仿真
回復

使用道具 舉報

13#
ID:195259 發表于 2017-6-3 15:14 | 只看該作者

也是仿真,我什么都沒動,文件下載下來,直接用的,就是電機沒反應,電機參數是什么啊?
回復

使用道具 舉報

14#
ID:195259 發表于 2017-6-3 15:15 | 只看該作者

加下好友可以嗎
回復

使用道具 舉報

15#
ID:262990 發表于 2017-12-28 11:30 | 只看該作者
老哥沒有語音模塊嗎?
回復

使用道具 舉報

16#
ID:271714 發表于 2018-1-7 21:37 來自手機 | 只看該作者
朋友,這個做實物需要什么
回復

使用道具 舉報

17#
ID:254251 發表于 2018-6-8 14:33 | 只看該作者
底部和頂部什么定義,頂部想定多高都可以嗎
回復

使用道具 舉報

18#
ID:254251 發表于 2018-6-8 14:34 | 只看該作者
有誰做過實物
回復

使用道具 舉報

19#
ID:388754 發表于 2018-8-28 07:58 | 只看該作者
請問您的升降旗速度是怎么調節的
回復

使用道具 舉報

20#
ID:388870 發表于 2018-9-11 14:49 | 只看該作者
謝謝分享
回復

使用道具 舉報

21#
ID:247623 發表于 2018-9-12 16:13 | 只看該作者
源程序編譯有錯誤
if(flag_z_f == 1)

308.                                P1=zheng[i] //電機正轉

309.                        if(flag_z_f == 2)

310.                                P1=fan[i];   //電機反轉
顯示308行有問題
回復

使用道具 舉報

22#
ID:438324 發表于 2018-12-22 18:51 來自手機 | 只看該作者
樓主上面發的這份仿真圖是完整的圖嘛?
回復

使用道具 舉報

23#
ID:603085 發表于 2019-8-23 15:36 | 只看該作者
收益匪淺,感謝!
回復

使用道具 舉報

24#
ID:733247 發表于 2020-4-20 09:54 | 只看該作者
不管我怎么點 電機和lcd都沒有變化  誰什么原因呢
回復

使用道具 舉報

25#
ID:649321 發表于 2020-6-26 16:39 | 只看該作者
挺好的
回復

使用道具 舉報

26#
ID:495287 發表于 2020-6-27 12:03 | 只看該作者
謝謝樓主分享,提供開拓思路。
回復

使用道具 舉報

27#
ID:794724 發表于 2020-7-1 19:10 | 只看該作者
這個程序是完整的嗎
回復

使用道具 舉報

28#
ID:794724 發表于 2020-7-1 20:52 | 只看該作者

你仿真出最后的結果了嗎
回復

使用道具 舉報

29#
ID:794724 發表于 2020-7-1 22:03 | 只看該作者
l528592564 發表于 2017-6-2 14:42
步進電機是四個端口需要以次供電的,你去查查資料,我這個是國旗升降,底部就是國旗的高度為0

這不是一個升降系統么  不是應該可以通過調節按鍵去控制升或者降么 不應該電機沒反應 啊
回復

使用道具 舉報

30#
ID:796954 發表于 2020-7-4 22:34 來自手機 | 只看該作者
卿本佳人 發表于 2020-4-20 09:54
不管我怎么點 電機和lcd都沒有變化  誰什么原因呢

我下載之后也是這樣,請問你找到原因了嗎
回復

使用道具 舉報

31#
ID:796954 發表于 2020-7-4 22:35 來自手機 | 只看該作者
請問為什么運行之后無論怎么按鍵,電機都不轉,燈也不變呢
回復

使用道具 舉報

32#
ID:796954 發表于 2020-7-4 22:37 來自手機 | 只看該作者
zhaoshuai 發表于 2017-6-3 15:15
加下好友可以嗎

請問你這個問題解決了嗎,怎么解決的啊,謝謝
回復

使用道具 舉報

33#
ID:922296 發表于 2021-5-17 09:10 來自手機 | 只看該作者
請問完整嗎?
回復

使用道具 舉報

34#
ID:922296 發表于 2021-5-17 09:11 來自手機 | 只看該作者
電機參數要自己設定嗎?
回復

使用道具 舉報

35#
ID:922296 發表于 2021-5-17 09:30 | 只看該作者
感謝大神,能不能講解一下呢?
回復

使用道具 舉報

36#
ID:922296 發表于 2021-5-18 10:22 來自手機 | 只看該作者
請問為什么電機不動
回復

使用道具 舉報

37#
ID:922296 發表于 2021-5-18 10:23 來自手機 | 只看該作者
而且現實的距離也不變
回復

使用道具 舉報

38#
ID:933336 發表于 2021-6-7 09:48 | 只看該作者
單片機噩夢 發表于 2021-5-18 10:23
而且現實的距離也不變

請問電機不動怎樣解決
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 黄色大片免费播放 | 亚洲国产精品久久久久秋霞不卡 | 久久久亚洲一区 | 91久久| 色一情一乱一伦一区二区三区 | 日韩中文一区 | 久久狠狠 | 高清视频一区二区三区 | 欧美一区二区在线视频 | www.干| 欧美精品一区二区三 | 精品国产91乱码一区二区三区 | 欧美一区二区网站 | av 一区二区三区 | 亚洲国产成人精品女人久久久野战 | 国产在线观看一区二区 | com.色.www在线观看 | 久久久久久高潮国产精品视 | 超碰综合 | 久久久成人精品 | 欧洲精品在线观看 | 欧美日韩欧美 | 成人精品一区 | 麻豆av电影网 | 久草免费在线视频 | 成人免费大片黄在线播放 | 全部免费毛片在线播放网站 | 免费成年网站 | 精产国产伦理一二三区 | 久久影院一区 | 午夜在线影院 | 成人免费xxxxx在线视频 | 91久久网站| 久久久久国产精品 | 中文字幕免费中文 | 精品久久久久久久久久久 | 久久黄色| 国产亚洲一区二区精品 | 中文字幕在线不卡播放 | 老司机深夜福利网站 | 亚洲免费在线观看 |