请问有懂单片机的吗?请问为什么数码管数字一到8就显示不了
#include <reg51.h>#include <intrins.h> //μ¼èëÑóê±1us3ìDò
#defineDisdata P0 //¶¨òåP0¶Ë¿ú
#definediscanP2 //¶¨òåP2¶Ë¿ú
#defineuchar unsigned char
#defineuintunsigned int
sbit DQ=P3^7; //½óèëDS18B20×üÏß
sbit DIN=P0^7; //¿ØÖÆD¡êyμãááÃe
uint h;
uint temp;
uchar code ditab={0x00,0x01,0x01,0x02,0x02,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x07,0x08,0x09,0x09};
uchar code dis_7={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//êyÂë1üÏÔê¾ "0""1""2""3""4""5""6""7""8""9" "2»áá" "-"
uchar code scan_con={0x01,0x02,0x04,0x08}; //ËÄλêyÂë1üμÄλѡ±àÂë
uchar data temp_data={0x00,0x00}; //′æ′¢ζèμÄêy×é
uchar data display={0x00,0x00,0x00,0x00,0x00}; //′æ′¢êyÂë1üÏÔê¾êy×ÖμÄêy×é
void Delayus(uint us)
{
do
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
while(--us);
}
void scan(void)
{
char k;
for(k=0;k<4;k++) //òà′ÎμãááËĸöêyÂë1ü
{
Disdata = 0xff; //Ïû3yéÏò»¸öêyÂë1üÏÔê¾êy×ÖμÄó°Ïì
discan=scan_con;
Disdata=dis_7];
if (k==2) //ÏÔê¾D¡êyμã
{
DIN=0;
}
Delayus(2800);
}
}
void init(void) //3õê¼»ˉ3ìDò
{
char presence=1;
while(presence)
{
while(presence)
{
DQ=1;
Delayus(1);Delayus(1);//×üÏßà-¸ßÖ®oóÔúà-μí
DQ=0;
Delayus(500); //550 usÑó3ù
DQ=1;
Delayus(60); //66 usÑó3ù
presence=DQ; //presence=0 èô3õê¼»ˉ3é1|£¬Ôò½øDDÏÂò»2½
}
Delayus(450); //500 usÑó3ù
presence=~DQ;
}
DQ=1; //3õê¼»ˉ3é1|
}
void write_byte(uchar dat) //DS18B20D′èë×Ö½ú3ìDò
{
uchar i;
for(i=8;i>0;i--)
{
DQ=1;
Delayus(1);Delayus(1); //×üÏßà-¸ß2us
DQ=0;
Delayus(1);Delayus(1);Delayus(1);Delayus(1);//×üÏßà-μí5 us
DQ=dat&0x01; //ÿ′ÎÖ»¶á×îoóò»Î»
Delayus(60); //Ñóê±66usoóêy¾YóòòÆò»Î»
dat=dat>>1;
}
DQ=1;
Delayus(10);
}
uchar read_byte(void) //DS18B20¶á3ö×Ö½ú3ìDò
{
uchar i;
uchar dat=0;
for(i=8;i>0;i--)
{
DQ=1;
Delayus(1);Delayus(1);
dat>>=1;
DQ=0;
Delayus(1);Delayus(1);Delayus(1);Delayus(1);
DQ=1;
Delayus(1);Delayus(1);Delayus(1);Delayus(1);
if(DQ)
{
dat|=0x80;
}
Delayus(60);
}
DQ=1;
return(dat);
}
read_temp()
{
init();
Delayus(2000);
write_byte(0xcc); //ìø1yrom2ù×÷
write_byte(0x44); //ζè×a»»
init();
Delayus(10);
write_byte(0xcc);
write_byte(0xbe); //¶áè¡Î¶è
temp_data=read_byte(); //¶áè¡Î¶èμí×Ö½ú
temp_data=read_byte(); //¶áè¡Î¶è¸ß×Ö½ú
temp=temp_data;
temp<<=8;
temp=temp|temp_data; //¸ßμí×Ö½ú×éoÏ3éζè
return temp;
}
void work_temp(uint tem)
{
uchar n=0;
if(tem>6348) // ÅD¶ÏζèÕy¸o
{
tem=65536-tem;n=1;
} //¸oζèè¡21Âë
display=tem&0x0f; //′æ·ÅD¡êyÖμ
display=ditab]; // ÏÔê¾D¡êyÖμ
display=tem>>4; // ′æ·ÅÕûêyÖμ
display=display/100; // ÏÔê¾°ùλêy
display=display%100; // ′æ·Åê®Î»êyoí¸öλêy
display=display/10; // ÏÔê¾ê®Î»êy
display=display%10; // ÏÔ꾸öλêy
if(!display)
{
display=10; //°ùλêyÎa0Ôò2»ÏÔê¾
if(!display)
{
display=10; //°ùλêyÎa0μÄí¬ê±ê®Î»êyò2Îa0Ôò¶¼2»ÏÔê¾
}
}
if(n)
{
display=11;
} //¸oζèÔú°ùλÏÔê¾"-"
}
void main(void)
{
Disdata=0x00; //3õê¼»ˉP0P2¿ú
discan=0x00;
for(h=0;h<4;h++) //¿a»úÏÔê¾"----"
{
display=11;
}
init(); //3õê¼»ˉDS18B20
write_byte(0xcc);
write_byte(0x44);
for(h=0;h<100;h++)
{
scan();
}
while(1)
{
work_temp(read_temp());
scan();
}
} 如题 (不知为何程序注释是乱码的 ) 数码管别的数字都能正常显示,唯独8不能显示,而且当个位数为8的时候,连小数点也不显示了,请问有大神知道问题出在哪里吗?我尝试将P0初始化为 0x80,想让数码管一开始就显示四个8,但是他也不能正常显示 单片机型号是1T的 stc12c5a60s2 晶振用的是 11.0592Mhz 你将P0初始化为 0x80都没有显示,你确定数码管硬件没有问题嘛? 帖子都一年多了不知道你还玩不玩单片机。
页:
[1]