找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2042|回复: 16
收起左侧

单片机遥控器控制LED灯亮模式的设计

[复制链接]
ID:826754 发表于 2021-6-26 10:00 | 显示全部楼层 |阅读模式
本人小白,新学单片机,想做一个我车用的转向灯。
要求为遥控器控制三种亮灯模式:遥控器选择LED亮灯模式,转向信号触发。
模式一:转向灯信号接收到后LED灯闪光。
模式二:转向灯信号接收到后LED灯流光。
模式三:转向灯信号接收到后LED灯先闪光二次再流光一次。
求高人指点思路及代码应怎样编写。
回复

使用道具 举报

ID:123289 发表于 2021-6-26 15:16 | 显示全部楼层
1、先写三个程序分别完成你的三个模式,程序的名子就叫:M1、M2、M3。
2、遥控器放三个按钮,按钮上标记为:M1、M2、M3。并记下按下M1、M2、M3后发出的编码,假设分别是N1、N2、N3。
3、做个遥控器的接收器,
当收到的信号是N1是就将【子程序入口】指向M1程序,
当收到的信号是N2是就将【子程序入口】指向M2程序,
当收到的信号是N3是就将【子程序入口】指向M3程序,
4、当转向触发信号到起时,就调用【子程序入口】所指向的程序。


回复

使用道具 举报

ID:826754 发表于 2021-6-26 15:50 | 显示全部楼层
yzwzfyz 发表于 2021-6-26 15:16
1、先写三个程序分别完成你的三个模式,程序的名子就叫:M1、M2、M3。
2、遥控器放三个按钮,按钮上标记为 ...

调用子程序的接口程序的代码不知道怎么写才能指向想要的子程序。
回复

使用道具 举报

ID:826754 发表于 2021-7-6 09:41 | 显示全部楼层
有没有大佬帮忙看看怎样用STC8F的来解码后执行那三个模式呢?
回复

使用道具 举报

ID:161164 发表于 2021-7-6 17:05 | 显示全部楼层
川蜀浪子 发表于 2021-6-26 15:50
调用子程序的接口程序的代码不知道怎么写才能指向想要的子程序。
  1. if(RxBuff !=0)
  2. {
  3.         if(RxBuff == N1)
  4.         {
  5.                 M1_Flag = 1;
  6.         }
  7.         if(RxBuff == N2)
  8.         {
  9.                 M2_Flag = 1;
  10.         }
  11.         if(RxBuff == N3)
  12.         {
  13.                 M3_Flag = 1;
  14.         }
  15.         RxBuff = 0;
  16. }
  17. if(M1_Flag){
  18.         M1();
  19. }
  20. if(M2_Flag){
  21.         M2();
  22. }
  23. if(M3_Flag){
  24.         M3();
  25. }
复制代码


Mx_Flag要在用完后清零
回复

使用道具 举报

ID:826754 发表于 2021-7-12 15:20 | 显示全部楼层
lkc8210 发表于 2021-7-6 17:05
Mx_Flag要在用完后清零

谢谢大佬的指点,我试试看怎样加入到STC的解码中。
回复

使用道具 举报

