程序编译通过但是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); //恢复延时
}
}
#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);
}
}