找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1466|回复: 7
收起左侧

关于骑自行车LED胸牌的单片机程序

[复制链接]
ID:1087674 发表于 2023-7-7 17:46 | 显示全部楼层 |阅读模式
想自行车后面装一个LED胸牌做的显示屏,这样夜晚骑车安全点。自己不会写。因为胸牌内置程序不能改,只能用单片机控制自动切换字体了。
这程序要求如下:

  开关打开,LED屏和单片机同时上电,LED屏初始化后,自动显示“小心尾随”。

下面为单片机需要的程序:

单片机上电后,输入高电平,输出高电平。//LED屏显示“小心尾随”字不变。

(1)当刹车时:输入低电平,单片机输出低电平350毫秒。//(此时等于手动按了下胸牌的切换键,LED屏显示“刹车.....)

(2)当一直刹车时:输入一直是低电平,单片机在步骤(1)输出低电平350毫秒后保持输出高电平。//(此时LED屏会一直显示“刹车....”)

(3)当松开刹车时:输入高电平,单片机输出低电平350毫秒后恢复输出高电平,然后再次输出低电平350毫秒。//(此时LED屏跳过内置的滚动播放内容后显示“小心尾随”)

(4)再次刹车时和松开刹车时,程序又从以上(1)至(3)循环。
————————————————————————————————————————————————————————————————


是的,硬件我自己会搞,但不会编程,想编来骑自行车。买了个STC15W204S单片机,特别是那个延时不会弄。帮我看下下面自己糊弄的这个程序。
#include <reg52.h>
#define uint  unsigned int
sbit key  = P3^4;
sbit led  = P3^5;

初始输入端口和输出端口电平
/******************主程序**********************/
void main()
{
        while(1)
         {
                 if(key=0)                      //刹车
                 {
                    led=0;                       //输出低电平,PNP三极管开启,LED显示“刹车”
                    delay(350);
                  }
                    if(key=1);                     //松开手挚
                 {
                    led=0;                        //输出低电平,PNP三极管开启,LED显示“勿靠近”
                    delay(350);
                  }
   
                 if(key=0)                       //再次刹车
                 {
                    led=0;                     
                    delay(350);
                    led=0;                      //连续两次输出低电平,连续两次开关PNP三极管,LED跳过闪烁程序后再次显示“刹车”
                    delay(350);
                  }
         }
}

void delay_1ms(uint 350)
{
        uint i,j;
        for(i=0;i<350;i++)
           for(j=0;j<120;j++);
}
回复

使用道具 举报

ID:161164 发表于 2023-7-8 11:27 | 显示全部楼层
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int
  4. sbit key  = P3^4;
  5. sbit led  = P3^5;
  6. void Delay10ms()                //@12.000MHz
  7. {
  8.     unsigned char data i, j;

  9.     i = 117;
  10.     j = 184;
  11.     do
  12.     {
  13.         while (--j);
  14.     }
  15.     while (--i);
  16. }

  17. //初始输入端口和输出端口电平
  18. /******************主程序**********************/
  19. void main()
  20. {
  21.     bit key_old = 1;
  22.         uchar Output_cnt = 0;
  23.         uchar cnt_35 = 0;
  24.     while(1)
  25.     {
  26.                 if(Output_cnt == 0)//没有脉冲输出
  27.                 {                       
  28.                         if(key != key_old)//手刹信号变化
  29.                         {
  30.                                 if(!key)//手刹按下
  31.                                 {
  32.                                         Output_cnt = 1;//输出1次脉冲
  33.                                 }else{//手刹放开
  34.                                         Output_cnt = 2;//输出2次脉冲
  35.                                 }
  36.                         }       
  37.                 }else{//有脉冲输出       
  38.                         if(cnt_35==0)led = 0;//输出低电平
  39.                         if(++cnt_35>=35)//计时350ms
  40.                         {
  41.                                 led = 1;//输出高电平
  42.                                 Output_cnt--;//脉冲次数减一
  43.                                 cnt_35=0;//计时清零
  44.                         }       
  45.                 }
  46.                 key_old = key;//更新手刹信号
  47.                 Delay10ms();//控制10ms一次循环
  48.     }
  49. }
复制代码
回复

使用道具 举报

ID:1087674 发表于 2023-7-12 11:48 | 显示全部楼层

非常感谢,我很多看不懂,怎么完全跟我学的不一样,看来是高手。我们慢慢研究下再试下。再次感谢你,可以帮我实现这个功能,而且还可学到东西。
回复

使用道具 举报

ID:1087674 发表于 2023-7-23 19:01 来自手机 | 显示全部楼层
lkc8210 发表于 2023-7-8 11:27

刚把电路搞好,烧录了程序,按下能变化,但是还是没跳过第三种轮流播放。你给的这个程序不对。你这个是输入低电平(刹车),然后输出低电平,然后放开刹车后没变化,又刹车(再次输入低电平)才再输出低电平,LED屏才变。
我要的效果是:放开刹车(输入低电平),输出低电平,LED屏变化一次。
电路图和实物如图。另外,我开始给单片机供电5伏,差点烧了,幸亏这个单片机有自动保护。手不小心摸到芯片烫得起泡了。
http://www.51hei.com/bbs/dpj-230653-1.html




回复

使用道具 举报

ID:161164 发表于 2023-7-24 10:13 | 显示全部楼层
农民阿伯 发表于 2023-7-23 19:01
刚把电路搞好,烧录了程序,按下能变化,但是还是没跳过第三种轮流播放。你给的这个程序不对。你这个是输 ...

由于你要求的脉冲信号低电平要350ms
但没说两个低电平之间的高电平是多少
所以我假设是10ms

可能是高电平时间不够长
改为以下代码:
if(cnt_35==10)led = 0;//输出低电平
if(++cnt_35>=45)//计时350ms
回复

使用道具 举报

ID:1087674 发表于 2023-7-24 11:39 | 显示全部楼层
lkc8210 发表于 2023-7-24 10:13
由于你要求的脉冲信号低电平要350ms
但没说两个低电平之间的高电平是多少
所以我假设是10ms

总之十分感谢。请问,最后这句: Delay10ms();//控制10ms一次循环
时间要不要改呢?
回复

使用道具 举报

ID:1087674 发表于 2023-7-28 00:33 | 显示全部楼层
lkc8210 发表于 2023-7-24 10:13
由于你要求的脉冲信号低电平要350ms
但没说两个低电平之间的高电平是多少
所以我假设是10ms

刚有空再重新改了程序,还是跳不过第三种方式。这个LED胸牌是先显示“小心尾随”,然后显示“刹车”,然后再放开手刹自动显示第三种方式:显示“MI-8”后显示“小心尾随”然后显示“刹车”,然后一直重复“小心尾随”和“刹车”。就是想跳过第三种默认的方式。如果手动快速按是可以跳过的,时间也很短。
回复

使用道具 举报

ID:1087674 发表于 2023-7-28 10:25 | 显示全部楼层
lkc8210 发表于 2023-7-24 10:13
由于你要求的脉冲信号低电平要350ms
但没说两个低电平之间的高电平是多少
所以我假设是10ms

程序是否有问题。我要的是刹车显示“刹车”,松开刹车时显示“小心尾随”,即输入端低电平时显示,高电平又显示。但是这个程序是每次都是要低电平才显示。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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