找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2019|回复: 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 单片机教程网

快速回复 返回顶部 返回列表