欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3445|回復: 15
收起左側

單片機程序執行一次請教!

[復制鏈接]
ID:826754 發表于 2020-10-30 12:27 | 顯示全部樓層 |閱讀模式
各位大神,小弟初學單片機,想用STC8G1K08的做一個流水燈,效果是接收到12V轉向燈信號流光一次后常亮,信號斷后關斷,再次接收信號后流光一次后常亮,信號斷開3秒后日行燈亮,P5.4為信號接收口,P3.0為日行燈輸出口,P5.5\P3.1-3.3為流光燈輸出口,如果可以請大神給一下程序及說明注譯,謝謝。
回復

使用道具 舉報

ID:826754 發表于 2020-10-30 16:12 | 顯示全部樓層
自己先頂一個,不要沉了,那位大神幫看看。#include <STC8.H>  #define u8 uint8_t #define u16 uint16_t #define u32 uint32_t typedef unsigned char uint8_t; typedef unsigned int uint16_t; typedef unsigned long uint32_t; /********端口引腳定義*****/  sbit LED5=P3^0; sbit LED2=P3^1; sbit LED3=P3^2; sbit LED4=P3^3; sbit KEY=P5^4; sbit LED1=P5^5;   /******延時函數聲明******/  void delay(u16 Count);  /******主函數區******/  void main(void) {         u8 num=0;         P3M0=0xFF;                                                           //設P3口為推挽輸出         P3M1=0x00;         RSTCFG=0xef;                                                //設P5.4為IO口 //        P5M0=0xef;                                                         //設P5.4為準雙向口 //        P5M1=0xef;         P5M0=0x20;                                                         //設P5.4為準雙向口,P5.5為推挽輸出         P5M1=0x00;         //P3=0x00;                                                         //初始化P3口為低電平         LED1=0,LED2=0,LED3=0,LED4=0;         LED5=1;                                                                 //P5.5為高電平         //KEY=0;         while(1)         {                 if(KEY==1)                                                  //如P5.4為高電平                 {                                   LED5=0;                                                           //P5.5輸出低電平                 delay(290);                 //P3=0x00;                 LED1=LED2=LED3=LED4=0;                 delay(290);                 LED1=1,LED2=0,LED3=0,LED4=0;                 delay(290);                 LED1=1,LED2=1,LED3=0,LED4=0;        //LED燈流水點亮                 delay(290);                 LED1=1,LED2=1,LED3=1,LED4=0;                 delay(290);                 LED1=1,LED2=1,LED3=1,LED4=1;                 delay(290);                  }                                    {                   if(KEY==0)                 {                  //P3=0x00;                 LED1=LED2=LED3=LED4=0;                 delay(3000);                 LED5=1;                 }                 }                          } } /************延時3秒****/ void delay(u16 Count) {         u8 i,j;         while(Count--)         {         for(i=0;i<50;i++)                 for(j=0;j<20;j++);         } } 這個程序我寫來達不到想要的要求。
回復

使用道具 舉報

ID:234075 發表于 2020-10-30 17:00 | 顯示全部樓層
描述的有些沒看懂
回復

使用道具 舉報

ID:654028 發表于 2020-10-31 16:19 | 顯示全部樓層
川蜀浪子 發表于 2020-10-30 16:12
自己先頂一個,不要沉了,那位大神幫看看。#include   #define u8 uint8_t #define u16 uint16_t #define u ...

你這程序排下版,方便我們看啊
回復

使用道具 舉報

ID:278840 發表于 2020-10-31 16:23 | 顯示全部樓層
最好把原理圖放出來,沒看明白表達的是什么意思,程序也很亂,樓主整理下吧
回復

使用道具 舉報

ID:213173 發表于 2020-10-31 21:38 | 顯示全部樓層
川蜀浪子 發表于 2020-10-30 16:12
自己先頂一個,不要沉了,那位大神幫看看。#include   #define u8 uint8_t #define u16 uint16_t #define u ...