ID:826754 发表于 2021-7-16 18:28 | 显示全部楼层
  1.                                   /***使用STC8F1K08S2-SOP16为主控转向流光灯
  2. 1、上电扫描流光左右同时流光三次,日行灯亮。
  3. 2、双闪时,左右同时接到信号,左右跟随信号同时流光。
  4. 3、接收到左或右转向信号时相应方向流光一次常亮。
  5. 4、断开左或右转向信号时,延时1秒日行灯LED11 100%亮度。
  6. 5、遥控选择模式,D0接收到高电平时转向灯流光。D1接收到高电平时转向灯闪光。D2接收到高电平时先闪光两次再流光一次。
  7. *****/

  8. #include <STC8Fxx.h>  
  9. typedef unsigned char u8;
  10. typedef unsigned int u16;
  11. /********端口引脚定义*****/  
  12. sbit KEYL=P5^5;    //设置左方向触发信号
  13. //sbit KEYR=P5^4;    //设置右方向触发信号
  14. //sbit LOCK=P3^0;    //设置上锁触发信号

  15. sbit LED6=P3^2;    //左方向流光灯设定
  16. sbit LED5=P3^3;
  17. sbit LED4=P3^4;
  18. sbit LED3=P3^5;
  19. sbit LED2=P3^6;
  20. sbit LED1=P3^7;    //右方向流光灯设定

  21. sbit D0=P1^1;           //遥控接收信号
  22. sbit D1=P1^0;           //遥控接收信号
  23. sbit D2=P1^6;           //遥控接收信号
  24. //sbit LEDA=P1^7;

  25. sbit LED11=P1^7;   //日行灯设定

  26. bit signl=0;       //触发状态标志
  27. //bit signr=0;
  28. //bit signk=0;
  29. //bit PWM;
  30. u16 count3=0,num;


  31. void keyScan();

  32. /*********定时器0初始化函数***********/
  33. void Timer0Init()                //5毫秒@11.0592MHz
  34. {
  35.         AUXR |= 0x80;                //定时器时钟1T模式
  36.         TMOD &= 0xF0;                //设置自动重装模式
  37.         TL0 = 0x00;                        //设置定时初值
  38.         TH0 = 0x28;                        //设置定时初值
  39.         TF0 = 0;                                //清除TF0标志
  40.         TR0 = 1;                                //定时器0开始计时
  41.         EA  = 1;                                //开总中断
  42.         ET0 = 1;                                //开T0中断
  43. }
  44. /********流光函数*********/
  45. void Led_L()
  46. {
  47.         if(num>25)              {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;}
  48.         else if(num<=25&&num>20){LED1=1;LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;}
  49.         else if(num<=20&&num>15){LED1=1;LED2=1;LED3=1;LED4=0;LED5=0;LED6=0;}
  50.         else if(num<=15&&num>10){LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;}
  51.         else if(num<=10&&num>5) {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;}
  52.         else if(num>0&&num==5)  {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;}
  53. }
  54. /*******闪光函数******/
  55. void Led_R()
  56. {
  57.         if(num>0&&num==25)              {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;}
  58.      
  59. }
  60. /*****扫描流光函数*****/   /***
  61. void Led_K()
  62. {
  63.                 if(num>270)                                        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }
  64.                 else if(num<=270&&num>260)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  65.                 else if(num<=260&&num>250)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  66.                 else if(num<=250&&num>240)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  67.                 else if(num<=240&&num>230)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;       }
  68.                 else if(num<=230&&num>220)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  69.                 else if(num<=220&&num>210)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  70.                 else if(num<=210&&num>200)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  71.                 else if(num<=200&&num>190)        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }     
  72.                 else if(num<=190&&num>180)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  73.                 else if(num<=180&&num>170)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  74.                 else if(num<=170&&num>160)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  75.                 else if(num<=160&&num>150)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;       }
  76.                 else if(num<=150&&num>140)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=1;       }
  77.                 else if(num<=140&&num>130)        {LED1=1;LED2=0;LED3=0;LED4=1;LED5=0;       }
  78.                 else if(num<=130&&num>120)        {LED1=1;LED2=0;LED3=1;LED4=0;LED5=0;       }
  79.                 else if(num<=120&&num>110)        {LED1=1;LED2=1;LED3=0;LED4=0;LED5=0;       }
  80.                 else if(num<=110&&num>100)        {LED1=1;LED2=1;LED3=0;LED4=0;LED5=1;       }
  81.                 else if(num<=100&&num>90)        {LED1=1;LED2=1;LED3=0;LED4=1;LED5=0;       }
  82.                 else if(num<=90&&num>80)        {LED1=1;LED2=1;LED3=1;LED4=0;LED5=0;       }
  83.                 else if(num<=80&&num>70)        {LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;       }
  84.                 else if(num<=70&&num>60)        {LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;       }
  85.                 else if(num<=60&&num>50)        {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;       }
  86.                 else if(num<=50&&num>40)        {LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;       }
  87.                 else if(num<=40&&num>30)        {LED1=0;LED2=0;LED3=1;LED4=1;LED5=1;       }
  88.                 else if(num<=30&&num>20)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=1;       }
  89.                 else if(num<=20&&num>10)        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }
  90.                 else if(num<=10&&num>0 )        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;       }       
  91. }
  92. /******主函数区******/  
  93. void main()
  94. {
  95.      //   u8 i;
  96.         P3M0=0xFC;//P3.0P3.1为准双向口,其它为推挽输出。      
  97.         P3M1=0x00;
  98.         P1M0=0x80;//设P1口为推挽输出,
  99.         P1M1=0x3C;         
  100.         P5M0=0x00;//设P5.4、P5.5为准双向口.        
  101.         P5M1=0x00;
  102.         P3=0X00;
  103.         P1=0X7F;
  104.                 P5=0X30;  //不可设为底电平   
  105.         Timer0Init();
  106.                 if(KEYL==1)
  107.           {
  108.            
  109.                    keyScan(); //把触发部分的代码打包成函数放在这里执行

  110.           }
  111.        else
  112.                   {LED11=1;}
  113.        //  {      
  114.        // for(i=0;i<1;i++)//上电扫描流光1次
  115.        //         {
  116.        //      num=280;//1.秒
  117.             // if(num==560)
  118.                 //          while(num)
  119.         //       {
  120.         //         Led_K();
  121.                      
  122.         //       }
  123.                 //        if(num==0)         
  124.                          
  125.         //        }  
  126.         // }          
  127.                   
  128.     while(1)         
  129.         {      
  130.                 if(KEYL==1)
  131.                  {                         
  132.                         keyScan();
  133.                  }
  134.         }         
  135. }
  136. /*********定时器0中断服务函数*************/
  137. void timer0() interrupt 1      
  138. {
  139.         /* static unsigned char i=0;
  140.         if(i<3)PWM=1;//占空比75%
  141.         else PWM=0;
  142.         i++;
  143.         i%=4;             */
  144.     //    PWM=~PWM;//PWM周期10ms,占空比50%
  145.                                   
  146.                 if(num>0)
  147.                
  148.                 num--;          
  149.         //if(num==0)
  150.                 if(KEYL!=1)
  151.         {
  152.                 LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;
  153.                                
  154.                                 signl=0;
  155.                
  156.                // signk=0;
  157.                         if(++count3>=150)//3秒延时
  158.                {
  159.                  count3=150; //保持
  160.                  LED11=1;                //LED11亮
  161.                }  
  162.         }
  163. }

  164. /********触发子程序函数*********/

  165. void keyScan()
  166. {
  167.                             
  168.              if(KEYL==1  && signl==0 && D0==1 )//左转流光
  169.                 {
  170.                                                 count3=0;        //计数3清0
  171.                         signl=1;
  172.                         num=25;
  173.                         while(num)
  174.                         {
  175.                                 LED11=0;//50%亮度
  176.                                 Led_L();
  177.                         }
  178.                        // LED11=1;
  179.                 }
  180.          if(KEYL==1  && signl==0 && D1==1 )//左转闪光
  181.                 {
  182.                                                 count3=0;        //计数3清0
  183.                         signl=1;
  184.                         num=25;
  185.                         while(num)
  186.                         {
  187.                                 LED11=0;//50%亮度
  188.                                 Led_R();
  189.                         }
  190.                        // LED11=1;
  191.                 }  
  192.          if(KEYL==1  && signl==0 && D2==1 )//左转闪光两次流光一次
  193.                 {
  194.                                                 count3=0;        //计数3清0
  195.                         signl=1;
  196.                         num=25;
  197.                         while(num)
  198.                         {
  199.                                 LED11=0;//50%亮度
  200.                                 Led_R();
  201.                                                                 Led_R();
  202.                                                                 Led_L();
  203.                         }
  204.                        // LED11=1;
  205.                 }                                
  206.                                   
  207. }         


