请问一个单片机延时问题
#include<reg51.h>#define SHOW P0
sbit btnStart = P1^0;
sbit btnStop = P1^7;
sbit btnP = P1^1;
sbit btnR = P1^2;
sbit btnN = P1^3;
sbit btnD = P1^4;
sbit lwP = P2^0;
sbit lwN = P3^4;
sbit rwP = P2^1;
sbit rwN = P3^5;
int fStart = 0;
int fP = 0;
int fR = 0;
int fN = 0;
int fD = 0;
int segP = 0x8c;
int segR = 0x88;
int segN = 0xc8;
int segD = 0xa1;
void gearP();
void gearR();
void gearN();
void gearD();
void initial();
void delay(int time);
void main()
{
initial();
while(1)
{
if(btnStart == 0)
{
while(btnStart == 0)
{
;
}
fStart = 1;
}
if(btnStop == 0)
{
while(btnStop == 0)
{
;
}
fStart = 0;
}
if(fStart == 1)
{
if(btnP == 0)
{
while(btnP == 0)
{
;
}
fP = 1;
fR = 0;
fN = 0;
fD = 0;
}
if(btnR == 0)
{
while(btnR == 0)
{
;
}
fP = 0;
fR = 1;
fN = 0;
fD = 0;
}
if(btnN == 0)
{
while(btnN == 0)
{
;
}
fP = 0;
fR = 0;
fN = 1;
fD = 0;
}
if(btnD == 0)
{
while(btnD == 0)
{
;
}
fP = 0;
fR = 0;
fN = 0;
fD = 1;
}
if(fP == 1)
{
gearP();
}
if(fR == 1)
{
gearR();
}
if(fN == 1)
{
gearN();
}
if(fD == 1)
{
gearD();
}
}
else
{
initial();
}
}
}
void gearP()
{
SHOW = segP;
lwP = 1;
lwN = 1;
rwP = 1;
rwN = 1;
}
void gearR()
{
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);
}
void gearN()
{
SHOW = segN;
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
}
void gearD()
{
SHOW = segD;
lwP = 1;
lwN = 0;
rwP = 1;
rwN = 0;
}
void initial()
{
fStart = 0;
fP = 0;
fR = 0;
fN = 0;
fD = 0;
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
}
void delay(int time)
{
int i,j;
for(i=0;i<time;i++)
{
for(j=0;j<120;j++)
{
;
}
}
}
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);这段 为什么后面延时一定要加
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);不是有delay(20);了吗
单片机,是硬软相结合的东西,必须知道你控制或驱动的是什么,
根据楼主代码,我大该说一下
#include<reg51.h>//头文件
#define SHOW P0 //宏定义,即替代名
sbit btnStart = P1^0;//位定义
sbit btnStop = P1^7;
sbit btnP = P1^1;
sbit btnR = P1^2;
sbit btnN = P1^3;
sbit btnD = P1^4;
sbit lwP = P2^0; //位定义
sbit lwN = P3^4;
sbit rwP = P2^1;
sbit rwN = P3^5;
int fStart = 0; //变量定义 并赋值
int fP = 0;
int fR = 0;
int fN = 0;
int fD = 0;
int segP = 0x8c; //变量定义 并赋值
int segR = 0x88;
int segN = 0xc8;
int segD = 0xa1;
void gearP(); //某功能函数声明
void gearR(); //某功能函数声明
void gearN(); //某功能函数声明
void gearD(); //某功能函数声明
void initial(); //初始化函数声明
void delay(int time); //延时函数,带参
void main()
{
initial(); //初始化
while(1) //原地真循环
{
if(btnStart == 0) //如果I/O P10脚为 低电平
{
while(btnStart == 0)// 则等待 P10脚为 高电平
{
;
}
fStart = 1; //如果I/O P10脚为 高电平 ,则 fStart 变量 赋值为1
}
if(btnStop == 0) //如果I/O P17脚为 低电平
{
while(btnStop == 0)// 则等待 P17脚为 高电平
{
;
}
fStart = 0; //如果I/O P17脚为 高电平 ,则 fStart 变量清零
}
/*上面变量 fStart 应该是当作一个标号变量在使用 */
if(fStart == 1) //如果 fStart 变量 值为1 则说明I/O P10脚为 低电平 ;将执行以下内容(也说明I/O P10脚为低电平此步才能进入)
{
if(btnP == 0) //如果P11脚为低电平,
{
while(btnP == 0)//等待P11脚为高电平 (即低电平原地空循环,高电平跳出循环)
{
;
}
//当P11脚变高电平后
fP = 1; // fP变量赋值1
fR = 0; // fR变量赋值0
fN = 0; // fN变量赋值0
fD = 0; // FD变量赋值0
}
if(btnR == 0)// 如果P12脚为低电平,
{
while(btnR == 0)// 同上
{
;
}
fP = 0; //同上,仅值不一样
fR = 1;
fN = 0;
fD = 0;
}
if(btnN == 0)//如果P13脚为低电平,
{
while(btnN == 0) //同上
{
;
}
fP = 0;
fR = 0;
fN = 1;
fD = 0;
}
if(btnD == 0) //如果P14脚为低电平,
{
while(btnD == 0)//同上
{
;
}
fP = 0; //同上
fR = 0;
fN = 0;
fD = 1;
}
/* 上面目前表明经过P10脚的判断后,假如是接的按键-(P11,P12,P13,P14)为输入脚,判断后每个脚对应 修改内部变量*/
/* 下面就应该判断相对按键按下的处理过程*/
if(fP == 1)//如果fP 为1
{
gearP();// 则调用这个函数
}
if(fR == 1) // 如果fR 为1
{
gearR(); // 则调用这个函数
}
if(fN == 1) //如果fN 为1
{
gearN();// 则调用这个函数
}
if(fD == 1) //如果fD 为1
{
gearD(); //则调用这个函数
}
}
else //否则 将执行初始化
{
initial();
}
}
}
void gearP() //子函数gearP
{
SHOW = segP;// 将初始值赋给P0并口输出
lwP = 1; // 对P20口置高
lwN = 1; // 对P24口置高
rwP = 1; // 对P21口置高
rwN = 1; // 对P25口置高
}
void gearR() //同上
{
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);//延时子函数
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);
}
void gearN()
{
SHOW = segN;
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
}
void gearD()
{
SHOW = segD;
lwP = 1;
lwN = 0;
rwP = 1;
rwN = 0;
}
void initial()
{
fStart = 0;
fP = 0;
fR = 0;
fN = 0;
fD = 0;
P0 = 0xff;
P1 = 0xff;
P2 = 0xff;
P3 = 0xff;
}
void delay(int time)
{
int i,j;
for(i=0;i<time;i++)
{
for(j=0;j<120;j++)
{
;
}
}
}
/*下面这段没在main函数里,也没在子函数里,格式有问题 ,这里是想初始化定义吗?还是复制代码的时候没完全,
如果是在某个子函数中 {} */
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);这段 为什么后面延时一定要加 //delay(20)20表示延时的周期当然没个都要赋形参
//如果你是指,变量赋值后为什么要加delay(20) 那是因为须等待其他模块的程序调用这几个变量的值
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);不是有delay(20);了吗 本帖最后由 五号智能 于 2014-1-9 03:00 编辑
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20); 这段 两个合在一起你就明白了,如果没有这个你就少了一个
SHOW = segR;
lwP = 0;
lwN = 1;
rwP = 0;
rwN = 1;
delay(20);
lwP = 0;
lwN = 0;
rwP = 0;
rwN = 0;
delay(20);这段 为什么后面延时一定要加
五号智能 发表于 2014-1-9 02:59 static/image/common/back.gif
????不是还是和我的一样吗 本帖最后由 chen654601304 于 2014-1-11 22:21 编辑
程序太乱了,而且最好吧要实现的功能写下,这样大家才能更好的去判断。
有时候程序在延时一段时间之后希望他清除原有的状态;
还是吧目的和变量的意义些下吧,光看一个没有注释的程序能说出来也不是件容易的事情
楼主发代码最好用代码编辑器;
把代码加上注释大家才好给你判断; make 你要实现什么功能啊!
页:
[1]