找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 2075|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

超聲波測(cè)距,四位數(shù)碼管顯示,stc15f104w單片機(jī)為什么程序只能跑一次?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:481965 發(fā)表于 2019-3-27 23:22 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
四位數(shù)碼管使用的是兩個(gè)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;

/**********函數(shù)聲明********************/
void SendTo595(uchar byteData);
void xianshi(uint shu);
/***********************************/

sbit DS = P3^1;    //p3.4串行數(shù)據(jù)輸入   DS
sbit SH_CP = P3^0;    //串行輸入時(shí)鐘,上升沿有效
sbit ST_CP = P3^5;    //串行寄存器時(shí)鐘,上升沿有效
char code DISP[] = {0xf5, 0x05, 0xb3, 0x97, 0x47, 0xd6, 0xf6, 0x85, 0xf7,0xd7};
char code QQ[]={0x70,0xb0,0xd0,0xe0};
uchar j;//顯示時(shí)間
uint  S=0;
//uint q;

void delay(uint z)//延時(shí)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;        //設(shè)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;                        //啟動(dòng)一次模塊
        _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;//算出來(lái)是CM(time*1.87)/100;
xianshi(S);

}
        
        

//發(fā)送一個(gè)字節(jié)數(shù)據(jù)給595再并行輸出

void SendTo595(uchar Data)
{
   char i;
/*for(i=0;i<8;i++)
   {
                    SH_CP = 0;
                 
        DS=0x80&Data1;//&為按位運(yùn)算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個(gè)式子為0
                 
        Data1=_crol_(Data1,1); //左移一位 將高位補(bǔ)給低位,如果二進(jìn)制數(shù)為01010101 那么_crol_(1) 為10101010

        SH_CP = 1;          //上升沿讓串行輸入時(shí)鐘變成高電平 并延時(shí)一個(gè)時(shí)鐘周期
        _nop_();

   }  
*/

   for(i=0;i<8;i++)
   {
                    SH_CP = 0;
                 
        DS=0x80&Data;//&為按位運(yùn)算符,即全1為1,有0為0,上式也就是 (1000 0000)&(1111 1111)=1000 0000,若高位為1則是1高位為0則這個(gè)式子為0
                 
        Data=_crol_(Data,1); //左移一位 將高位補(bǔ)給低位,如果二進(jìn)制數(shù)為01010101 那么_crol_(1) 為10101010

        SH_CP = 1;          //上升沿讓串行輸入時(shí)鐘變成高電平 并延時(shí)一個(gè)時(shí)鐘周期
        _nop_();

   }  

  /*  ST_CP = 0;
         _nop_();
         位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器
   ST_CP = 1;         //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
   _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_();
         //位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器
   ST_CP = 1;         //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
   _nop_();
  // _nop_();

delay(5);

SendTo595(QQ[1]);
SendTo595(DISP[shi]);
ST_CP = 0;
         _nop_();
         //位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器
   ST_CP = 1;         //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
   _nop_();
  // _nop_();

delay(5);
SendTo595(QQ[2]);
SendTo595(DISP[bai]);
ST_CP = 0;
         _nop_();
         //位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器
   ST_CP = 1;         //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
   _nop_();
  // _nop_();

delay(5);

SendTo595(QQ[3]);
SendTo595(DISP[qian]);
ST_CP = 0;
         _nop_();
         //位移寄存器完畢,轉(zhuǎn)移到存儲(chǔ)寄存器
   ST_CP = 1;         //上升沿,存儲(chǔ)寄存器變?yōu)楦唠娖?延遲兩個(gè)時(shí)鐘周期
   _nop_();
  // _nop_();

delay(5);

}


}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2019-3-28 08:31 | 只看該作者
main()函數(shù)中沒(méi)有while(1)主循環(huán),怎么可能正常運(yùn)行?照抄也得抄完整!
回復(fù)

使用道具 舉報(bào)

板凳
ID:416287 發(fā)表于 2019-3-28 09:08 | 只看該作者
首先你的主函數(shù)里面沒(méi)有while(1)循環(huán)  所以你的程序只能跑一次就結(jié)束
回復(fù)

使用道具 舉報(bào)

地板
ID:481965 發(fā)表于 2019-3-28 18:32 | 只看該作者
wulin 發(fā)表于 2019-3-28 08:31
main()函數(shù)中沒(méi)有while(1)主循環(huán),怎么可能正常運(yùn)行?照抄也得抄完整!

之前寫(xiě)了while也一樣,跑一遍就只能顯示數(shù)碼管左邊一個(gè)0
回復(fù)

使用道具 舉報(bào)

5#
ID:481965 發(fā)表于 2019-3-28 18:33 | 只看該作者
奮斗的小白熊 發(fā)表于 2019-3-28 09:08
首先你的主函數(shù)里面沒(méi)有while(1)循環(huán)  所以你的程序只能跑一次就結(jié)束

之前寫(xiě)了while也一樣,跑一遍就只能顯示數(shù)碼管左邊一個(gè)0
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2019-3-28 21:32 | 只看該作者
而投入與天一 發(fā)表于 2019-3-28 18:32
之前寫(xiě)了while也一樣,跑一遍就只能顯示數(shù)碼管左邊一個(gè)0

細(xì)看了一下程序,幾乎從頭至尾都錯(cuò)了。首先你對(duì)stc15f104w這個(gè)芯片根本不了解。程序構(gòu)架、超聲波測(cè)距模塊和74hc595的驅(qū)動(dòng)程序統(tǒng)統(tǒng)錯(cuò)
回復(fù)

使用道具 舉報(bào)

7#
ID:555922 發(fā)表于 2019-6-8 19:28 | 只看該作者
沒(méi)有循環(huán),怎么簡(jiǎn)單
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表