复制代码

各位大佬,请帮看看第三种模式不能实现,要求中断一次为闪光,再中断一次闪光,再中断一次流光,循环。
回复

使用道具 举报

ID:826754 发表于 2021-7-16 18:29 | 显示全部楼层
lkc8210 发表于 2021-7-6 17:05
Mx_Flag要在用完后清零

不会解码,所以没有搞出来,用了接收模块的实现,但是第三个模式有问题。
回复

使用道具 举报

ID:161164 发表于 2021-7-18 00:34 | 显示全部楼层
川蜀浪子 发表于 2021-7-16 18:29
不会解码,所以没有搞出来,用了接收模块的实现,但是第三个模式有问题。

先不管你Led_R();里的代码有没用你第三个模式的代码有思路上的问题因为while(num)里的代码是不断循环的而且比中断还要快
所以while(num)里的代码运行是:

num=25:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L()
num=24:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L()
num=23:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L().
.
.
num=2:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L()
num=1:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L()
num=0:Led_R()->Led_R()->Led_L()->Led_R()->Led_R()->Led_L()->...->Led_R()->Led_R()->Led_L()
表现出来就是乱闪
应该改为:
  1.     if(KEYL==1  && signl==0 && D2==1 )//左转闪光两次流光一次
  2.     {
  3.         count3=0;        //计数3清0
  4.         signl=1;
  5.         num=25;
  6.         while(num)
  7.         {
  8.             LED11=0;//50%亮度
  9.             Led_R();
  10.         }
  11.         num=25;
  12.         while(num)
  13.         {
  14.             LED11=0;//50%亮度
  15.             Led_R();
  16.         }
  17.         num=25;
  18.         while(num)
  19.         {
  20.             LED11=0;//50%亮度
  21.             Led_L();
  22.         }
  23.         // LED11=1;
  24.     }
