欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開始

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

誠(chéng)心求解答!關(guān)于利用stc15單片機(jī)制作俯臥撐計(jì)數(shù)裝置的問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:736475 發(fā)表于 2020-11-15 15:24 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
400黑幣
樓主單片機(jī)小白一名。正在學(xué)習(xí)stc15w4k32s4這一款單片機(jī)。目前想利用超聲波傳感器做一個(gè)俯臥撐計(jì)數(shù)的裝置。但是遇到了種種問(wèn)題,經(jīng)過(guò)長(zhǎng)時(shí)間的調(diào)試仍未好轉(zhuǎn),誠(chéng)心求大佬解答!
項(xiàng)目具體描述如下:stc15單片機(jī)與兩個(gè)HC-SR04超聲波連接,通電后超聲波測(cè)距并在12864液晶上實(shí)時(shí)顯示,通過(guò)監(jiān)測(cè)超聲波返回的距離變化來(lái)統(tǒng)計(jì)做了俯臥撐的個(gè)數(shù)。當(dāng)距離超出一定范圍時(shí)蜂鳴器就會(huì)報(bào)警,提示別人姿勢(shì)錯(cuò)誤。測(cè)量的距離同時(shí)通過(guò)串口返回給電腦。
遇到的問(wèn)題:目前給單片機(jī)上電后在絕大多數(shù)情況下單片機(jī)無(wú)法正常工作,液晶只亮不顯示,串口助手無(wú)數(shù)據(jù)返回,蜂鳴器不響。像是沒(méi)有進(jìn)入到主函數(shù)中,單片機(jī)像是“僵死”了。樓主不知道是代碼的問(wèn)題還是硬件焊接的問(wèn)題實(shí)物圖如下:


