找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1364|回复: 6
收起左侧

求51单片机顺序延时程序的设计思路

[复制链接]
ID:53978 发表于 2021-5-8 20:47 | 显示全部楼层 |阅读模式
先谢谢大家

想一个按键按下后LED0-LED7按照顺序延时点亮,延时时间不等,松开按键后反向延时熄灭。请大侠赐教。指导一下如何下手
回复

使用道具 举报

ID:213173 发表于 2021-5-9 06:06 | 显示全部楼层
按键按下或松手后,先读LED0-LED7的当前状态,再确定后续状态。延时时间按需任意调整num值。
  1. #include<reg52.h>

  2. sbit key=P3^4;

  3. unsigned int num;

  4. void delay(unsigned int t)//12M晶振延时时间 = t*8+6 (us)
  5. {
  6.         while(--t);
  7. }

  8. void main(void)
  9. {
  10.         while(1)
  11.         {
  12.                 if(!key)
  13.                 {
  14.                         switch(P1)
  15.                         {
  16.                                 case 0xff: P1=0xfe;num=30000; break;
  17.                                 case 0xfe: P1=0xfc;num=35000; break;
  18.                                 case 0xfc: P1=0xf8;num=40000; break;
  19.                                 case 0xf8: P1=0xf0;num=45000; break;
  20.                                 case 0xf0: P1=0xe0;num=50000; break;
  21.                                 case 0xe0: P1=0xc0;num=55000; break;
  22.                                 case 0xc0: P1=0x80;num=60000; break;
  23.                                 case 0x80: P1=0x00;num=65000; break;
  24.                         }
  25.                 }
  26.                 else
  27.                 {
  28.                         switch(P1)
  29.                         {
  30.                                 case 0xfe: P1=0xff;num=30000; break;
  31.                                 case 0xfc: P1=0xfe;num=35000; break;
  32.                                 case 0xf8: P1=0xfc;num=40000; break;
  33.                                 case 0xf0: P1=0xf8;num=45000; break;
  34.                                 case 0xe0: P1=0xf0;num=50000; break;
  35.                                 case 0xc0: P1=0xe0;num=55000; break;
  36.                                 case 0x80: P1=0xc0;num=60000; break;
  37.                                 case 0x00: P1=0x80;num=65000; break;
  38.                         }                       
  39.                 }
  40.                 delay(num);
  41.         }
  42. }
复制代码
回复

使用道具 举报

ID:53978 发表于 2021-5-9 10:37 | 显示全部楼层
wulin 发表于 2021-5-9 06:06
按键按下或松手后,先读LED0-LED7的当前状态,再确定后续状态。延时时间按需任意调整num值。

感谢感谢 马上来试试
回复

使用道具 举报

ID:53978 发表于 2021-5-9 10:59 | 显示全部楼层
wulin 发表于 2021-5-9 06:06
按键按下或松手后,先读LED0-LED7的当前状态,再确定后续状态。延时时间按需任意调整num值。

刚才测试了 不管怎么改num值都是速度很快的流水灯状态,8个LED顺序点亮时间在2s左右,还请大侠帮忙看看什么原因?感谢。
回复

使用道具 举报

ID:213173 发表于 2021-5-9 14:04 | 显示全部楼层
smartphone 发表于 2021-5-9 10:59
刚才测试了 不管怎么改num值都是速度很快的流水灯状态,8个LED顺序点亮时间在2s左右,还请大侠帮忙看看 ...

void delay(unsigned int t)//12M晶振延时时间 = t*8+6 (us)
unsigned int t 的最大值65535,需要长延时得改数据类型或改函数体。
/****ms延时函数(12MHz)****/
void delay(unsigned int k)//k=ms
{
        uint i,j;
        for(i=k;i>0;i--)
                for(j=120;j>0;j--);
}
回复

使用道具 举报

ID:53978 发表于 2021-5-9 23:54 | 显示全部楼层
wulin 发表于 2021-5-9 14:04
void delay(unsigned int t)//12M晶振延时时间 = t*8+6 (us)
unsigned int t 的最大值65535,需要长延时 ...

感谢感谢 这个可以了
回复

使用道具 举报

ID:149799 发表于 2021-5-10 09:36 | 显示全部楼层
谢谢热心的WULIN,有你更精彩。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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