复制代码
不过我从来都反对在大while(1)以内用其它while(xxx)
系统简单还好,如果有其它功能如按键扫描,数码管动态刷新等
就会被这个while(xxx)担误了
就如你的代码
在收到接收模块的信号后就要等其模式跑完后才能换其它模式

回复

使用道具 举报

ID:826754 发表于 2021-7-18 09:09 | 显示全部楼层
lkc8210 发表于 2021-7-18 00:34
先不管你Led_R();里的代码有没用你第三个模式的代码有思路上的问题因为while(num)里的代码是不断循环的而 ...

谢谢大神的指点,刚才放入程序中试了一下,这样的情况是在一个中断中来完成这三种,我想要的是在三个中断完成这三次闪光,第一次中断为闪光,第二次中断为闪光,第三次中断为流光。然后又是循环这样的功能。
回复

使用道具 举报

ID:950257 发表于 2021-7-18 11:26 | 显示全部楼层
只需要对你的遥控器正确解码,然后就和按键检测原理一样了
回复

使用道具 举报

ID:161164 发表于 2021-7-18 12:14 来自手机 | 显示全部楼层
川蜀浪子 发表于 2021-7-18 09:09
谢谢大神的指点,刚才放入程序中试了一下,这样的情况是在一个中断中来完成这三种,我想要的是在三个中断 ...

不明白你所说的"中断"是什么意思
回复

使用道具 举报

ID:161164 发表于 2021-7-18 22:29 | 显示全部楼层
  1.     if(KEYL==1  && signl==0 && D2==1 )//左转闪光两次流光一次
  2.     {       
  3.                         static unsigned char mode = 0;
  4.         count3=0;        //计数3清0
  5.         //signl=1;
  6.         num=25;
  7.         while(num)
  8.         {
  9.             LED11=0;//50%亮度
  10.                                         switch (mode)
  11.           {
  12.                   case 0:
  13.             Led_R();
  14.                           break;
  15.                   case 1:
  16.             Led_R();
  17.                           break;
  18.                   case 2:
  19.             Led_L();
  20.                           break;
  21.                   default:
  22.                           break;
  23.           }
  24.         }
  25.                                 mode++;
  26.                                 mode%=3;
  27.         // LED11=1;
  28.     }
复制代码
回复

使用道具 举报

ID:826754 发表于 2021-7-22 11:19 | 显示全部楼层

