cyrus白 发表于 2020-4-22 13:28:18

请问有懂单片机的吗?请问为什么数码管数字一到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();                     
}
}

cyrus白 发表于 2020-4-22 13:30:52

如题 (不知为何程序注释是乱码的 )   数码管别的数字都能正常显示,唯独8不能显示,而且当个位数为8的时候,连小数点也不显示了,请问有大神知道问题出在哪里吗?我尝试将P0初始化为 0x80,想让数码管一开始就显示四个8,但是他也不能正常显示

cyrus白 发表于 2020-4-22 13:31:59

单片机型号是1T的 stc12c5a60s2    晶振用的是 11.0592Mhz

Richard149 发表于 2020-4-27 22:14:52

你将P0初始化为 0x80都没有显示,你确定数码管硬件没有问题嘛?

sxdqx 发表于 2021-7-2 10:26:27

帖子都一年多了不知道你还玩不玩单片机。
页: [1]
查看完整版本: 请问有懂单片机的吗?请问为什么数码管数字一到8就显示不了