为什么原先程序是跑起来的,加上显示模块不运行了呢?

2019-07-15 23:09发布

#include<reg51.h>
#include<intrins.h>                        
#define uchar unsigned char       
#define uint unsigned int
uint a,b;
uint c=0;
uint d=0;
uint zh;
uchar num;
uchar code table1[]="Speed(n/min):";
sbit PWM=P0^0;
sbit key1=P3^0;
sbit key2=P3^1;
sbit key3=P3^2;
sbit key4=P3^3;
sbit RS=P0^1;            //RW直接接地
sbit EN=P0^2;                                           //LCD1602控制
                void de(uchar z)                                  //延时
                {
                 uchar x,y;
                 for(x=z;x>0;x--)
                 for(y=110;y>0;y--);
               
                }

         void cutiao()                                        //粗调
          {               
          
                    if(a==c)
                  {       
                  PWM=0;
                        }
                if(b==10)
                 PWM=1;
           }


        void PWM_init()                        //PWM初始
        {
          TMOD=0x01;
                   EA=1;
                   ET0=1;
                   TR0=1;
        }
/**************************lcd1602显示******************************/  
  void write_com(uchar com)                             //写指令到1602
{
   RS=0;
   EN=0;
   P2=com;
   de(1);
   EN=1;
   de(1);
   EN=0;
}
void write_date(uchar date)                          //写数据到1602
{
   RS=1;
   EN=0;
   P2=date;
   de(1);
   EN=1;
   de(1);
   EN=0;
}

void LCD_init()                                      //初始化
{  
       
    EN=0;
    write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
        write_com(0x80);
}
/**********************LCD显示****************/
                void display()
         
                   {
                         write_com(0x80);
                         for(num=0;num<13;num++)
                         {
                                 write_date(table1[num]);
                                                 de(1);
                         }
                          write_com(0x80+0x40);
                          write_date(zh+0x30);
                          de(1);
                          }
                                                                                                                                                 
/****************************主函数**************************************/
        void main()
        {  
                 


                PWM_init();
                LCD_init();
                 
                while(1)
                {
                  
                  display();     !!!!!!!!!就是这里,加了显示就不运行了。但是去掉,程序就是运行的。为什么???求大神
                   if(b>10)                   //PWM范围
                   {a=0;b=0;}
               
/***************键盘控制*****************************/
                   if(key1==0)                                //键盘控制,加
                  {de(50);//消抖
                        if(key1==0)
                        {        c++;
                                 if(c==9)c=9;
                         }
                         while(!key1);
                         }
               
               
                        if(key2==0)                                //减
                         { de(50);
                          if(key2==0)
                          {
                                   c--;
                          }
                                while(!key2);
                           }                                

                       
                         if(key3==0)                   //停止
                           {
                                                 d++;
                                                   while(1)
                                                   {
                                                            PWM=0;
                                                                if(key4==0)                  
                                                                                    {
                                                                                                   d++;
                                                                                                   if(d>=2)
                                                                                           break;
                                                                                 }         
                                                        }
                                                }
                          

/*******************频道选择**********************/       
                        switch(c)
                        {
                          case 0:cutiao();zh=0;
                          case 1:cutiao();zh=1;
                          case 2:cutiao();zh=2;
                          case 3:cutiao();zh=3;
                          case 4:cutiao();zh=4;
                          case 5:cutiao();zh=5;
                          case 6:cutiao();zh=6;
                          case 7:cutiao();zh=7;
                          case 8:cutiao();zh=8;
                          case 9:cutiao();zh=9;
                        }
                          cutiao();  //粗调
                       
                       
                       
                               
                                                                                                           
                }
        }



void DS0() interrupt 1        //中断服务程序
        {
                          TH0=(65536-50)/256;
                   TL0=(65536-50)%256;
                        a++;
                        b++;
        }









QQ截图20130809134234.jpg
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
兵荒马乱的小青
1楼-- · 2019-07-16 01:19
自己先顶下。求大神帮忙!
嵌入式linux工程
2楼-- · 2019-07-16 01:46
你这个问题出在了这个显示函数部分,但是先跟你说一下,程序中尽量不要使用空循环来延时,使用定时器延时,因为空循环延时的时候cpu浪费了,没干事情,只有等待。现在看看你的程序,你的显示函数里面包含了延时,然后函数里面又有函数调用了延时函数,这样这个函数占用了大量的时间,等运行完这个函数才开始检测b的值(if(b>10){a=0;b=0;}),问题就出在这里,应该把这个放到定时器中断里面,因为等执行这条语句时,display占用了的时间让b和a加了很多很多次,导致很大的时候才清零,也就是说你的pwm周期很大很大,高电平时间一定,那么占空比变得非常非常小了,因此就出现了你看到的情况了

评分

参与人数 1威望 +1 +1 收起 理由 兵荒马乱的小青 + 1 + 1

查看全部评分

嵌入式linux工程
3楼-- · 2019-07-16 04:43
兵荒马乱的小青 发表于 2013-8-9 15:08
自己先顶下。求大神帮忙!

当把display这个函数去掉时由于程序运行很顺畅没有延时所以程序能正常
兵荒马乱的小青
4楼-- · 2019-07-16 08:25
嵌入式linux工程 发表于 2013-8-9 16:18
你这个问题出在了这个显示函数部分,但是先跟你说一下,程序中尽量不要使用空循环来延时,使用定时器延时, ...

哎妈呀。大神啊。  听你这么一说,思路一下子清楚不少。非常感谢。 我去试试看吧。
liwenbiao
5楼-- · 2019-07-16 11:31
 精彩回答 2  元偷偷看……
嵌入式linux工程
6楼-- · 2019-07-16 17:18
兵荒马乱的小青 发表于 2013-8-9 16:27
哎妈呀。大神啊。  听你这么一说,思路一下子清楚不少。非常感谢。 我去试试看吧。
...

现在程序正常了没啊?                          

一周热门 更多>