首先在这里谢谢大神的帮助,让我达到了想要的效果,加入大神的代码后可以达到选择的流光模式。但同时我又出现了新的问题点就是用遥控选择好模式后单片机断电后就再上电时就没有之前选好的模式了,我使用的是四路无线接收模块,那是否可以用单片机来保存上电后还是上次的选择模式。
以下是改好的程序:但不能保存上次的选择模式。

  1. /***使用STC8F1K08S2-SOP16为主控遥控选择转向流光灯
  2. 1、上电扫描流光左右同时流光三次,日行灯亮。
  3. 2、双闪时,左右同时接到信号,左右跟随信号同时流光。
  4. 3、接收到左或右转向信号时相应方向流光一次常亮,日行灯灭。
  5. 4、断开左或右转向信号时,延时2秒日行灯LED11 100%亮度。
  6. 5、遥控选择模式,D0接收到高电平时转向灯流光。D1接收到高电平时转向灯闪光。D2接收到高电平时先闪光两次再流光一次。
  7. *****/

  8. #include <STC8Fxx.h>  
  9. typedef unsigned char u8;
  10. typedef unsigned int u16;
  11. /********端口引脚定义*****/  
  12. sbit KEYL=P5^5;    //设置左方向触发信号
  13. //sbit KEYR=P5^4;    //设置右方向触发信号
  14. //sbit LOCK=P3^0;    //设置上锁触发信号

  15. sbit LED6=P3^2;    //左方向流光灯设定
  16. sbit LED5=P3^3;
  17. sbit LED4=P3^4;
  18. sbit LED3=P3^5;
  19. sbit LED2=P3^6;
  20. sbit LED1=P3^7;    //右方向流光灯设定

  21. sbit D0=P1^1;           //遥控接收信号
  22. sbit D1=P1^0;           //遥控接收信号
  23. sbit D2=P1^6;           //遥控接收信号
  24. //sbit LEDA=P1^7;

  25. sbit LED11=P1^7;   //日行灯设定

  26. bit signl=0;       //触发状态标志
  27. //bit signr=0;
  28. //bit signk=0;
  29. //bit signy=0;
  30. //bit PWM;
  31. u16 count3=0,num;


  32. void keyScan();

  33. /*********定时器0初始化函数***********/
  34. void Timer0Init()                //5毫秒@11.0592MHz
  35. {
  36.         AUXR |= 0x80;                //定时器时钟1T模式
  37.         TMOD &= 0xF0;                //设置自动重装模式
  38.         TL0 = 0x00;                        //设置定时初值
  39.         TH0 = 0x28;                        //设置定时初值
  40.         TF0 = 0;                                //清除TF0标志
  41.         TR0 = 1;                                //定时器0开始计时
  42.         EA  = 1;                                //开总中断
  43.         ET0 = 1;                                //开T0中断
  44. }
  45. /********左流光函数*********/
  46. void Led_L()
  47. {
  48.         if(num>25)              {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;}
  49.         else if(num<=25&&num>20){LED1=1;LED2=1;LED3=0;LED4=0;LED5=0;LED6=0;}
  50.         else if(num<=20&&num>15){LED1=1;LED2=1;LED3=1;LED4=0;LED5=0;LED6=0;}
  51.         else if(num<=15&&num>10){LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;LED6=0;}
  52.         else if(num<=10&&num>5) {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=0;}
  53.         else if(num>0&&num==5)  {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;}
  54. }
  55. /*******右流光函数******/
  56. void Led_R()
  57. {
  58.         if(num>0&&num==25)              {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;LED6=1;}
  59.        // else if(num<=50&&num>40){LED6=1;LED7=1;LED8=0;LED9=0;LEDA=0;}
  60.        // else if(num<=40&&num>30){LED6=1;LED7=1;LED8=1;LED9=0;LEDA=0;}
  61.        // else if(num<=30&&num>20){LED6=1;LED7=1;LED8=1;LED9=1;LEDA=0;}
  62.        // else if(num<=20&&num>10){LED6=1;LED7=1;LED8=1;LED9=1;LEDA=1;}
  63.        // else if(num>0&&num==10)    {LED6=0;LED7=0;LED8=0;LED9=0;LEDA=0;}
  64. }
  65. /*****扫描流光函数*****/   /***
  66. void Led_K()
  67. {
  68.                 if(num>270)                                        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }
  69.                 else if(num<=270&&num>260)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  70.                 else if(num<=260&&num>250)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  71.                 else if(num<=250&&num>240)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  72.                 else if(num<=240&&num>230)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;       }
  73.                 else if(num<=230&&num>220)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  74.                 else if(num<=220&&num>210)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  75.                 else if(num<=210&&num>200)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  76.                 else if(num<=200&&num>190)        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }     
  77.                 else if(num<=190&&num>180)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=0;       }
  78.                 else if(num<=180&&num>170)        {LED1=0;LED2=0;LED3=1;LED4=0;LED5=0;       }
  79.                 else if(num<=170&&num>160)        {LED1=0;LED2=1;LED3=0;LED4=0;LED5=0;       }
  80.                 else if(num<=160&&num>150)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=0;       }
  81.                 else if(num<=150&&num>140)        {LED1=1;LED2=0;LED3=0;LED4=0;LED5=1;       }
  82.                 else if(num<=140&&num>130)        {LED1=1;LED2=0;LED3=0;LED4=1;LED5=0;       }
  83.                 else if(num<=130&&num>120)        {LED1=1;LED2=0;LED3=1;LED4=0;LED5=0;       }
  84.                 else if(num<=120&&num>110)        {LED1=1;LED2=1;LED3=0;LED4=0;LED5=0;       }
  85.                 else if(num<=110&&num>100)        {LED1=1;LED2=1;LED3=0;LED4=0;LED5=1;       }
  86.                 else if(num<=100&&num>90)        {LED1=1;LED2=1;LED3=0;LED4=1;LED5=0;       }
  87.                 else if(num<=90&&num>80)        {LED1=1;LED2=1;LED3=1;LED4=0;LED5=0;       }
  88.                 else if(num<=80&&num>70)        {LED1=1;LED2=1;LED3=1;LED4=0;LED5=1;       }
  89.                 else if(num<=70&&num>60)        {LED1=1;LED2=1;LED3=1;LED4=1;LED5=0;       }
  90.                 else if(num<=60&&num>50)        {LED1=1;LED2=1;LED3=1;LED4=1;LED5=1;       }
  91.                 else if(num<=50&&num>40)        {LED1=0;LED2=1;LED3=1;LED4=1;LED5=1;       }
  92.                 else if(num<=40&&num>30)        {LED1=0;LED2=0;LED3=1;LED4=1;LED5=1;       }
  93.                 else if(num<=30&&num>20)        {LED1=0;LED2=0;LED3=0;LED4=1;LED5=1;       }
  94.                 else if(num<=20&&num>10)        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=1;       }
  95.                 else if(num<=10&&num>0 )        {LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;       }       
  96. }
  97. /******主函数区******/  
  98. void main()
  99. {
  100.      //   u8 i;
  101.         P3M0=0xFC;//P3.0P3.1为准双向口,其它为推挽输出。      
  102.         P3M1=0x00;
  103.         P1M0=0x80;//设P1口为推挽输出,
  104.         P1M1=0x3C;         
  105.         P5M0=0x00;//设P5.4、P5.5为准双向口.        
  106.         P5M1=0x00;
  107.         P3=0X00;
  108.         P1=0X7F;
  109.                 P5=0X30;  //不可设为底电平   
  110.         Timer0Init();
  111.                 if(KEYL==1)
  112.           {
  113.            
  114.                    keyScan(); //把触发部分的代码打包成函数放在这里执行

  115.           }
  116.        else
  117.                   {LED11=1;}
  118.        //  {      
  119.        // for(i=0;i<1;i++)//上电扫描流光1次
  120.        //         {
  121.        //      num=280;//1.秒
  122.             // if(num==560)
  123.                 //          while(num)
  124.         //       {
  125.         //         Led_K();
  126.                      
  127.         //       }
  128.                 //        if(num==0)         
  129.                          
  130.         //        }  
  131.         // }          
  132.                   
  133.     while(1)         
  134.         {      
  135.                 if(KEYL==1)
  136.                  {                         
  137.                         keyScan();
  138.                  }
  139.         }         
  140. }
  141. /*********定时器0中断服务函数*************/
  142. void timer0() interrupt 1      
  143. {
  144.         /* static unsigned char i=0;
  145.         if(i<3)PWM=1;//占空比75%
  146.         else PWM=0;
  147.         i++;
  148.         i%=4;             */
  149.     //    PWM=~PWM;//PWM周期10ms,占空比50%
  150.                                   
  151.                 if(num>0)
  152.                
  153.                 num--;          
  154.         //if(num==0)
  155.                 if(KEYL!=1)
  156.         {
  157.                 LED1=0;LED2=0;LED3=0;LED4=0;LED5=0;LED6=0;
  158.                                
  159.                                 signl=0;
  160.                         //        signr=0;
  161.                            
  162.                        
  163.                   
  164.                                
  165.                           
  166.                

  167.                         if(++count3>=150)//1.5秒延时
  168.                {
  169.                  count3=150; //保持
  170.                  LED11=1;                //日行灯亮
  171.                }  
  172.         }
  173. }

  174. /********触发子程序函数*********/

  175. void keyScan()
  176. {
  177.                             
  178.              if(KEYL==1  && signl==0 && D0==1 )//左转流光
  179.                 {
  180.                                                 count3=0;        //计数3清0
  181.                         signl=1;
  182.                         num=25;
  183.                         while(num)
  184.                         {
  185.                                 LED11=0;//日行灯灭
  186.                                 Led_L();
  187.                         }
  188.                        
  189.                 }
  190.              if(KEYL==1  && signl==0 && D1==1 )//左转闪光
  191.                 {
  192.                                                 count3=0;        //计数3清0
  193.                         signl=1;
  194.                         num=25;
  195.                         while(num)
  196.                         {
  197.                                 LED11=0;//日行灯灭
  198.                                 Led_R();
  199.                         }
  200.                        ;
  201.                 }  
  202.             if(KEYL==1  && signl==0 && D2==1 )//左转闪光两次流光一次
  203.                 {      
  204.                 static unsigned char mode = 0;
  205.                 count3=0;        //计数3清0
  206.                 signl=1;
  207.                 num=25;
  208.                 while(num)
  209.                  {
  210.                   LED11=0;//日行灯灭
  211.                   switch (mode)
  212.                    {
  213.                   case 0:
  214.             Led_R();
  215.                           break;
  216.                   case 1:
  217.             Led_R();
  218.                           break;
  219.                   case 2:
  220.             Led_L();
  221.                           break;
  222.                   default:
  223.                           break;
  224.                   }
  225.                 }
  226.                                 mode++;
  227.                                 mode%=3;
  228.                
  229.                }
  230. }