單片機(jī)代碼如下:
  1. #include<stc15w.h>
  2. #include<intrins.h>
  3. #include<stdio.h>
  4. #include<math.h>
  5. #define uchar unsigned char
  6. #define uint unsigned int
  7. #define Part P1 //P0接8位數(shù)據(jù)線
  8. sbit LCD_RS=P2^6;  //定義12864液晶RS端,寄存器選擇信號(hào) H:數(shù)據(jù)寄存器 L:指令寄存器   
  9. sbit LCD_RW=P2^5;  //定義12864液晶RW端,讀/寫信號(hào)  H:讀   L:寫   
  10. sbit LCD_EN=P2^4;  //定義12864液晶LCDEN端, 片選信號(hào)  下降沿觸發(fā),鎖存數(shù)據(jù)   
  11. sbit LCD_PSB=P2^3;  //定義12864液晶PSB端, H:并行 L:串行  
  12. sbit Echo1=P0^0;//超聲波測(cè)距模塊Echo1連接的IO
  13. sbit Trig1=P0^1;//超聲波測(cè)距模塊Trig1連接的IO
  14. sbit Echo2=P0^2;//超聲波測(cè)距模塊Echo2連接的IO
  15. sbit Trig2=P0^3;//超聲波測(cè)距模塊Trig2連接的IO
  16. sbit Beep=P2^7;//蜂鳴器連接的IO口
  17. uchar show1[]="chest:0000mm";
  18. uchar show2[]="waist:0000mm";
  19. uchar show3[]="gap:000mm";
  20. uchar show4[]="times:000";
  21. uint xdata distance1=600,distance2=600,time,num=0;
  22. uchar xdata urdat,k=1;
  23. float xdata ratio;
  24. char xdata m=1;
  25. int xdata gap;
  26. void SendData(unsigned char dat);
  27. void delayms(uint xms)
  28. {        
  29.         uint i,j;
  30.         for(i=xms;i>0;i--)
  31.                 for(j=110;j>0;j--);
  32. }
  33. void Delay20us()                //@11.0592MHz
  34. {
  35.         unsigned char i;

  36.         _nop_();
  37.         _nop_();
  38.         _nop_();
  39.         i = 52;
  40.         while (--i);
  41. }
  42. //====================================  
  43. //LCD忙檢測(cè)函數(shù)  
  44. bit lcd_busy()  
  45. {  
  46. bit result;  
  47.     LCD_RS=0;   
  48.   LCD_RW=1;  
  49.   LCD_EN= 1;  
  50.    result=(bit)(Part & 0x80);  
  51.    LCD_EN=0;  
  52. return result;  
  53. }  
  54. //=====================================  
  55. //液晶寫命令函數(shù)  
  56. void lcd_write_cmd(uchar com)  
  57. {  
  58. while(lcd_busy());  
  59. LCD_RS=0;  //選擇指令寄存器  
  60. LCD_RW=0;  //寫  
  61. LCD_EN=0;   
  62. Part=com;    //指令值賦給P1口  
  63. delayms(5);  
  64. LCD_EN=1;  
  65. delayms(5);  
  66. LCD_EN=0;   
  67. }  
  68. //=====================================  
  69. //液晶寫一個(gè)字符數(shù)據(jù)函數(shù)  
  70. void lcd_write_dat(uchar date)  
  71. {  
  72. while(lcd_busy());  
  73. LCD_RS=1;  //選擇數(shù)據(jù)寄存器  
  74. LCD_RW=0;  //寫  
  75. LCD_EN=0;  
  76. P1=date;    //數(shù)據(jù)值賦給P1口  
  77. delayms(5);  
  78. LCD_EN=1;  
  79. delayms(5);  
  80. LCD_EN=0;  
  81. }  
  82. //=====================================  
  83. //液晶寫一個(gè)字符串函數(shù)  
  84. //void lcd_write_string(uchar *str)  
  85. //{  
  86. //while(*str!='\0')  //未結(jié)束  
  87. // {  
  88. //  lcd_write_dat(*str++);  
  89. //  delayms(5);  
  90. // }  
  91. //}  
  92. //=====================================  
  93. //液晶顯示位置函數(shù)  
  94. void lcd_pos(uchar x,uchar y)  //從第X行的第Y位置開始顯示  
  95. {  
  96. uchar pos;  
  97. if(x==1)        //第一行  
  98. { x=0x80;}  
  99. else if(x==2)  //第二行  
  100. { x=0x90;}  
  101. else if(x==3)  //第三行  
  102. { x=0x88;}  
  103. else if(x==4)  //第四行  
  104. { x=0x98;}  
  105. pos=x+y-1;     //首地址為0X80  
  106. lcd_write_cmd(pos);  
  107. }  
  108. //=====================================  
  109. //液晶初始化函數(shù)  
  110. void lcd_init()  
  111. {  
  112. LCD_PSB=1;  //并行方式  
  113. lcd_write_cmd(0x30);  
  114. delayms(5);  
  115. lcd_write_cmd(0x0c);  //開顯示,不顯示光標(biāo)  
  116. delayms(5);  
  117. lcd_write_cmd(0x06);  //寫一個(gè)字符后地址指針自動(dòng)加1  
  118. delayms(5);  
  119. lcd_write_cmd(0x01);   //清屏  
  120. delayms(5);  
  121. }  
  122. //=====================================
  123. void Display1()
  124. {
  125.         uint xdata i;
  126.         lcd_pos(1,1);  
  127.         for(i=0;i<13;i++)
  128.   {lcd_write_dat(show1[i]); }  
  129. }
  130. void Display2()
  131. {
  132.         uint xdata i;
  133.   lcd_pos(2,1);  
  134.         for(i=0;i<13;i++)  
  135.   {lcd_write_dat(show2[i]); }      
  136. }
  137. void Display3()
  138. {
  139.         uint xdata i;
  140.   lcd_pos(3,1);  
  141.         for(i=0;i<10;i++)   
  142.   {lcd_write_dat(show3[i]); }  
  143. }
  144. void Display4()
  145. {
  146.         uint xdata i;
  147.   lcd_pos(4,1);  
  148.         for(i=0;i<9;i++)   
  149.   {lcd_write_dat(show4[i]); }  
  150. }
  151. void UartInit(void)
  152. {
  153.         SCON=0x50;//工作方式選擇:8位UART波特率可變
  154.         AUXR&=0x80;
  155.         TMOD=0x00;
  156.         TL1=0xe8;
  157.         TH1=0xff;
  158.         TR1=1;
  159.         ES=1;
  160.         EA=1;
  161. }//配置波特率,對(duì)數(shù)據(jù)采樣
  162. void Uart() interrupt 4 using 1//定時(shí)器1,16位自動(dòng)重裝模式
  163. {
  164.         if(RI)
  165.         {
  166.                 urdat=SBUF;//從緩沖區(qū)讀取數(shù)據(jù)
  167.                 RI=0;//響應(yīng)中斷請(qǐng)求后清零
  168.                 SendData(urdat);
  169.         }
  170. }
  171. void SendData(unsigned char dat)
  172. {
  173.         SBUF=dat;//將數(shù)據(jù)傳入PC機(jī)
  174.         while(TI==0);//等待發(fā)送中斷請(qǐng)求
  175.         TI=0;//響應(yīng)中斷后TI清零
  176. }
  177. char putchar(char c)
  178. {
  179.         SendData(c);
  180.         return c;
  181. }//輸出成對(duì)象
  182. void INT_init1 (void)
  183. {
  184.         TMOD&=0x01;//定時(shí)器0,16位不可重裝載工作方式
  185.         TH0=0;//定時(shí)器0清零
  186.         TL0=0;//定時(shí)器0清零
  187.         EA = 1;//總中斷開
  188.         Trig1=0;//拉低為下次觸發(fā)做準(zhǔn)備
  189.         Trig2=0;
  190. }
  191. void dist (void)//測(cè)量距離程序
  192. {
  193.         if(m==1)
  194.         {
  195.         Trig1=1;        
  196.         Delay20us();   //延時(shí)20us
  197.         Trig1=0;         //Trig輸出20us高電平觸發(fā)測(cè)距
  198.         while(Echo1==0); //等待Echo回波引腳變高電平
  199.         TR0=1;//程序運(yùn)行到此處時(shí)說(shuō)明Echo腳變成了高電平,此時(shí)啟動(dòng)T0開始計(jì)時(shí)
  200.         while(Echo1==1); //等待Echo回波引腳高電平結(jié)束               
  201.         TR0=0;//程序運(yùn)行到此處時(shí)說(shuō)明Echo腳變成了低電平,此時(shí)T0停止計(jì)時(shí)
  202.         time=TH0*256+TL0;
  203.         distance1=time*0.272;  //測(cè)量距離
  204.         TH0 = 0;  //重置計(jì)時(shí)器
  205.         TL0 = 0;
  206.         }
  207.         if(m==-1)
  208.         {
  209.         Trig2=1;        
  210.         Delay20us();   //延時(shí)20us
  211.         Trig2=0;         //Trig輸出20us高電平觸發(fā)測(cè)距
  212.         while(Echo2==0); //等待Echo回波引腳變高電平
  213.         TR0=1;//程序運(yùn)行到此處時(shí)說(shuō)明Echo腳變成了高電平,此時(shí)啟動(dòng)T0開始計(jì)時(shí)
  214.         while(Echo2==1); //等待Echo回波引腳高電平結(jié)束               
  215.         TR0=0;//程序運(yùn)行到此處時(shí)說(shuō)明Echo腳變成了低電平,此時(shí)T0停止計(jì)時(shí)
  216.         time=TH0*256+TL0;
  217.         distance2=time*0.24;  //測(cè)量距離
  218.         TH0 = 0;  //重置計(jì)時(shí)器
  219.         TL0 = 0;
  220.         }
  221.         m=-m;//輪流測(cè)量距離12
  222. }

  223. void main()//主函數(shù)  
  224. {
  225.         P0M0=0x00;P0M1=0x00;
  226.         P1M0=0x00;P1M1=0x00;
  227.         P2M0=0x00;P2M1=0x00;
  228.         P3M0=0x00;P3M1=0x00;//單片機(jī)IO口工作方式初始化
  229.         INT_init1();//T0初始化
  230.         UartInit();//串口初始化
  231.         lcd_init();//液晶初始化
  232.         while(1)        
  233.         {        
  234.                 dist();//定時(shí)器測(cè)量距離
  235.                 printf("dis1=%d\n",distance1);
  236.                 printf("dis2=%d\n",distance2);
  237.                 gap=distance1-distance2;
  238.                 gap=abs(gap);
  239.                 ratio=distance1/distance2;
  240.                 printf("gap=%d",gap);
  241.                 if(gap<=200)
  242.                 {
  243.                                 if(distance1<190&&distance2<180)
  244.                                 {
  245.                                         k=0;
  246.                                         Beep=0;
  247.                                         delayms(50);
  248.                                         Beep=1;
  249.                                 }
  250.                                 else if(distance1>200&&distance2>250&&k==0)
  251.                                 {
  252.                                         k=1;
  253.                                         Beep=0;
  254.                                         delayms(50);
  255.                                         Beep=1;
  256.                                         num++;
  257.                                 }
  258. //                                else continue;
  259.                 }
  260.                 else if(gap>200&&gap<400)
  261.                 {
  262.                         Beep=0;
  263.                         delayms(120);
  264.                         Beep=1;
  265.                 }
  266. //                else
  267. //                {
  268. //                        continue;
  269. //                }
  270.                 printf("times=%d\n",num);
  271.                 printf("     ");
  272.                 show1[6]=distance1/1000+0x30;
  273.                 show1[7]=distance1%1000/100+0x30;
  274.                 show1[8]=distance1%1000%100/10+0x30;
  275.                 show1[9]=distance1%10+0x30;
  276.                 show2[6]=distance2/1000+0x30;
  277.                 show2[7]=distance2%1000/100+0x30;
  278.                 show2[8]=distance2%1000%100/10+0x30;
  279.                 show2[9]=distance2%10+0x30;
  280.                 show3[4]=abs(gap)/100+0x30;
  281.                 show3[5]=abs(gap)%100/10+0x30;
  282.                 show3[6]=abs(gap)%10+0x30;
  283.                 show4[7]=num/100+0x30;
  284.                 show4[8]=num%100/10+0x30;
  285.                 show4[9]=num%10+0x30;
  286.           Display1();
  287.                 Display2();
  288.                 Display3();
  289.                 Display4();
  290.         }
  291. }
