找回密碼
 立即註冊
搜索
查看: 11480|回復: 19

再請教!!!

[複製鏈接]
發表於 18-10-2015 20:10:28 | 顯示全部樓層 |閱讀模式
  1. #define uchar unsigned char
  2. #include <reg51.h>
  3.                                         //PT2262發出訊號,PT2274L4接收D0-D3
  4.                                         //D0-D3連接8051 P2.0-P2.3
  5.                                         //收到P2.0 -P2.3的4位組合 P2.4或P2.5輸出=0 / 1       
  6.                                         //P0 控制7劃管出字,P1控制位選,出0亮

  7. sbit P24=P2^4;                //8051 輸出
  8. sbit P25=P2^5;                //8051 輸出
  9. sbit PUL=P2^6;                //頻率
  10. sbit DIR=P2^7;                //方向
  11. sbit EN=P3^7;       
  12. /*******************************共陽LED段碼表*******************************/
  13. unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};

  14. /*********************************端口定義**********************************/
  15. char dat;                        //接收到的數據
  16. //int Num;                        //步進數                        
  17. /*********************************時間控制**********************************/

  18. /*********************************延時控制**********************************/
  19. void delay(unsigned int count)      /*定義延遲函數*/
  20. {
  21.         unsigned int m,n;
  22.     for(m=0;m<count;m++)
  23.                   for(n=0;n<9;n++);
  24. }
  25. /*********************************步數控制**********************************/                           
  26. void Move(void)
  27. {       
  28.         PUL=1;
  29.         delay(5);
  30.         PUL=0;
  31.         delay(5);
  32. }       
  33. void Forward (void)
  34. {
  35.         int i;
  36.         DIR=1;
  37.         for(i=0;i<100;i++)                        //
  38.         Move();                       
  39. }
  40. void Backward (void)
  41. {
  42.         int i;
  43.         DIR=0;
  44.         for(i=0;i<98;i++)                //
  45.         Move();
  46. }

  47. /******************************主程序**************************************/
  48. void main(void)
  49. {
  50.         P1=0x00;                                                //端口初始化
  51.           P0=0x00;                                                //端口初始化
  52.         P2=0xff;                                                       //置輸入狀態
  53.        
  54. while(1)
  55. {
  56.         dat=(P2&0x0f);                                        //00001111       
  57.         if(dat==0x08)                                        //先按A 顯示1 燈亮 通道 開        0000 1000
  58.                 {
  59.                                
  60.                         P0=tab[1];                                        //數碼顯示
  61.                         P1=0xfe;                                        //1111 1110
  62.                         P24=0;                                                 //燈亮       
  63.                                 Forward();
  64.                                 while (P2&0x08)
  65.                                  {
  66.                                  }       
  67.                 }
  68.        
  69.          if(dat==0x04)                                        //再按B建 顯示2 燈滅  通道 關         0000 0100
  70.                 {
  71.                         P0=tab[2];                                        //數碼顯示
  72.                         P1=0xfd;                                         //1111 1101
  73.                         P24=1;                                                //關燈
  74.                                 Backward();
  75.                                 while (P2&0x04)
  76.                                  {
  77.                                 }
  78.                 }
  79.                
  80.          if(dat==0x02)                                        //按C鍵 顯示3 燈亮 通道 開         0000 0010
  81.                 {
  82.                         P0=tab[3];                                        //數碼顯示
  83.                         P1=0xfb;                                        //1111 1011
  84.                         P25=0;                                          //燈亮
  85.                                 Forward();
  86.                                 delay(1000);
  87.                                 Backward();
  88.                                 while(P2&0x02);
  89.                                 {
  90.                                 }
  91.                                
  92.                                                
  93.                 }
  94.         if(dat==0x01)                                        //再按D鍵 顯示4 通道 關             0000 0001               
  95.                 {       
  96.                         P0=tab[4];
  97.                         P1=0xf7;                                          //1111 0111
  98.                         P25=1;                                                //關燈
  99.                                 Forward();
  100.                                 delay(5000);
  101.                                 delay(5000);
  102.                                 delay(5000);
  103.                                 delay(5000);
  104.                                 Backward();
  105.                                 while(P2&0x01);
  106.                                 {
  107.                                 }
  108.         }               
  109.         }
  110. }
複製代碼
 樓主| 發表於 18-10-2015 20:16:35 | 顯示全部樓層
