微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 程序编译通过但是keil中调试的时候有的语句好像没有执行

程序编译通过但是keil中调试的时候有的语句好像没有执行

时间:10-02 整理:3721RD 点击:
我写了 一个程序,程序编译通过但是keil中调试的时候有的语句好像没有执行只能执行到chtemp(),烧录到单片机也工作。不知道什么原因?大家帮帮忙忙

#include <reg51.h>
#include <intrins.h>
typedef unsigned char BYTE;
sbit DQ = P2^2;                     //DS18B20的数据口
BYTE TPH;                           //温度转换的高位
BYTE TPL;                           //温度转换的低位
sbit ds=P2^2;
sbit fm=P2^3;
sbit htemp=P1^0;
sbit ltemp=P1^2;
sbit dula=P2^7;
sbit wela=P2^6;
int hbound=270;
int lbound=240;
sbit hadd=P2^1;
sbit lsub=P2^0;
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};     //不带小数点数字编码
unsigned char code table1[]={0x40,0x79,0x24,0x30,0x19,
0x12,0x02,0x78,0x00,0x10};        //带小数点数字编码
void init()
{
  IT0=0;
  EX0=1;
  EA=1;
}
void delay(unsigned int z)
{
unsigned int x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
/*数码管的显示 */
void display(unsigned int temp)
{
    unsigned char shu1,shu2,xiao;
    shu1=temp/100;
    shu2=temp%100/10;
    xiao=temp%10;
        dula=1;
  P0=table[shu1];
  dula=0;
  P0=0xff;//消隐
  wela=1;
  P0=0x01;//位选通百位
  wela=0;
  delay(20);
  dula=1;
  P0=table1[shu2];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x02;
  wela=0;
  delay(20);
  dula=1;
  P0=table[xiao];
  dula=0;
  P0=0xff;
  wela=1;
  P0=0x04;
  wela=0;
  delay(20);
  dula=1;
  P0=0xc6;
  dula=0;
  wela=1;
  P0=0x08;
  wela=0;
  delay(20);
  dula=1;
  P0=0xff;
  dula=0;
  
}
void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
void chtemp()
{
        DS18B20_Reset();                //设备复位
     DS18B20_WriteByte(0xCC);        //跳过ROM命令
     DS18B20_WriteByte(0x44);        //开始转换命令
     while (!DQ);                    //等待转换完成
}
unsigned int readscr()
{     unsigned int a,b,temp;
        float wendu;
        DS18B20_Reset();                //设备复位
     DS18B20_WriteByte(0xCC);        //跳过ROM命令
     DS18B20_WriteByte(0xBE);        //读暂存存储器命令
     TPL = DS18B20_ReadByte();       //读温度低字节
     TPH = DS18B20_ReadByte();       //读温度高字节
  a=TPL;
  b=TPH;
  temp=b;
  temp<<=8;
  temp=temp|a;
  wendu=temp*0.0625;     
        temp=wendu*10+0.5;
  display(temp);
  return(temp);
}
void control(unsigned int wen)
{ unsigned int i;
if(wen>hbound||wen<lbound)
  {  
    if(wen>hbound)
    {   htemp=0;
     fm=0;
     display(readscr());
     fm=1;
     display(readscr());
    }
    else
    {   ltemp=0;
     fm=0;
     for(i=2;i>0;i++)
         display(readscr());
      fm=1;
      for(i=2;i>0;i++)
         display(readscr());
       }
  }
   else
     display(readscr());
}
void main()
{   unsigned int wen,i;
   static unsigned int flag=1;
        while(1)
   {
      init();
      chtemp();
      if(flag)
      {
        for(i=57;i>0;i--)
       display(0);
       flag=0;
      }
      else
      {
       wen=readscr();
       control(wen);
      }
   }
}
/**************************************
延时X微秒
**************************************/
void DelayXus(BYTE n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}
/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    unsigned int CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}
/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
    BYTE i;
    BYTE dat = 0;
    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }
    return dat;
}
/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{  unsigned int CY = 1;
    char i;
    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
  CY=dat&0x01;
        dat >>= 1;                  //送出数据
        DQ = CY;
        DelayXus(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        DelayXus(1);                //恢复延时
    }
}

仿真的时候 由于没有连接DS18B20 所以程序会停留在 while (!DQ); //等待转换完成
烧录到单片机后,程序会全速运行

你keil仿真的时候他只是51内部的软件仿真,就相当于一个没有接什么外围设备的单片机在运行。没有外围器件的仿真,只能手动设计对应管脚的拉高拉低。如果想硬件仿真就得和Proteus一起仿真才行,或者用仿真器。

程序执行到  init();
       chtemp();
会调用下面这个函数,调试时可能已经错过了检查存在脉冲的时机,所以不会继续执行。
void DS18B20_Reset()
{
     unsigned int CY = 1;
     while (CY)
     {
         DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
         DelayXus(240);
         DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
         CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
     }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top