找回密码
 立即注册

QQ登录

只需一步,快速开始

帖子
查看: 2235|回复: 7
收起左侧

单片机开关点灯程序求思路

[复制链接]
ID:72649 发表于 2021-9-22 07:31 | 显示全部楼层 |阅读模式
只要单片机p20低电平,延时十五秒p00的led灯点亮,延时五秒p01的led灯熄灭,断开p20,延时五秒p01点亮,延时十秒p00点熄灭。p20接开关。这个代码怎么完成。求大神给个思路
回复

举报

ID:584814 发表于 2021-9-22 10:13 | 显示全部楼层
楼主求的思路有点清奇,你这问题本身就是思路除非有某处短路
回复

举报

ID:161164 发表于 2021-9-22 12:38 | 显示全部楼层
給一段例子,讓你參考
中斷內容自己思考一下

  1. void main()
  2. {
  3.     Timer1Init();
  4.     Sys_Init();
  5.                 P01 = 0;
  6.                 P00 = 1;
  7.     while (1)
  8.     {
  9.                                         if(!Delayms_1000)//在1ms定时中断中减一,直到零
  10.                                         {Delayms_1000=1000;//重载
  11.                                                 if(Sec<30)Sec++;
  12.                                         }
  13.                                         if(++Delay_Filter>250)
  14.                                         {Delay_Filter = 0;
  15.                                                 if(P20 != P20_O)//按键变化
  16.                                                 {
  17.                                                         Delayms_1000=1000;//重载
  18.                                                         Sec = 0;//清零
  19.                                                 }P20_O = P20;
  20.                                                 if(!P20)//按下
  21.                                                 {
  22.                                                         if(Sec>=15)P00 = 0;
  23.                                                         if(Sec>=20)P01 = 1;
  24.                                                 }else//<span style="font-family: Tahoma, &quot;Microsoft Yahei&quot;, SimSun;">放开</span>
  25.                                                 {
  26.                                                         if(Sec>=5)P01 = 0;
  27.                                                         if(Sec>=10)P00 = 1;
  28.                                                 }                                               
  29.                                         }                       
  30.     }
  31. }
复制代码



回复

举报

ID:90613 发表于 2021-9-22 13:31 | 显示全部楼层
while(1)
{
  if(P20)
  {
    delay_ms(5000);
    P01=1;
    delay_ms(5000);
    P00=0;
  }
  else
  {
    delay_ms(5000);
    P01=0;
    delay_ms(10000);
    P00=1;
  }
}
回复

举报

ID:123289 发表于 2021-9-22 16:18 | 显示全部楼层
你需要计几种时间,就做几个计时器,如JS1、JS2,JS2……
开一个定时中断,在中断服务程序中对JS1、JS2,JS2……计时,但计时的条件由P20决定。
接下来,当计时计满时,做你要做的事。
这其中还需要考虑,如何初始化,如何结束,如何开起,自己想想吧。
还是不会做的话,教你最后一着:改学CEO专业,让别人为你打工,做这件事。

回复

举报

ID:359272 发表于 2021-9-23 08:13 | 显示全部楼层
yzwzfyz 发表于 2021-9-22 16:18
你需要计几种时间,就做几个计时器,如JS1、JS2,JS2……
开一个定时中断,在中断服务程序中对JS1、JS2,J ...

最后一招,有详细教程吗?我想学
回复

举报

ID:72649 发表于 2021-9-24 22:29 | 显示全部楼层
lkc8210 发表于 2021-9-22 12:38
給一段例子,讓你參考
中斷內容自己思考一下

void Timer0Init(void)                //20毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式
        TMOD &= 0xF0;                //设置定时器模式
        TL0 = 0xE0;                //设置定时初始值
        TH0 = 0xB1;                //设置定时初始值
        TF0 = 0;                //清除TF0标志
        TR0 = 1;                //定时器0开始计时
}

timer0() interrupt 1
{
        SysTick++;      
}

void Delay_20ms(unsigned long var)
{
    unsigned long i;
      
        i = SysTick;

        while(SysTick-i < var)
        {
       ;
        }   
}这个代码对吗?
回复

举报

ID:161164 发表于 2021-9-25 23:45 | 显示全部楼层
hjx5548 发表于 2021-9-24 22:29
void Timer0Init(void)                //20毫秒@12.000MHz
{
        AUXR &= 0x7F;                //定时器时钟12T模式

定时器初始化正确
中断内容请了解一下我的代码
再去想怎样写
回复

举报

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

本版积分规则

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

Powered by 单片机教程网

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