在上述程序中,如按3或4鍵,做完往返動作後,想再按鍵再做動作,應該如何改寫呢???
因PT2272 L4是鎖存訊號,試過改用PT2272 M4非鎖存,一,二鍵又再按就做動作,這樣角度又錯了!!!
求教啊!!!
發表於 18-10-2015 22:14:14 | 顯示全部樓層
你好, 謝謝你的難題.
你用 PT2272 L4(鎖存訊號), 如按下3鍵時,摩打動作做完時,程式是停在 while(P2&0x02); {   } ,一定要按其他的鍵 才跳得走, 否則再按下3鍵, 摩打是無動作的.
改用PT2272 M4非鎖存, 按鍵後, 摩打動作, 而程式最終是在 while (1)  不斷polling .
 樓主| 發表於 19-10-2015 18:40:09 來自手機 | 顯示全部樓層
正想辦法解決中!!!^.^”
發表於 20-10-2015 13:25:21 | 顯示全部樓層
有難題也登上,讓大家想辦法 ^_^
發表於 24-2-2016 23:57:20 | 顯示全部樓層
朋友,你之前相關的帖子有粗略看過因太忙所以沒進一步研究,覺得這類控制目標,可能採用switch case方式去編寫會更簡單及效率高,
發表於 25-2-2016 11:37:49 | 顯示全部樓層
本帖最後由 philip 於 25-2-2016 13:50 編輯

一、你程序中先define後include,這就像佳餚未上檯先起筷,夾空氣呀?這叫本末倒置。應include行頭define跟後。
二、程序中如太多判斷小段子,建議用switch比較有效。當然不一定要用switch,也可以用else if,條條大路通羅馬,
三、主程序中應盡量避免多於2個while()。

廢話完

你問按c鍵後做完正向轉動然後想再按c鍵沒反應,按c鍵做正向轉動是一直在轉動嗎?
建議在完成動作後跳回stand-by,至於2272鎖存與不鎖存沒所謂,在stand-by中做手腳就可以。

你可以嘗試邀請左先生協助你。
發表於 26-2-2016 12:19:41 | 顯示全部樓層
本帖最後由 philip 於 26-2-2016 13:16 編輯

朋友,多些使用debug功能,你會發覺如圖片中用switch的優點,壓縮檔rar是gif檔,因論壇不能上傳gif file,請自行解壓。


RM_Sw 2.jpg

RemoteMotorSw.rar

76.92 KB, 下載次數: 710

請解壓

發表於 26-2-2016 20:57:09 | 顯示全部樓層
philip 發表於 26-2-2016 12:19
朋友,多些使用debug功能,你會發覺如圖片中用switch的優點,壓縮檔rar是gif檔,因論壇不能上傳gif file, ...



補充gif動畫。

中無論壇真是好失敗,連上傳gif動畫都不可以,這個問題大概1年多前已反映過時至今天還是沒解決。要放到別的地方再貼連接過來,真是費時失事多此一舉。

發表於 27-2-2016 07:56:24 | 顯示全部樓層
本帖最後由 VR2ZOC 於 27-2-2016 07:58 編輯
philip 發表於 26-2-2016 20:57
補充gif動畫。

中無論壇真是好失敗,連上傳gif動畫都不可以,這個問題大概1年多前已反映過時至今天還 ...


完全同意"philip"兄意見,而且仲連表情圖案都無法放上超過好耐一段時間了。
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

手機版|小黑屋|存檔|中華業餘無線電研究會網站

GMT+8, 28-3-2024 22:48 , Processed in 0.059717 second(s), 23 queries , Gzip On.

本討論區基於 Discuz! X3.5

版權所有 © 2001-2024 中華業餘無線電研究會有限公司,保留一切權利


重要聲明:本討論區是以即時上載留言的方式運作,中華業餘無線電研究會對所有留言的真實性、完整性及立場等,不負任何法律責任。而一切留言之言論只代表留言者個人意見,並非本網站之立場,讀者及用戶不應信賴內容,並應自行判斷內容之真實性。於有關情形下,讀者及用戶應尋求專業意見(如涉及醫療、法律或投資等問題)。 由於本討論區受到「即時上載留言」運作方式所規限,故不能完全監察所有留言,若讀者及用戶發現有留言出現問題,請聯絡我們。中華業餘無線電研究會有權刪除任何留言及拒絕任何人士上載留言(刪除前或不會作事先警告及通知),同時亦有不刪除留言的權利,如有任何爭議,管理員擁有最終的詮釋權。用戶切勿撰寫粗言穢語、誹謗、渲染色情暴力或人身攻擊的言論,敬請自律。本網站保留一切法律權利。

快速回復 返回頂部 返回列表