找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机延时超过1分钟程序就不按照代码执行下去了?

[复制链接]
跳转到指定楼层
楼主
ID:475031 发表于 2021-3-23 08:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

51单片机延时超过1分钟程序就不按照代码执行下去了?
各位大咖帮我看看下面代码:        到底是那出错了,谢谢!
始终不能运行到这句代码,后面更不会执行了:
while(!k4);//等待k4按键释放
k4已经断开,也不执行下面、
始终在这句上面循环执行while(!k4);//等待k4按键释放
执行时间始终不到70秒,只能运行40秒左右的样子,
k1=0;电机关
k2=1;//调速器开关打开                                                                                                                               
Delay35000ms();//延时35秒                                                               
k1=1;//电机开关打开
Delay35000ms();//延时35秒

一直在上面几句代码循环执行不停机了

下面是完整的代码

#include "reg52.h"
#define uchar unsigned char  

#include <intrins.h>
sbit k1=P1^2;//电机开关
sbit k2=P1^1;//调速开关
sbit k4=P2^0;/启动开关



///////delay(1000); //延时1000毫秒=1秒//////////       
void delay(unsigned int times)
{
   unsigned int i;
TR0=1;
for(i=0;i<times;i++)
{
        TH0=0XFC;        //给定时器赋初值,定时1ms
        TL0=0x67;
while(TF0==0);
TF0=0;//中断标志位
}
TR0=0;
}



void Delay35000ms()                //@11.0592MHz 延时35秒
{
        unsigned char i, j, k;

        _nop_();
        i = 246;
        j = 34;
        k = 228;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}




//扫描按键
void Scan_Key()
{
        if(k4 == 0)
        {
                delay(10);
                if(k4 == 0)//防抖
                {
k1=0;电机关
k2=1;//调速器开关打开                                                                                                                               
Delay35000ms();//延时35秒                                                               
k1=1;//电机开关打开
Delay35000ms();//延时35秒
        while(!k4);//等待k4按键释放
k1=0;//电机关闭
        delay(20);
k2=0;//调速器开关关闭
                                         }
}
       



main()
{
k1=0;//上电不吸合
k2=0;////调速器开关不吸合
TMOD=0x01;
TH0=0XFC;        //给定时器赋初值,定时1ms
TL0=0x67;
while(1)
    {  
Scan_Key(); //扫描启动开关
                        }
            }        








分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:892596 发表于 2021-3-23 09:17 | 只看该作者
IO端口不用设置工作模式的吗?定时器有设置也没见打开运行啊。

评分

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

查看全部评分

回复

使用道具 举报

板凳
ID:95703 发表于 2021-3-23 10:06 | 只看该作者
这个明显有问题啊void Delay35000ms()                //@11.0592MHz 延时35秒
{
        unsigned char i, j, k;

        _nop_();
        i = 246;
        j = 34;
        k = 228;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
  特别是3重do while 。   当while (--k);  K减到0后,执行第二重while (--j);   这时K又没有重新赋值啊!!!

评分

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

查看全部评分

回复

使用道具 举报

地板
ID:363696 发表于 2021-3-23 11:01 | 只看该作者
Delay35000ms
回复

使用道具 举报

5#
ID:363696 发表于 2021-3-23 11:04 | 只看该作者
Delay35000ms(),这个函数有问题,你的变量是无符号类型,当 k/j减到到小于0时,就变成255,之后循环体就是跑,while(255--){while(255--);},又没有重新赋值,所以这个延时会被拉的很长

评分

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

查看全部评分

回复

使用道具 举报

6#
ID:213173 发表于 2021-3-23 20:59 | 只看该作者
本帖最后由 wulin 于 2021-3-24 08:06 编辑

按楼主程序表达:加电初始态k1、k2关。按k4启动,k2开,持续35s后k1开,再持续35sk1关,延时20ms后k2关,恢复初始态。虽然楼主程序写法有点另类。但语法、逻辑功能和数据变量类型都没有错。仿真测试正常,不会发生——不按照代码执行下去的现象。除非硬件与软件不符。
按楼主意图用倒计时方法实现此功能,还可以并行运行其它程序。不会因为等待时间影其它程序运行。
  1. #include "reg52.h"
  2. #define uchar unsigned char  
  3. #include <intrins.h>

  4. sbit k1=P1^2;//电机开关
  5. sbit k2=P1^1;//调速开关
  6. sbit k4=P2^0;//启动开关

  7. bit lock=0;
  8. unsigned char count=0;
  9. unsigned int num=0;

  10. void Timer0Init()        //10毫秒@11.0592MHz
  11. {
  12.         TMOD= 0x01;                //设置定时器模式
  13.         TL0 = 0x00;                //设置定时初值
  14.         TH0 = 0xDC;                //设置定时初值
  15.         TF0 = 0;                //清除TF0标志
  16.         TR0 = 1;                //定时器0开始计时
  17. }
  18. //扫描按键
  19. void Scan_Key()
  20. {               
  21.         if(k4==0)//按下
  22.         {
  23.                 if(++count>=2 && lock==0)//20ms防抖
  24.                 {
  25.                         lock=1;//锁定
  26.                         num=7002;//赋值定时时间7002*10ms
  27.                 }
  28.         }
  29. }

  30. void main()
  31. {
  32.         k1=0;//上电不吸合
  33.         k2=0;//调速器开关不吸合
  34.         Timer0Init();//初始化定时器
  35.         while(1)
  36.         {  
  37.                 if(TF0==1)//查询中断请求标志
  38.                 {
  39.                         TF0=0;//清0
  40.                         TL0 = 0x00;                //设置定时初值
  41.                         TH0 = 0xDC;                //设置定时初值
  42.                         Scan_Key();         //扫描启动开关
  43.                         if(lock==1)
  44.                         {
  45.                                 if(num>3502)k2=1;//调速器开关打开
  46.                                 if(num>2 && num<=3502)k1=1;//电机开关打开       
  47.                                 if(num>0 && num<=2)k1=0;//电机关闭
  48.                                 num--;
  49.                                 if(num==0)
  50.                                 {
  51.                                         k2=0;//调速器开关关闭                               
  52.                                         lock=0;//允许按键操作
  53.                                 }
  54.                         }
  55.                 }
  56.         }
  57. }
复制代码



评分

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

查看全部评分

回复

使用道具 举报

7#
ID:894154 发表于 2021-3-24 15:31 | 只看该作者
按照我的理解,按键防抖以后,先判断开关松开再往下执行,即:
if(k4 == 0)
        {
                delay(10);
                if(k4 == 0)//防抖
                {
while(!k4);//等待k4按键释放
k1=0;电机关
k2=1;//调速器开关打开                                                                                                                              
Delay35000ms();//延时35秒                                                               
k1=1;//电机开关打开
Delay35000ms();//延时35秒
      //  while(!k4);//等待k4按键释放
k1=0;//电机关闭
        delay(20);
k2=0;//调速器开关关闭
                                         }

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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