找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1626|回复: 6
收起左侧

单片机超声波检测距离并在两片74HC595芯片驱动四位一体数码管上显示的问题

[复制链接]
ID:995771 发表于 2021-12-22 17:13 | 显示全部楼层 |阅读模式
各位大佬,目前我有两个程序,一个是超声波模块程序(没问题),另一个是595驱动四位一体数码管的程序,数码管程序的结果是显示4321,可以显示也没问题。
但是我把它们两个放到一起,想实现标题内容,发现数码管最高位亮,后面三位一闪一闪的很暗,并且不能实现功能。

以为是数码管的程序不能实现变量(距离的变化),只能实现常量(4321),就单独把数码管的程序修改了一下,可以实现数字在数码管上来回变化,在附件的《中断实现数码管变量变化》。

之后我以为可以了,就把一样的格式放到总程序里面,发现还是最高位亮,后面三位很暗,一闪一闪的。如附件《出现问题的程序》

怎么才能让它4位都正常发光而且能实现距离变化时数码管上的数字也变化?

求教,谢谢各位!

中断实现数码管变量变化.zip

13.39 KB, 下载次数: 6

回复

使用道具 举报

ID:995771 发表于 2021-12-22 18:59 | 显示全部楼层
出问题的程序 代码如下:
#include <AT89X51.H>
#define uint unsigned int
#define uchar unsigned char
sbit Tx=P2^1;                                                
sbit Rx=P2^0;                                                
bit TimeUp=0;                                                
int Th0,Tl0;
unsigned int time0=0;





void main (void);                                       
void LED4_Display (void);                        
void LED_OUT(uchar X);                                
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char disbuf[4]={0,0,0,0};
unsigned char code LED_0F[];               
sbit DIO=P1^0;                                
sbit RCLK=P1^1;                                
sbit SCLK=P1^2;                                

uchar LED[8];        
uint Measureresult=0;

void delay(unsigned int xms)
{
                unsigned char j;
                while(xms--)
                {
                                for(j=0;j<125;j++);
                }
}

void LED4_Display (void)
{
        unsigned char code *led_table;         
        uchar i;
        
        led_table = LED_0F + LED[0];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x01);               

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[1];
        i = *led_table;

        LED_OUT(i);               
        LED_OUT(0x02);               

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[2];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x04);      

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[3];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x08);               

        RCLK = 0;
        RCLK = 1;
      

        i=0xff;
        LED_OUT(i);               
        LED_OUT(0x01);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x02);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x04);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x08);
        RCLK=0;
        RCLK=1;
}


void LED_OUT(uchar X)
{
        uchar i;
        for(i=8;i>=1;i--)
        {
                if (X&0x80) DIO=1; else DIO=0;
                X<<=1;
                SCLK = 0;
                SCLK = 1;
        }
}

unsigned char code LED_0F[] =
{

        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};




uint Measure(void)
{
                char Del20us=0;
                char RxBack=1;
               


                Tx=0;
                Th0=0;
                Tl0=0;
                TimeUp=0;
      

                TR0=0;
                TH0=0;
                TL0=0;
      
      

        
                Tx=1;
                for(Del20us=20;Del20us>0;Del20us--);
                Tx=0;


        
                while(Rx==0);
                TH0=0;
                TL0=0;
                TR0=1;



               
                while(RxBack)
                {
                                if(Rx==0||TimeUp==1)
                                {
                                                TR0=0;
                                                Th0=TH0;Tl0=TL0;
                                                TR0=1;
                                                RxBack=0;
                                }
                }
                while(!TimeUp);
                time0=(Th0*256+Tl0);
                Measureresult=((unsigned int)(344)*time0)/2000;
                if(Measureresult<30||Measureresult>900)
                {
                                Measureresult=0;
                }
               
                return Measureresult;
}


void T0_time() interrupt 1
{
                TimeUp=1;
}



void main()
{
                uchar ge,shi,bai,qian;
                        TMOD=0x11;
                        TH1=(65536-200)/256;
                        TL1=(65536-200)%256;

                        EA=1;
                        ET0=1;
                        ET1=1;
      
                        TR1=1;
      
                while(1)
                {
                                                ge=Measure()%1000%100%10;
                                                shi=Measure()%1000%100/10;
                                                bai=Measure()%1000/100;
                                                qian=Measure()/1000;
                                                LED[0]=ge;
                                                LED[1]=shi;
                                                LED[2]=bai;
                                                LED[3]=qian;
                              
                }
}

void T1_time() interrupt 3
{
                                TH1=(65536-200)/256;
                                TL1=(65536-200)%256;
      
                                LED4_Display ();
                                delay(15);
}
回复