要設置一個觸發信號狀態標志。
  1. #include <STC8.H>  
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;
  4. /********端口引腳定義*****/  
  5. sbit KEY =P5^4;
  6. sbit LED1=P5^5;
  7. sbit LED2=P3^1;
  8. sbit LED3=P3^2;
  9. sbit LED4=P3^3;
  10. sbit LED5=P3^0;
  11. /******延時函數聲明******/  
  12. void delay(u16 z);  
  13. /******主函數區******/  
  14. void main(void)
  15. {
  16.         bit sign=0;                //觸發狀態標志
  17.         P3M0=0xFF;    //設P3口為推挽輸出         
  18.         P3M1=0x00;         
  19.         P5M0=0x20;  //設P5.4為準雙向口,P5.5為推挽輸出        
  20.         P5M1=0x00;
  21.         LED1=0;
  22.         LED2=0;
  23.         LED3=0;
  24.         LED4=0;
  25.         LED5=1; //P5.5為高電平
  26.         KEY =1; //不可以設低電平        
  27.         while(1)         
  28.         {                 
  29.                 if(KEY==1)//如P5.4為高電平                 
  30.                 {
  31.                         delay(10);
  32.                         if(KEY==1&&sign==0)        
  33.                         {
  34.                                 sign=1;
  35.                                 LED5=0;    //P5.5輸出低電平
  36.                                 LED1=1,LED2=0,LED3=0,LED4=0;
  37.                                 delay(1000);
  38.                                 LED1=1,LED2=1,LED3=0,LED4=0;
  39.                                 delay(1000);
  40.                                 LED1=1,LED2=1,LED3=1,LED4=0;
  41.                                 delay(1000);
  42.                                 LED1=1,LED2=1,LED3=1,LED4=1;
  43.                         }
  44.                 }
  45.                 else
  46.                 {
  47.                         sign=0;
  48.                         LED1=LED2=LED3=LED4=0;
  49.                         delay(3000);
  50.                         LED5=1;
  51.                 }
  52.         }
  53. }
  54. /***********z*1ms延時***********/
  55. void delay(u16 z) // 1T 11.0592MHz
  56. {
  57.         u16 i,j;        
  58.         for(i=z;i>0;i--)
  59.                 for(j=829;j>0;j--);//829
  60. }
復制代碼
回復

使用道具 舉報

ID:420836 發表于 2020-11-1 06:18 | 顯示全部樓層
那是while(1)和do-while(1)之間的區別
回復

使用道具 舉報

ID:826754 發表于 2020-11-2 10:37 | 顯示全部樓層
wulin 發表于 2020-10-31 21:38
要設置一個觸發信號狀態標志。

按大神的代碼實際上機做了測試,在接入轉向燈信號后流光燈沒有實時給隨轉向信號流光,延時比轉長時間后才流光一次,大部份時間是LED5在亮。我試做把LED5及上面的延時去除后,流光可以正常隨信號流光。這樣的話就沒有日行燈的功能了。請問大神這種情況是LED5的延時有問題還是應該更改一下程序呢?
回復

使用道具 舉報

ID:826754 發表于 2020-11-2 11:35 | 顯示全部樓層
像這樣去掉就可以正常轉向信號流光。
  1. #include <STC8.H>  
  2. typedef unsigned char u8;
  3. typedef unsigned int  u16;
  4. /********端口引腳定義*****/  
  5. sbit KEY =P5^4;
  6. sbit LED1=P5^5;
  7. sbit LED2=P3^1;
  8. sbit LED3=P3^2;
  9. sbit LED4=P3^3;
  10. sbit LED5=P3^0;
  11. /******延時函數聲明******/  
  12. void delay(u16 z);  
  13. /******主函數區******/  
  14. void main(void)
  15. {
  16.         bit sign=0;                //觸發狀態標志
  17.         P3M0=0xFF;    //設P3口為推挽輸出         
  18.         P3M1=0x00;         
  19.         P5M0=0x20;  //設P5.4為準雙向口,P5.5為推挽輸出        
  20.         P5M1=0x00;
  21.         LED1=0;
  22.         LED2=0;
  23.         LED3=0;
  24.         LED4=0;
  25.         LED5=1; //P5.5為高電平
  26.         KEY =1; //不可以設低電平        
  27.         while(1)         
  28.         {                 
  29.                 if(KEY==1)//如P5.4為高電平                 
  30.                 {
  31.                         delay(1);
  32.                         if(KEY==1&&sign==0)        
  33.                         {
  34.                                 sign=1;
  35.                                 LED5=0;    //P5.5輸出低電平
  36.                                 LED1=1,LED2=0,LED3=0,LED4=0;
  37.                                 delay(150);
  38.                                 LED1=1,LED2=1,LED3=0,LED4=0;
  39.                                 delay(150);
  40.                                 LED1=1,LED2=1,LED3=1,LED4=0;
  41.                                 delay(150);
  42.                                 LED1=1,LED2=1,LED3=1,LED4=1;
  43.                         }
  44.                 }
  45.                 else
  46.                                 {
  47.                         sign=0;
  48.                         LED1=LED2=LED3=LED4=0;
  49.                      //   delay(600);
  50.                      //   LED5=1;
  51.                 }           
  52.         }
  53. }
  54. /***********z*1ms延時***********/
  55. void delay(u16 z) // 1T 11.0592MHz
  56. {
  57.         u16 i,j;        
  58.         for(i=z;i>0;i--)
  59.                 for(j=829;j>0;j--);//829
  60. }
