找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1316|回复: 7
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 2021-9-22 07:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
只要单片机p20低电平,延时十五秒p00的led灯点亮,延时五秒p01的led灯熄灭,断开p20,延时五秒p01点亮,延时十秒p00点熄灭。p20接开关。这个代码怎么完成。求大神给个思路
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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;
  }
}
回复

使用道具 举报

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

回复

使用道具 举报

6#
ID:359272 发表于 2021-9-23 08:13 | 只看该作者
yzwzfyz 发表于 2021-9-22 16:18
你需要计几种时间,就做几个计时器,如JS1、JS2,JS2……
开一个定时中断,在中断服务程序中对JS1、JS2,J ...

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

使用道具 举报

7#
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)
        {
       ;
        }   
}这个代码对吗?
回复

使用道具 举报

8#
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 单片机教程网

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