復(fù)制代碼

樓主立志做一名工程師,努力學(xué)習(xí)電子制作,雖然在項(xiàng)目的制作中屢屢受挫,但是仍不氣餒,我相信總有好心人為我指點(diǎn)迷津,是否可以大致指出我的項(xiàng)目哪里有什么硬傷?出現(xiàn)上述問(wèn)題的可能原因是什么?如有則不勝感激!

最佳答案

查看完整內(nèi)容

1,你要用printf的話,串口初始化要加上 TI = 1; 2,while(Echo1==0);這里最好改成 while(Echo1==0 && TR0 == 1);超時(shí)判斷,因?yàn)槿绻暷K接收不到回聲,就會(huì)一直卡在while(Echo1==0);循環(huán)里面導(dǎo)致單片機(jī)卡死。 3,建議先單獨(dú)測(cè)試LCD屏幕能不能正常工作,再加上其他代碼,同理其他模塊得先確保能單獨(dú)工作的情況下,再把所有程序集成在一起。 4,超聲波測(cè)量周期建議100MS以上,否則會(huì)影響超聲波的下次測(cè)量結(jié)果,建議開個(gè)定時(shí) ...
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:514901 發(fā)表于 2020-11-15 15:24 | 只看該作者
1,你要用printf的話,串口初始化要加上 TI = 1;
2,while(Echo1==0);這里最好改成 while(Echo1==0 && TR0 == 1);超時(shí)判斷,因?yàn)槿绻暷K接收不到回聲,就會(huì)一直卡在while(Echo1==0);循環(huán)里面導(dǎo)致單片機(jī)卡死。
3,建議先單獨(dú)測(cè)試LCD屏幕能不能正常工作,再加上其他代碼,同理其他模塊得先確保能單獨(dú)工作的情況下,再把所有程序集成在一起。
4,超聲波測(cè)量周期建議100MS以上,否則會(huì)影響超聲波的下次測(cè)量結(jié)果,建議開個(gè)定時(shí)器來(lái)觸發(fā)超聲波測(cè)距
回復(fù)