复制代码
回复

使用道具 举报

ID:161164 发表于 2021-7-23 00:28 | 显示全部楼层
川蜀浪子 发表于 2021-7-22 11:19
首先在这里谢谢大神的帮助,让我达到了想要的效果,加入大神的代码后可以达到选择的流光模式。但同时我又 ...

那就涉及到EEPROM的读写操作了
可搜索坛内STC EEPROM操作的例子
或参考STC-ISP内的范例
回复

使用道具 举报

ID:826754 发表于 2021-7-23 08:40 | 显示全部楼层
lkc8210 发表于 2021-7-23 00:28
那就涉及到EEPROM的读写操作了
可搜索坛内STC EEPROM操作的例子
或参考STC-ISP内的范例

谢谢大神的指点,但目前对STC EEPROM的操作还一点都不懂,看了手册的例程也没明白要怎样写入我想要的数据,可以请大神帮指点一下这方面的程序。
回复

使用道具 举报

ID:161164 发表于 2021-7-23 15:38 来自手机 | 显示全部楼层
川蜀浪子 发表于 2021-7-23 08:40
谢谢大神的指点,但目前对STC EEPROM的操作还一点都不懂,看了手册的例程也没明白要怎样写入我想要的数据 ...

例程中定义和函数部分照抄就可以
写数据就是IapProgram(地址,数据)
读数据就是 数据=IapRead(地址)
要注意STC EEPROM的写是写入零
所有地址的初始值为0xFF
如写入0xA9(B10101001)后
就不能再写入0xB9(B10111001)
但可写入0x89(B10001001)
所以想更改EEProm中的数值,通常是先擦除再写入
但擦除是按扇区(512字节)进行的
如果已储存多于一个字节的数据
正常做法是
先读取所有数据到变数中
更改某变数中的数值
擦除扇区
把所有变数写入EEProm

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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