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);// 显示总数
}
}
展开
 我来答
Pzy583787301
推荐于2017-12-16 · 超过26用户采纳过TA的回答
知道答主
回答量:50
采纳率:0%
帮助的人:44.6万
展开全部
  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
}
}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式