标题: 单片机程序执行一次请教! [打印本页]

作者: 川蜀浪子    时间: 2020-10-30 12:27
标题: 单片机程序执行一次请教!
各位大神,小弟初学单片机,想用STC8G1K08的做一个流水灯,效果是接收到12V转向灯信号流光一次后常亮,信号断后关断,再次接收信号后流光一次后常亮,信号断开3秒后日行灯亮,P5.4为信号接收口,P3.0为日行灯输出口,P5.5\P3.1-3.3为流光灯输出口,如果可以请大神给一下程序及说明注译,谢谢。

作者: 川蜀浪子    时间: 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++);         } } 这个程序我写来达不到想要的要求。
作者: zhb2004xp    时间: 2020-10-30 17:00
描述的有些没看懂
作者: 心有浮生    时间: 2020-10-31 16:19
川蜀浪子 发表于 2020-10-30 16:12
自己先顶一个,不要沉了,那位大神帮看看。#include   #define u8 uint8_t #define u16 uint16_t #define u ...

你这程序排下版,方便我们看啊
作者: 器车人    时间: 2020-10-31 16:23
最好把原理图放出来,没看明白表达的是什么意思,程序也很乱,楼主整理下吧
作者: wulin    时间: 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. }
复制代码

作者: TTQ001    时间: 2020-11-1 06:18
那是while(1)和do-while(1)之间的区别
作者: 川蜀浪子    时间: 2020-11-2 10:37
wulin 发表于 2020-10-31 21:38
要设置一个触发信号状态标志。

按大神的代码实际上机做了测试,在接入转向灯信号后流光灯没有实时给随转向信号流光,延时比转长时间后才流光一次,大部份时间是LED5在亮。我试做把LED5及上面的延时去除后,流光可以正常随信号流光。这样的话就没有日行灯的功能了。请问大神这种情况是LED5的延时有问题还是应该更改一下程序呢?
作者: 川蜀浪子    时间: 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. }
复制代码

作者: wulin    时间: 2020-11-2 13:24
川蜀浪子 发表于 2020-11-2 10:37
按大神的代码实际上机做了测试,在接入转向灯信号后流光灯没有实时给随转向信号流光,延时比转长时间后才 ...

我不开车,也不能完全清楚你用术语表述的准确含义。在我看来就是:常态KEY低电平,LED5亮,LED1~4熄。转向(暂态)KEY高电平,LED5熄,LED1~4逐个点亮并保持到恢复常态。如果楼主把电路图发上来,再用普通方式表述可能改后程序更接近需求。毕竟这只是一个非常简单的逻辑关系。对LED5要延时3秒的意义还是不理解。
作者: 川蜀浪子    时间: 2020-11-2 15:08
wulin 发表于 2020-11-2 13:24
我不开车,也不能完全清楚你用术语表述的准确含义。在我看来就是:常态KEY低电平,LED5亮,LED1~4熄。转 ...

这是原理图,现在大神给的程序不能随车转向来流光,程序运行时总会检测到非信号时的延时程序。

51hei截图.png (71.61 KB, 下载次数: 126)

51hei截图.png

作者: 川蜀浪子    时间: 2020-11-2 15:41
wulin 发表于 2020-11-2 13:24
我不开车,也不能完全清楚你用术语表述的准确含义。在我看来就是:常态KEY低电平,LED5亮,LED1~4熄。转 ...

换一种说法:转向灯信号为每1秒间隔的方波信号,每接收一次高电平信号时LED1-LED4流光一次,当停止3秒没有高电平信号接收后,LED5输出高电平点亮。这样描述的话可不可以实现呀。
作者: 川蜀浪子    时间: 2020-11-2 18:26
心有浮生 发表于 2020-10-31 16:19
你这程序排下版,方便我们看啊

原理图及程序都有上传,转向灯信号为每1秒间隔的方波信号,每接收一次高电平信号时LED1-LED4流光一次,当停止3秒没有高电平信号接收后,LED5输出高电平点亮。这样描述的话可不可以实现呀。请指教。
作者: 川蜀浪子    时间: 2020-11-3 10:15
wulin 发表于 2020-10-31 21:38
要设置一个触发信号状态标志。

在此谢谢大神的程序修改,让我进一步学习到标志位及计时器的应用,也让我这个程序完美的实现了我想要的功能,再次感谢大神的解答及帮助。
作者: univers    时间: 2020-11-3 10:41
买一个学习板,里面全有。
作者: YZYNULL    时间: 2020-11-3 18:43
wulin 发表于 2020-10-31 21:38
要设置一个触发信号状态标志。

你这个写程序的页面怎么调出来的?????




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1