使用道具 舉報(bào)

板凳
ID:648281 發(fā)表于 2020-11-15 16:39 | 只看該作者
你好!
首先把你的接線先整理一遍吧,接插件用的太多了,很容易造成斷路;
具體功能的實(shí)現(xiàn),可以進(jìn)行交流,軟硬件工程可以幫你完成。
回復(fù)

使用道具 舉報(bào)

地板
ID:160500 發(fā)表于 2020-11-15 18:44 | 只看該作者
絕大多數(shù)情況下單片機(jī)無(wú)法正常工作,意思就是有時(shí)候是可以正常工作的。這種問(wèn)題就是線路連接的問(wèn)題
回復(fù)

使用道具 舉報(bào)

5#
ID:736475 發(fā)表于 2020-11-16 22:51 | 只看該作者
51hei**1140 發(fā)表于 2020-11-15 16:39
你好!
首先把你的接線先整理一遍吧,接插件用的太多了,很容易造成斷路;
具體功能的實(shí)現(xiàn),可以進(jìn)行交流 ...

謝謝!
回復(fù)

使用道具 舉報(bào)

6#
ID:736475 發(fā)表于 2020-11-16 22:52 | 只看該作者
liuzx66 發(fā)表于 2020-11-15 18:44
絕大多數(shù)情況下單片機(jī)無(wú)法正常工作,意思就是有時(shí)候是可以正常工作的。這種問(wèn)題就是線路連接的問(wèn)題

