我设置了p34-p36延迟循环6000-9000毫秒
但是这玩意40秒才亮一次
#include <reg52.h>
#include <stdlib.h>
sbit EN = P1^6; //使能
sbit A1 = P1^7;
sbit B1 = P1^5;
sbit Key1 = P1^0;
sbit Key2 = P1^1; //按键
sbit Key3 = P1^2; //按键
sbit Key4 = P3^7; //按键!
sbit Key5 = P3^5; //按键!
sbit Key6 = P3^4; //按键!
sbit Key7 = P3^6; //按键!
void delay_ms(unsigned int time_ms) {
unsigned int i, j;
for (i = 0; i < time_ms; i++) {
for (j = 0; j < 1000; j++) {
// 指令延迟
}
}
}
unsigned int generate_random_delay() {
srand(TL0); // 使用定时器 TL0 的值作为种子
return (rand() % 3001) + 6000; // 在6000到9000毫秒之间生成随机延迟时间
}
void D_MS(void){
unsigned int i = 80; //速度 (快60-10000慢)(B-04螺距为3mm时600=200转/分钟,即每秒滑块走10mm)(B-05螺距为2mm时500=250转/分钟,即8.3mm/S)
for(; i > 0; i--) { //(B-05螺距为2mm时1200=100转/分钟,即3.3mm/S)(B-05螺距为2mm时2200=25转/分钟,即2mm/S)
delay_ms(1);
}
}
void RRM(void){
EN = 1;
A1 = 1;
D_MS();
B1 = 1;
D_MS();
A1 = 0;
D_MS();
B1 = 0;
D_MS();
EN = 0;
}
void LLM(void){
EN = 1;
B1 = 0;
D_MS();
A1 = 0;
D_MS();
B1 = 1;
D_MS();
A1 = 1;
D_MS();
EN = 0;
}
void main() {
A1 = 0;
B1 = 0;
EN = 0;
while(1) {
if(Key2 == 0) {
delay_ms(20); // 按键去抖动
if(Key2 == 0) {
RRM();
}
while(Key2 == 0) {} // 等待按键释放
}
if(Key3 == 0) {
delay_ms(20); // 按键去抖动
if(Key3 == 0) {
LLM();
}
while(Key3 == 0) {} // 等待按键释放
}
if(Key4 == 0) {
delay_ms(20); // 按键去抖动
if(Key4 == 0) {
RRM();
}
while(Key4 == 0) {} // 等待按键释放
}
if(Key5 == 0) {
delay_ms(20); // 按键去抖动
if(Key5 == 0) {
LLM();
}
while(Key5 == 0) {} // 等待按键释放
}
delay_ms(1);
Key7 = 0;
delay_ms(600);
Key7 = 1;
delay_ms(1);
Key6 = 0;
delay_ms(600);
Key6 = 1;
delay_ms(generate_random_delay());
}
}
引用 皆我百晓生 小程序回复内容作答:
在你的代码中,延迟函数 delay_ms
中有两个嵌套的循环,用于实现时间延迟。目前,你使用的是一个固定的延迟时间 delay_ms(1)
。这会导致每次循环的延迟时间非常短,导致亮灯时间间隔很短,大约40秒才亮一次。
解决方法是通过修改 delay_ms
函数来实现所需的延迟时间。你可以使用定时器来生成精确的延迟时间。
以下是修改后的代码示例:
void delay_ms(unsigned int time_ms) {
// 使用定时器 T0 来实现延迟
TMOD |= 0x01; // 设置 T0 为模式 1,16 位定时器
TH0 = (65536 - 922); // 设置计数初值,用于延迟大约 1ms
TL0 = (65536 - 922);
TR0 = 1; // 启动定时器
while (time_ms > 0) {
while (TF0 == 0) {} // 等待定时器溢出
TR0 = 0; // 停止定时器
TF0 = 0; // 清除溢出标志
TH0 = (65536 - 922); // 重新设置初值
TL0 = (65536 - 922);
time_ms--; // 减少剩余延迟时间
TR0 = 1; // 启动定时器
}
TR0 = 0; // 停止定时器
}
在这个修改后的 delay_ms
函数中,我们使用了定时器 T0 来实现精确的延迟时间。通过设置计数初值为 (65536 - 922)
,每次定时器溢出大约需要 1ms 的时间。通过循环等待定时器溢出,并在溢出时重新设置初值,可以实现精确的延迟时间。
通过使用这个修改后的延迟函数,在你的主循环中调用 delay_ms
函数时,可以获得所需的延迟时间,以达到你想要的效果。
【相关推荐】
· · 什么是数组:
数组是一个变量,由数据类型相同的一组元素组成。(内存中的一串连续的空间)
数组只有一个名称,即标识符(用来表示数组的变量名);
元素的下标标明了元素在数组中的位置,从0开始;
数组中的每个元素都可以通过下标来访问;
数组长度固定不变,避免数组越界;
· · 数组的结构和基本要素:
① 标识符:数组的名称,用于区分不同的数组
② 数组元素:向数组中存放的数据
③ 元素下标:对数组元素进行编号
④ 元素类型:数组元素的数据类型