找回密码
 立即注册

QQ登录

只需一步,快速开始

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

超声波测距,四位数码管显示,stc15f104w单片机为什么程序只能跑一次?

[复制链接]
ID:481965 发表于 2019-3-27 23:22 | 显示全部楼层 |阅读模式
四位数码管使用的是两个74hc595
#include<reg52.h>
#include<intrins.h>


sbit  Echo=  P3^3;
sbit  Trig=  P3^2;
unsigned int  time=0;

typedef unsigned char uchar;
typedef unsigned int uint;

/**********函数声明********************/
void SendTo595(uchar byteData);
void xianshi(uint shu);
/***********************************/

sbit DS = P3^1;    //p3.4串行数据输入   DS
sbit SH_CP = P3^0;    //串行输入时钟,上升沿有效
sbit ST_CP = P3^5;    //串行寄存器时钟,上升沿有效
char code DISP[] = {0xf5, 0x05, 0xb3, 0x97, 0x47, 0xd6, 0xf6, 0x85, 0xf7,0xd7};
char code QQ[]={0x70,0xb0,0xd0,0xe0};
uchar j;//显示时间
uint  S=0;
//uint q;

void delay(uint z)//延时1ms
{
uint x,y;
for(x=z;x>0;x--)
{
for(y=0;y<114;y++)
{
}
}
}



void timer0 (void) interrupt 1
{

for(S=9900;S<9999;S++){xianshi(S);}

}  



void Time_Init()
{
         TMOD=0x01;        //设T0为方式1,GATE=1;
         TH0=0;
         TL0=0;
     ET0=0;
         EA=1;
         TR0 = 0;        
}        


void main()
{
Time_Init();
//for(S=0;S<9999;S++){xianshi(S);}
        Trig=1;                        //启动一次模块
        _nop_();
        _nop_();
   _nop_();
        _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
          _nop_();
         _nop_();
         _nop_();
         _nop_();
         _nop_();
         Trig=0;
Echo=1;
         while(!Echo);
        TR0=1;                        
         while(Echo);               
         TR0=0;
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;        
         S=(time*1.87)/100;//算出来是CM(time*1.87)/100;
xianshi(S);

}
        
        

//发送一个字节数据给595再并行输出

void SendTo595(uchar Data)
{
   char i;
/*for(i=0;i<8;i++)
   {
                    SH_CP = 0;
                 
        DS=0x80&Data1;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
                 
        Data1=_crol_(Data1,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

        SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
        _nop_();

   }  
*/

   for(i=0;i<8;i++)
   {
                    SH_CP = 0;
                 
        DS=0x80&Data;//&为按位运算符,即全1为1,有0为0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位为1则是1高位为0则这个式子为0
                 
        Data=_crol_(Data,1); //左移一位 将高位补给低位,如果二进制数为01010101 那么_crol_(1) 为10101010

        SH_CP = 1;          //上升沿让串行输入时钟变成高电平 并延时一个时钟周期
        _nop_();

   }  

  /*  ST_CP = 0;
         _nop_();
         位移寄存器完毕,转移到存储寄存器
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
   _nop_();
*/

}


void xianshi(uint shu)

{


uint qian;
uint bai;
uint shi;
uint ge;

qian=shu/1000;
bai=(shu-(qian*1000))/100;
shi=(shu-(qian*1000)-(bai*100))/10;
ge=shu-(qian*1000)-(bai*100)-(shi*10);


//SendTo595(QQ[3]);
//SendTo595(DISP[0]);
//SendTo595(DISP[1]);

//delay(4000);
//SendTo595(DISP[2]);
//SendTo595(DISP[0]);

                                                /*        for(j=0;j<4;j++)
                                                        {
                                                        for(k=0;k<10;k++)
                                                        {}}*/

for(j=0;j<20;j++)
{
SendTo595(QQ[0]);
SendTo595(DISP[ge]);
ST_CP = 0;
         _nop_();
         //位移寄存器完毕,转移到存储寄存器
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
  // _nop_();

delay(5);

SendTo595(QQ[1]);
SendTo595(DISP[shi]);
ST_CP = 0;
         _nop_();
         //位移寄存器完毕,转移到存储寄存器
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
  // _nop_();

delay(5);
SendTo595(QQ[2]);
SendTo595(DISP[bai]);
ST_CP = 0;
         _nop_();
         //位移寄存器完毕,转移到存储寄存器
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
  // _nop_();

delay(5);

SendTo595(QQ[3]);
SendTo595(DISP[qian]);
ST_CP = 0;
         _nop_();
         //位移寄存器完毕,转移到存储寄存器
   ST_CP = 1;         //上升沿,存储寄存器变为高电平 延迟两个时钟周期
   _nop_();
  // _nop_();

delay(5);

}


}
回复

使用道具 举报

ID:213173 发表于 2019-3-28 08:31 | 显示全部楼层
main()函数中没有while(1)主循环,怎么可能正常运行?照抄也得抄完整啊!
回复

使用道具 举报

ID:416287 发表于 2019-3-28 09:08 | 显示全部楼层
首先你的主函数里面没有while(1)循环  所以你的程序只能跑一次就结束
回复

使用道具 举报

ID:481965 发表于 2019-3-28 18:32 | 显示全部楼层
wulin 发表于 2019-3-28 08:31
main()函数中没有while(1)主循环,怎么可能正常运行?照抄也得抄完整啊!

之前写了while也一样,跑一遍就只能显示数码管左边一个0
回复

使用道具 举报

ID:481965 发表于 2019-3-28 18:33 | 显示全部楼层
奋斗的小白熊 发表于 2019-3-28 09:08
首先你的主函数里面没有while(1)循环  所以你的程序只能跑一次就结束

之前写了while也一样,跑一遍就只能显示数码管左边一个0
回复

使用道具 举报

ID:213173 发表于 2019-3-28 21:32 | 显示全部楼层
而投入与天一 发表于 2019-3-28 18:32
之前写了while也一样,跑一遍就只能显示数码管左边一个0

细看了一下程序,几乎从头至尾都错了。首先你对stc15f104w这个芯片根本不了解。程序构架、超声波测距模块和74hc595的驱动程序统统错
回复

使用道具 举报

ID:555922 发表于 2019-6-8 19:28 | 显示全部楼层
没有循环,怎么简单
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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