标题:
51单片机延时超过1分钟程序就不按照代码执行下去了?
[打印本页]
作者:
鬼推磨
时间:
2021-3-23 08:15
标题:
51单片机延时超过1分钟程序就不按照代码执行下去了?
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(); //扫描启动开关
}
}
作者:
qiangtech
时间:
2021-3-23 09:17
IO端口不用设置工作模式的吗?定时器有设置也没见打开运行啊。
作者:
天地摩登恒
时间:
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又没有重新赋值啊!!!
作者:
dsf232
时间:
2021-3-23 11:01
Delay35000ms
作者:
dsf232
时间:
2021-3-23 11:04
Delay35000ms(),这个函数有问题,你的变量是无符号类型,当 k/j减到到小于0时,就变成255,之后循环体就是跑,while(255--){while(255--);},又没有重新赋值,所以这个延时会被拉的很长
作者:
wulin
时间:
2021-3-23 20:59
本帖最后由 wulin 于 2021-3-24 08:06 编辑
按楼主程序表达:加电初始态k1、k2关。按k4启动,k2开,持续35s后k1开,再持续35sk1关,延时20ms后k2关,恢复初始态。虽然楼主程序写法有点另类。但语法、逻辑功能和数据变量类型都没有错。仿真测试正常,不会发生——不按照代码执行下去的现象。除非硬件与软件不符。
按楼主意图用倒计时方法实现此功能,还可以并行运行其它程序。不会因为等待时间影其它程序运行。
#include "reg52.h"
#define uchar unsigned char
#include <intrins.h>
sbit k1=P1^2;//电机开关
sbit k2=P1^1;//调速开关
sbit k4=P2^0;//启动开关
bit lock=0;
unsigned char count=0;
unsigned int num=0;
void Timer0Init() //10毫秒@11.0592MHz
{
TMOD= 0x01; //设置定时器模式
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
//扫描按键
void Scan_Key()
{
if(k4==0)//按下
{
if(++count>=2 && lock==0)//20ms防抖
{
lock=1;//锁定
num=7002;//赋值定时时间7002*10ms
}
}
}
void main()
{
k1=0;//上电不吸合
k2=0;//调速器开关不吸合
Timer0Init();//初始化定时器
while(1)
{
if(TF0==1)//查询中断请求标志
{
TF0=0;//清0
TL0 = 0x00; //设置定时初值
TH0 = 0xDC; //设置定时初值
Scan_Key(); //扫描启动开关
if(lock==1)
{
if(num>3502)k2=1;//调速器开关打开
if(num>2 && num<=3502)k1=1;//电机开关打开
if(num>0 && num<=2)k1=0;//电机关闭
num--;
if(num==0)
{
k2=0;//调速器开关关闭
lock=0;//允许按键操作
}
}
}
}
}
复制代码
作者:
ANT1987
时间:
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;//调速器开关关闭
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1