|
這個起初是學校的單片機實驗課的簡單題目,就是這幾天的課程,但是我發現網上找不到直接的程序,就自力更生用我很有限的單片機知識和C語言基礎寫了這個程序。里面測距和步進電機驅動都是現成的,不過我稍微改動了一點點,可以顯示學號,設置兩個閾值控制三段轉速,我試了試,在這個學校很常見的開發板上很好用。程序很簡單很簡陋,但確實給我帶來了一些新的知識,也希望能給有需要的朋友一點點幫助。
這里是顯示固定數字,程序里各個部分我都放了注釋,本來是為了讓老師多給點分寫的,不過好像大家也能看得更清楚。
image3.png (1.13 MB, 下載次數: 41)
下載附件
2019-1-14 11:40 上傳
這里是顯示實時測距。
image4.png (1.16 MB, 下載次數: 54)
下載附件
2019-1-14 11:40 上傳
這里是兩段閾值的加減設置,用來隔開三段速度控制
image5.png (1.1 MB, 下載次數: 48)
下載附件
2019-1-14 11:40 上傳
單片機源程序如下:
- /*********************************************************************
- * 實 驗 名:超聲波測距控制步進電機實驗
- *********************************************************************/
- #include "reg52.h"
- #include <intrins.h>
- sbit RX=P2^1;
- sbit TX=P2^0; //t,e定義超聲波管教
- unsignedint time=0;
- unsignedint timer=0;
- unsigned long S=0;
- bit flag =0; //測量標志
- bit srFlag = 1;
- unsignedint a=100;
- unsignedint b=600;
- unsignedinta_o=100;
- unsignedintb_o=600;
- unsignedint mid;
- unsigned char iSW = 0;
- unsigned char uMode = 1;
- #define GPIO_DIG P0
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- unsigned char code DIG_CODE[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
- unsigned char disbuff[8] ={0,0,0,0,0,0,0,0};
- //電機IO
- #define GPIO_MOTOR P1
- sbit F1 = P1^0;
- sbit F2 = P1^1;
- sbit F3 = P1^2;
- sbit F4 = P1^3;
- //按鍵IO
- sbit K1=P3^1;
- sbit K2=P3^0;
- sbit K3=P3^2;
- sbit K4=P3^3;
- unsigned char keyEx = 0;
- unsigned char code FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //反轉順序
- unsigned char code FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //正轉順序
- unsigned char Direction,Speed;
- void Delay(unsigned int t);
- void Motor();
- voidDigDisplay();
- void Delay1ms() //?? 0us
- {
- unsigned char a,b,c;
- for(c=2;c>0;c--)
- for(b=38;b>0;b--)
- for(a=13;a>0;a--);
-
- }
- voidDigDisplay()
- {
- unsigned char i;
- unsignedint j;
- for(i=0;i<8;i++)
- {
- switch(i) //位選,選擇點亮的數碼管,
- {
- case(0):
- LSA=0;LSB=0;LSC=0; break;//顯示第0位
- case(1):
- LSA=1;LSB=0;LSC=0; break;//顯示第1位
- case(2):
- LSA=0;LSB=1;LSC=0; break;//顯示第2位
- case(3):
- LSA=1;LSB=1;LSC=0; break;//顯示第3位
- case(4):
- LSA=0;LSB=0;LSC=1; break;//顯示第4位
- case(5):
- LSA=1;LSB=0;LSC=1; break;//顯示第5位
- case(6):
- LSA=0;LSB=1;LSC=1; break;//顯示第6位
- case(7):
- LSA=1;LSB=1;LSC=1; break;//顯示第7位 //勢能端
- }
- GPIO_DIG=disbuff[i];//發送段碼
-
- j=10; //掃描間隔時間設定
- while(j--); //延時
- GPIO_DIG=0x00;//消隱
- }
- }
- unsigned char scanKey(void)
- {
- // 如果此前沒有按鍵
- if(keyEx == 0 )
- {
- if( K1 == 0 )
- {
- keyEx = 1; // 有鍵按下
- return 1; // 鍵值1表示閾值ab切換
- }
- if( K2 == 0 )
- {
- keyEx = 1; // 有鍵按下
- return 2; // 鍵值2表示'+'
- }
- if( K3 == 0 )
- {
- keyEx = 1; // 有鍵按下
- return 3; // 鍵值3表示'-'
- }
- if( K4 == 0 )
- {
- keyEx = 1; // 有鍵按下
- return 4; // 鍵值4表示數位切換
- }
- return 0;
- }
- else
- {
- if( K1 == 1 && K2 == 1 && K3 == 1 && K4 == 1 )
- {
- keyEx = 0; // 等待沒有按鍵后,按鍵保護值清0
- }
- }
- return 0;
- }
- /*********************************************************************
- * 函 數 名:Motor
- * 函數功能:電機旋轉函數
- *********************************************************************/
- void Motor()
- {
- unsigned char i;
- for(i=0;i<8;i++)
- {
- if(Direction==1)
- GPIO_MOTOR = FFW[i]&0x1f; //???
- if(Direction==2)
- GPIO_MOTOR = FFZ[i]&0x1f;
- Delay(Speed); //????
- }
- }
- void zd3() interrupt 3 //T1中斷用來掃描數碼管和計800MS啟動模塊
- {
- TH1=0xf8;
- TL1=0x30;
- DigDisplay();
- timer++;
- if(srFlag||timer>=100)
- //200ms 中斷一次
- {
- srFlag = 0;
- timer=0;
- TX=1; //至高點平 //800MS 啟動一次模塊
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- //20us高電平
- TX=0;
- }
- }
- /*********************************************************************
- * 函 數 名:main
- * 函數功能:主函數
- *********************************************************************/
- void main(void)
- {
- unsigned char i;
- Speed=15;
- TMOD=0x11; //設T0為方式1,GATE=1;
- TH0=0;
- TL0=0;
- //清0
-
- TH1=0xf8; //2MS定時
- TL1=0x30;
- ET0=1; //允許T0中斷
- ET1=1; //允許T1中斷
- TR1 = 0;
- EA = 0;
- while(scanKey() == 0 )
- {
- disbuff[0] = DIG_CODE[4];
- disbuff[1] = DIG_CODE[5];
- disbuff[2] = DIG_CODE[0];
- disbuff[3] = DIG_CODE[1];
- disbuff[4] = DIG_CODE[0];
- disbuff[5] = DIG_CODE[3];
- disbuff[6] = DIG_CODE[1];
- disbuff[7] = DIG_CODE[1];
- DigDisplay();
- }
- for(i=0;i<100;i++)
- {
- Delay1ms();
- }
- if(uMode == 1 )
- {
- TR1 = 1;
- EA = 1;
- }
- while(1)
- {
- if(uMode == 0 )
- {
- disbuff[0] = DIG_CODE[a% 10];
- disbuff[1] = DIG_CODE[(a / 10) % 10];
- disbuff[2] = DIG_CODE[(a / 100) % 10];
- disbuff[3] = DIG_CODE[(a / 1000) % 10];
- disbuff[4] = DIG_CODE[b% 10];
- disbuff[5] = DIG_CODE[(b / 10) % 10];
- disbuff[6] = DIG_CODE[(b / 100) % 10];
- disbuff[7] = DIG_CODE[(b / 1000) % 10];
- DigDisplay();
- switch(scanKey() )
- {
- // 如果按下了模式切換鍵
- case 1:
- uMode = 1;
- TR1 = 1;
- EA = 1;
- break;
- // 如果按下了'+'鍵
- case 2:
- switch(iSW )
- {
- case 0:
- mid = a;
- if( mid + 100 <= 3000 )
- mid += 100;
- a = mid;
- break;
- case 1:
- mid = b;
- if( mid + 100 <= 3000 )
- mid += 100;
- b = mid;
- break;
- default:
- break;
- }
- break;
- // 如果按下了'-'鍵
- case 3:
- switch(iSW )
- {
- case 0:
- mid = a;
- if( mid - 100 > 0 )
- mid -= 100;
- a = mid;
- break;
- case 1:
- mid = b;
- if( mid - 100 > 0 )
- mid -= 100;
- b = mid;
- default:
- break;
- }
- break;
- // 如果按下了換位鍵
- case 4:
- iSW++;
- if(iSW>= 2 )
- iSW = 0;
- break;
- default:
- break;
- }
- if (a>=b)
- {
- a = a_o;
- b + b_o;
- }
- }
- else
- {
- TH0 = 0; // 計數清0,等待測距計數
- TL0 = 0;
- // 我們假定工作模式=1代表超聲波測距
- while( !RX &&scanKey() != 1 );
- // 如果有echo信號或者有SET按鍵
- TR0 = 1;
- if( !RX &&keyEx ) // 如果是有按鍵而沒有echo,則返回參數設置
- {
- // 如果有SET按鍵
- uMode = 0;
- TR0 = 0;
- TR1 = 0;
- EA = 0;
- continue;
- }
- // 如果有echo信號,則一直等待echo信號結束
- while(RX );
- // echo信號結束,停止計數
- TR0 = 0;
- time = TH0 * 256 + TL0;
- S= (long)(time*0.17);
- disbuff[3]=DIG_CODE[S%10000/1000];
- disbuff[2]=DIG_CODE[S%1000/100];
- disbuff[1]=DIG_CODE[S%100/10];
- disbuff[0]=DIG_CODE[S%10/1];
- disbuff[4] = 0;
- disbuff[5] = 0;
- disbuff[6] = 0;
- disbuff[7] = 0;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
c源文件.rar
(2.33 KB, 下載次數: 89)
2019-1-14 11:45 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|
評分
-
查看全部評分
|