找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1570|回复: 5
打印 上一主题 下一主题
收起左侧

求大佬给看看怎么修改,程序仿真的话,主程序总是只运行到while(1)

[复制链接]
跳转到指定楼层
楼主
200黑币
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define Enable();EA=1;
#define Disable();EA=0;
#define ZhengZhuan();PIN_Motor_A=0;PIN_Motor_B=1;
#define Stop();PIN_Motor_A=1;PIN_Motor_B=1;
#define FanZhuan();PIN_Motor_A=1;PIN_Motor_B=0;
sbit E=P2^7;                //1602使能引脚
sbit RW=P2^6;                //1602读写引脚        
sbit RS=P2^5;//1602数据/命令选择引脚
sbit RELAY=P3^0;
int n;
n=100;

char *p1;
uchar flag;
uchar code tab1[]="Zhuangtai *p1";  //要显示什么就在这儿改
uchar code tab2[]="n=100cm";  //[size=15.5555562973022px]要显示什么就在这儿改
void delay(uint del)   //延时1ms
{
     uint i,j;
   for(i=0;i<del;i++)
   for(j=0;j<=168;j++);
}
void writecmd(uchar com)  //写指令
{
   E=0;
   RS=0;
   RW=0;
   P0=com;
   delay(2);
   E=1;  
   delay(2);
   E=0;
}
void writedata(uchar dat)//写数据
{  
  E=0;
  RS=1;
  RW=0;
  P0=dat;
  delay(2);
  E=1;  
  delay(2);
  E=0;
}
void init(void)               //初始化
{
delay(15);
writecmd(0x38);
delay(5);
writecmd(0x38);
delay(5);
writecmd(0x38);
writecmd(0x38);
writecmd(0x08);
writecmd(0x01);
writecmd(0x06);
writecmd(0x0c);
}
void Display()
{  
  
  uchar j;
  init();
  writecmd(0x80);    //告诉液晶在哪个地方显示 (设置地址指针)//80H+00
  for(j=0;j<16;j++)  //有16个字符,要循环16次
  {
   writedata(tab1[j]);
        delay(2);
  }
  writecmd(0x80+0x40); //再设置第二行的起始位置80H+40H
  for(j=0;j<16;j++)   //有16个字符,要循环16次
  { writedata(tab2[j]);
         delay(2);
  }
         while(1);  
}   
sbit s1 = P1^0;
sbit s2 = P1^1;
sbit s3 = P1^2;//按键定义,s1启动,s2加1,s3减1
sbit a = P2^0;sbit b = P2^1;sbit c = P2^2;sbit d = P2^3;//脉冲信号输入端定义
#define Coil_a {a=1;b=0;c=0;d=0;}//A相通电,其他相断电
#define Coil_b {a=0;b=1;c=0;d=0;}//B相通电,其他相断电
#define Coil_c {a=0;b=0;c=1;d=0;}//C相通电,其他相断电
#define Coil_d {a=0;b=0;c=0;d=1;}//D相通电,其他相断电
//================================定时器0/1初始化函数================================
void T0_T1_init()
{
TMOD = 0x11;//定时器0/1均工作于方式1,16位计时方式
TR1 = 0;
ET1= 1;//开定时器中断
EA = 1;//开总中断
}
//================================ms级延时函数=======================================
void delay1m(uint x)
{
    uint i,j;
    for(i=0;i<x;i++)      //连数x次,约 x ms
      for(j=0;j<120;j++);   //数120 次,约1 ms
}
//=================按键函数=================================
void keyscan()
{
     if(s1==0)
  {
      delay(5);
   if(s1==0)
   {
       while(!s1);
    flag=!flag;
   
   }
   else
   {
       while(!s1);
    flag=0;
   }
  }
     if(flag==0)
  {
         if(s2==0)
   {
     delay(5);
     if(s2==0)
     {
           while(!s2);
     n++;
     if(n>199)n=199;
               
     }
   }
    if(s3==0)
   {
     delay(5);
     if(s3==0)
     {
           while(!s3);
     n--;
     if(n<=0)
     n=0;
            
     }
   }
  }
}
//================================主函数=============================================
void main()
{
   
uchar j;
Display();
while(1)
{
   
  if(s1==0)
  {
   delay1m(3);
   if(flag==1&&n>0)
   {
    for(j=0;j<n;j++)
    {
      
       a=1;
      
                  
    }
       a=0;
       delay(3);
                   RELAY=0;
                delay(500);
                RELAY=1;
   }
   
  }
}

  
}


最佳答案

查看完整内容

楼主的显示程序里多了个死循环while(1),程序怎么运行下去?main程序的主循环没有调用按键程序和显示程序,你怎么操作和显示?
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:213173 发表于 2019-6-21 18:07 | 只看该作者
楼主的显示程序里多了个死循环while(1),程序怎么运行下去?main程序的主循环没有调用按键程序和显示程序,你怎么操作和显示?
回复

使用道具 举报

板凳
ID:568698 发表于 2019-6-22 08:21 来自手机 | 只看该作者
去搜索看一下while的用法,要知道程序是不可能无线次数运行下去的
回复

使用道具 举报

地板
ID:207421 发表于 2019-6-22 11:35 | 只看该作者
先把 void Display() 函数里面的 while(1); 删除,然后修改  main() 里面的代码:
void main()
{
        uchar j;
        //Display();  
        while(1)
        {
                if(s1==0)
                {
                        delay1m(3);
                        if(flag==1&&n>0)
                        {
                                for(j=0;j<n;j++)
                                {
                                        a=1;
                                }
                                a=0;
                                delay(3);
                                RELAY=0;
                                delay(500);
                                RELAY=1;
                        }
                }
                Display();  //显示函数放在这里
        }
}
回复

使用道具 举报

5#
ID:567356 发表于 2019-6-23 14:22 | 只看该作者
wulin 发表于 2019-6-21 18:07
楼主的显示程序里多了个死循环while(1),程序怎么运行下去?main程序的主循环没有调用按键程序和显示程序 ...

大佬,关于步进电机运转和LCD1602能够根据按键改变某些显示,需要用到哪些指令啊??
回复

使用道具 举报

6#
ID:213173 发表于 2019-6-24 11:12 | 只看该作者
仿真小白 发表于 2019-6-23 14:22
大佬,关于步进电机运转和LCD1602能够根据按键改变某些显示,需要用到哪些指令啊??



示例程序+仿真.zip (60.12 KB, 下载次数: 5)

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表