復制代碼
回復

使用道具 舉報

ID:213173 發表于 2020-11-2 13:24 | 顯示全部樓層
川蜀浪子 發表于 2020-11-2 10:37
按大神的代碼實際上機做了測試,在接入轉向燈信號后流光燈沒有實時給隨轉向信號流光,延時比轉長時間后才 ...

我不開車,也不能完全清楚你用術語表述的準確含義。在我看來就是:常態KEY低電平,LED5亮,LED1~4熄。轉向(暫態)KEY高電平,LED5熄,LED1~4逐個點亮并保持到恢復常態。如果樓主把電路圖發上來,再用普通方式表述可能改后程序更接近需求。畢竟這只是一個非常簡單的邏輯關系。對LED5要延時3秒的意義還是不理解。
回復

使用道具 舉報

ID:826754 發表于 2020-11-2 15:08 | 顯示全部樓層
wulin 發表于 2020-11-2 13:24
我不開車,也不能完全清楚你用術語表述的準確含義。在我看來就是:常態KEY低電平,LED5亮,LED1~4熄。轉 ...

這是原理圖,現在大神給的程序不能隨車轉向來流光,程序運行時總會檢測到非信號時的延時程序。
51hei截圖.png
回復

使用道具 舉報

ID:826754 發表于 2020-11-2 15:41 | 顯示全部樓層
wulin 發表于 2020-11-2 13:24
我不開車,也不能完全清楚你用術語表述的準確含義。在我看來就是:常態KEY低電平,LED5亮,LED1~4熄。轉 ...

換一種說法:轉向燈信號為每1秒間隔的方波信號,每接收一次高電平信號時LED1-LED4流光一次,當停止3秒沒有高電平信號接收后,LED5輸出高電平點亮。這樣描述的話可不可以實現呀。
回復

使用道具 舉報

ID:826754 發表于 2020-11-2 18:26 | 顯示全部樓層
心有浮生 發表于 2020-10-31 16:19
你這程序排下版,方便我們看啊

原理圖及程序都有上傳,轉向燈信號為每1秒間隔的方波信號,每接收一次高電平信號時LED1-LED4流光一次,當停止3秒沒有高電平信號接收后,LED5輸出高電平點亮。這樣描述的話可不可以實現呀。請指教。
回復

使用道具 舉報

ID:826754 發表于 2020-11-3 10:15 | 顯示全部樓層
wulin 發表于 2020-10-31 21:38
要設置一個觸發信號狀態標志。

在此謝謝大神的程序修改,讓我進一步學習到標志位及計時器的應用,也讓我這個程序完美的實現了我想要的功能,再次感謝大神的解答及幫助。
回復

使用道具 舉報

ID:382454 發表于 2020-11-3 10:41 | 顯示全部樓層
買一個學習板,里面全有。
回復

使用道具 舉報

ID:837401 發表于 2020-11-3 18:43 | 顯示全部樓層
wulin 發表于 2020-10-31 21:38
要設置一個觸發信號狀態標志。

你這個寫程序的頁面怎么調出來的?????
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

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