c语言中如何让while(1)下的一个程序在条件满足时(条件保持不变)只执行一次,不要反复的执行
这是一个计数器程序,当我按下开关s1的时候计数器为减计数,当按下s2开关的时候为加计数,我一直都是用plc做工业控制程序,这个程序用plc做的话再简单不过了,现在用单片机...
这是一个计数器程序,当我按下开关s1的时候计数器为减计数,当按下s2开关的时候为加计数,我一直都是用plc做工业控制程序,这个程序用plc做的话再简单不过了,现在用单片机做,我是初学,很多都觉得很难和plc的简单易懂不可相提并论,当我用单片机下载好程序时发现当我按下si或是s2开关计数的时候傻了,按下一次单片机已经计数几十次了,我知道这是单片机在我按下开关时条件就满足了不断的计数了,这要是在plc中只有加入一个上升沿或是下降沿脉冲标记就解决问题了,但单片机就没这么简单了,在网上搜了很多都没有接近的问题,这是我编写的程序,希望单片机的高手能帮我改一下,不胜感激。
//main.c
#include<reg52.h>
//定义端口寄存器
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;
/*共阴极数码管0~F的字形码
"0"3FH "8"7FH
"1"06H "9"6FH
"2"5BH "A"77H
"3"4FH "B"7CH
"4"66H "C"39H
"5"6DH "D"5EH
"6"7DH "E"79H
"7"07H "F"71H
*/
const unsigned char seg7[10]={0x3f, 0x06,0x5b, 0x4f,0x66,
0x6d, 0x7d, 0x07,0x7f,0x6f};
//定义端口
sbit car_in=P1^0;
sbit car_out=P1^1;
sbit en1=P2^6;
sbit en2=P2^7;
//定义延时函数
void ms_delay(unsigned int t)
{
unsigned int i; //外层循环t次
for(t;t>0;t--)
for(i=110;i>0;i--) //内存循环110次
;
}
//定义数码管函数
void display(int n)
{
char b2,b1; //定义有符号字符型数,char是signed char数据类型的简称
b2=n/10;
b1=n%10;
//十位
P0=seg7[b2];
en2=0;
ms_delay(10);
en2=1;
//个位
P0=seg7[b1];
en1=0;
ms_delay(10);
en1=1;
}
main()
{
int num=99; //num赋值99,也是就说num的初值为99
//配置端口模式
P0M1=0Xff; //
P0M0=0Xff;
P1M1=0X03; //
P1M0=0X00;
display(num) //显示总数 99
while(1) //while循环语句 1就是真(条件成立),0就是假(条件不成立)
//while(1) 永远都是真,如果内部没有跳出语句,那就是个死循环。
{
//car_in
if(car_in==0) // if条件判断语句 (car_in=0,就是p1^0端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
if(car_in==0) //延时后判断条件成立与否
{
num--; //条件成立,总数减1,也就是99-1
}
}
//car_out
if(car_out==0)// if条件判断语句 (car_out=0,就是p1^1端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
if(car_out==0) //延时后判断条件成立与否
{
num++; //条件成立,总数加1,也就是99+1
}
}
//
if(num>99) //判断总数 num是否大于99
{
num=99; //如果总数num大于99,总数num赋值99,就是最大值就是显示99
}
else if(num<0) //判断总数 num是否小于0
{
num=0; //如果总数小于0,总数num赋值0,就是最小值就是显示0
}
display(num);// 显示总数
}
} 展开
//main.c
#include<reg52.h>
//定义端口寄存器
sfr P0M0=0x93;
sfr P0M1=0x94;
sfr P1M0=0x91;
sfr P1M1=0x92;
sfr P2M0=0x95;
sfr P2M1=0x96;
sfr P3M0=0xb1;
sfr P3M1=0xb2;
/*共阴极数码管0~F的字形码
"0"3FH "8"7FH
"1"06H "9"6FH
"2"5BH "A"77H
"3"4FH "B"7CH
"4"66H "C"39H
"5"6DH "D"5EH
"6"7DH "E"79H
"7"07H "F"71H
*/
const unsigned char seg7[10]={0x3f, 0x06,0x5b, 0x4f,0x66,
0x6d, 0x7d, 0x07,0x7f,0x6f};
//定义端口
sbit car_in=P1^0;
sbit car_out=P1^1;
sbit en1=P2^6;
sbit en2=P2^7;
//定义延时函数
void ms_delay(unsigned int t)
{
unsigned int i; //外层循环t次
for(t;t>0;t--)
for(i=110;i>0;i--) //内存循环110次
;
}
//定义数码管函数
void display(int n)
{
char b2,b1; //定义有符号字符型数,char是signed char数据类型的简称
b2=n/10;
b1=n%10;
//十位
P0=seg7[b2];
en2=0;
ms_delay(10);
en2=1;
//个位
P0=seg7[b1];
en1=0;
ms_delay(10);
en1=1;
}
main()
{
int num=99; //num赋值99,也是就说num的初值为99
//配置端口模式
P0M1=0Xff; //
P0M0=0Xff;
P1M1=0X03; //
P1M0=0X00;
display(num) //显示总数 99
while(1) //while循环语句 1就是真(条件成立),0就是假(条件不成立)
//while(1) 永远都是真,如果内部没有跳出语句,那就是个死循环。
{
//car_in
if(car_in==0) // if条件判断语句 (car_in=0,就是p1^0端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
if(car_in==0) //延时后判断条件成立与否
{
num--; //条件成立,总数减1,也就是99-1
}
}
//car_out
if(car_out==0)// if条件判断语句 (car_out=0,就是p1^1端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
if(car_out==0) //延时后判断条件成立与否
{
num++; //条件成立,总数加1,也就是99+1
}
}
//
if(num>99) //判断总数 num是否大于99
{
num=99; //如果总数num大于99,总数num赋值99,就是最大值就是显示99
}
else if(num<0) //判断总数 num是否小于0
{
num=0; //如果总数小于0,总数num赋值0,就是最小值就是显示0
}
display(num);// 显示总数
}
} 展开
1个回答
展开全部
while(1) //while循环语句 1就是真(条件成立),0就是假(条件不成立)
//while(1) 永远都是真,如果内部没有跳出语句,那就是个死循环。
{
//car_in
if(car_in==0) // if条件判断语句 (car_in=0,就是p1^0端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
while(!car_in); //判断按键完全释放?
num--; //条件成立,总数减1,也就是99-1
}
//car_out
if(car_out==0)// if条件判断语句 (car_out=0,就是p1^1端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
while(!car_out); //判断按键完全释放?
num++; //条件成立,总数加1,也就是99+1
}
//
if(num>99) //判断总数 num是否大于99
{
num=99; //如果总数num大于99,总数num赋值99,就是最大值就是显示99
}
else if(num<0) //判断总数 num是否小于0
{
num=0; //如果总数小于0,总数num赋值0,就是最小值就是显示0
}
display(num);// 显示总数
}
//if(car_out==0)// if条件判断语句 (car_out=0,就是p1^1端口低电位时)
{
ms_delay(10); //延时消抖 后再次判断条件是否成立
if(car_out==0)//你这里的方法不妥当。单片机处理速度很快,这样肯定会一按下去判断很多 //次了,我这上面这里做了小修改,你试试
{
num++; //条件成立,总数加1,也就是99+1
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询