使用道具 举报

ID:301191 发表于 2021-12-23 00:46 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:960157 发表于 2021-12-23 07:32 | 显示全部楼层

出问题的程序 代码如下:
#include <AT89X51.H>
#define uint unsigned int
#define uchar unsigned char
sbit Tx=P2^1;                                                
sbit Rx=P2^0;                                                
bit TimeUp=0;                                                
int Th0,Tl0;
unsigned int time0=0;





void main (void);                                       
void LED4_Display (void);                        
void LED_OUT(uchar X);                                
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
unsigned char disbuf[4]={0,0,0,0};
unsigned char code LED_0F[];               
sbit DIO=P1^0;                                
sbit RCLK=P1^1;                                
sbit SCLK=P1^2;                                

uchar LED[8];        
uint Measureresult=0;

void delay(unsigned int xms)
{
                unsigned char j;
                while(xms--)
                {
                                for(j=0;j<125;j++);
                }
}

void LED4_Display (void)
{
        unsigned char code *led_table;         
        uchar i;
        
        led_table = LED_0F + LED[0];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x01);               

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[1];
        i = *led_table;

        LED_OUT(i);               
        LED_OUT(0x02);               

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[2];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x04);      

        RCLK = 0;
        RCLK = 1;
        
        led_table = LED_0F + LED[3];
        i = *led_table;

        LED_OUT(i);                       
        LED_OUT(0x08);               

        RCLK = 0;
        RCLK = 1;
      

        i=0xff;
        LED_OUT(i);               
        LED_OUT(0x01);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x02);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x04);
        RCLK=0;
        RCLK=1;
                LED_OUT(i);               
        LED_OUT(0x08);
        RCLK=0;
        RCLK=1;
}


void LED_OUT(uchar X)
{
        uchar i;
        for(i=8;i>=1;i--)
        {
                if (X&0x80) DIO=1; else DIO=0;
                X<<=1;
                SCLK = 0;
                SCLK = 1;
        }
}

unsigned char code LED_0F[] =
{

        0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};




uint Measure(void)
{
                char Del20us=0;
                char RxBack=1;
               


                Tx=0;
                Th0=0;
                Tl0=0;
                TimeUp=0;
      

                TR0=0;
                TH0=0;
                TL0=0;
      
      

        
                Tx=1;
                for(Del20us=20;Del20us>0;Del20us--);
                Tx=0;


        
                while(Rx==0);
                TH0=0;
                TL0=0;
                TR0=1;



               
                while(RxBack)
                {
                                if(Rx==0||TimeUp==1)
                                {
                                                TR0=0;
                                                Th0=TH0;Tl0=TL0;
                                                TR0=1;
                                                RxBack=0;
                                }
                }
                while(!TimeUp);
                time0=(Th0*256+Tl0);
                Measureresult=((unsigned int)(344)*time0)/2000;
                if(Measureresult<30||Measureresult>900)
                {
                                Measureresult=0;
                }
               
                return Measureresult;
}


void T0_time() interrupt 1
{
                TimeUp=1;
}



void main()
{
                uchar ge,shi,bai,qian;
                        TMOD=0x11;
                        TH1=(65536-200)/256;
                        TL1=(65536-200)%256;

                        EA=1;
                        ET0=1;
                        ET1=1;
      
                        TR1=1;
      
                while(1)
                {
                                                ge=Measure()%1000%100%10;
                                                shi=Measure()%1000%100/10;
                                                bai=Measure()%1000/100;
                                                qian=Measure()/1000;
                                                LED[0]=ge;
                                                LED[1]=shi;
                                                LED[2]=bai;
                                                LED[3]=qian;
                              LED4_Display ();
                                delay(15);
                }
}

void T1_time() interrupt 3
{
                                TH1=(65536-200)/256;
                                TL1=(65536-200)%256;
      
                                
}
回复

使用道具 举报

ID:332444 发表于 2021-12-23 08:03 | 显示全部楼层
瞄了一下,首先在中断使用延时就是头上安头.
回复

使用道具 举报

ID:624769 发表于 2021-12-23 19:49 | 显示全部楼层
简单看了下, 觉得还是放弃治疗,直接重写吧,你一定要抢救一下的话,

     LED4_Display ();   这个函数,把它一拆4, 每次进定时器中断运行 1/4 .

代码就不帮你改了,无从下手……
回复

使用道具 举报

ID:995771 发表于 2021-12-24 16:28 | 显示全部楼层
188610329 发表于 2021-12-23 19:49
简单看了下, 觉得还是放弃治疗,直接重写吧,你一定要抢救一下的话,

     LED4_Display ();   这个函 ...

谢谢,已重写
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表