確實(shí),我也懷疑是線路的問(wèn)題!因?yàn)槲业木路全暴露在外面,我得考慮換一下杜邦線然后把他們焊在一起
回復(fù)

使用道具 舉報(bào)

7#
ID:736475 發(fā)表于 2020-11-16 22:52 | 只看該作者
鄭漢松 發(fā)表于 2020-11-16 10:57
1,你要用printf的話,串口初始化要加上 TI = 1;
2,while(Echo1==0);這里最好改成 while(Echo1==0 && TR ...

非常感謝有耐心幫我看代碼!
回復(fù)

使用道具 舉報(bào)

8#
ID:736475 發(fā)表于 2020-11-16 22:59 | 只看該作者
鄭漢松 發(fā)表于 2020-11-16 10:57
1,你要用printf的話,串口初始化要加上 TI = 1;
2,while(Echo1==0);這里最好改成 while(Echo1==0 && TR ...

可以用一個(gè)定時(shí)器來(lái)進(jìn)行分頻,輪流觸發(fā)超聲波和液晶嗎?
回復(fù)

使用道具 舉報(bào)

9#
ID:736475 發(fā)表于 2020-11-16 23:15 | 只看該作者
鄭漢松 發(fā)表于 2020-11-16 10:57
1,你要用printf的話,串口初始化要加上 TI = 1;
2,while(Echo1==0);這里最好改成 while(Echo1==0 && TR ...

Timer0 function()
{
        static key_count=0;
        static display_count=0;
         key_count++;
        display_count++;
        if(key_count==10)
                {
                        key_count=0;
                        keyflag=1;
                }
        if(display_count==3)
                {
                        display_count==0;
                        display();
                }
}
類似于這樣
回復(fù)

使用道具 舉報(bào)

10#
ID:367934 發(fā)表于 2020-11-17 09:11 | 只看該作者
系統(tǒng)都是由簡(jiǎn)單到復(fù)雜,想要知道問(wèn)題出在哪里可以做一下簡(jiǎn)單的測(cè)試。
1.找個(gè)萬(wàn)用表測(cè)試一下電壓是否正常。可能是電壓?jiǎn)栴}。接錯(cuò)或者反接一點(diǎn)機(jī)率會(huì)導(dǎo)致整個(gè)系統(tǒng)出問(wèn)題。
2.程序下載。測(cè)試測(cè)試單片機(jī)是否出問(wèn)題。如果沒(méi)有進(jìn)行下一步。
3.找一個(gè)簡(jiǎn)單的串口例程測(cè)試單片機(jī)是否有問(wèn)題。或者把現(xiàn)在的程序把其他的功能先屏蔽掉,保留最簡(jiǎn)單的串口通信程序。測(cè)試看有沒(méi)有問(wèn)題。如果沒(méi)有進(jìn)行下一步。
4.測(cè)試超聲波傳感器,使用串口可以進(jìn)行測(cè)試。就這樣一步一步的把所有外設(shè)調(diào)試通過(guò)就好了。
回復(fù)

使用道具 舉報(bào)

11#
ID:426861 發(fā)表于 2020-11-17 09:31 | 只看該作者
軟件先只放一個(gè)功能的,然后測(cè)試硬件電路,只到調(diào)通了再調(diào)下一個(gè),不要一起測(cè)試
回復(fù)

使用道具 舉報(bào)

12#
ID:89515 發(fā)表于 2020-11-17 09:41 來(lái)自觸屏版 | 只看該作者
把液晶屏換為串行通信嘛,這樣數(shù)據(jù)線只有一條,并行線太多太長(zhǎng)接觸不良都有可能出現(xiàn)問(wèn)題,而且不好找。就你的這個(gè)實(shí)驗(yàn)用紅外對(duì)管不是更好做嗎?
回復(fù)

使用道具 舉報(bào)

13#
ID:342954 發(fā)表于 2020-11-17 09:42 | 只看該作者
查硬件,檢查電源,和單片機(jī)復(fù)位腳
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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