0.png (5.05 KB, 下載次數: 46)
下載附件
2018-7-10 18:40 上傳
全部資料51hei下載地址:
程序.zip
(130.97 KB, 下載次數: 8)
2018-7-10 17:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
Project Logs for 電鋼.zip
(5.68 KB, 下載次數: 6)
2018-7-10 17:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
- /*******************************************************************/
- /*******************超聲波測距儀************************************/
- /*******************(液晶屏顯示)************************************/
- /*******************晶振 11.0592MHz********************************/
- #include <reg52.h>
- #include "12864.h"
- #include <l298.h>
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無符號8位整型變量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符號8位整型變量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無符號16位整型變量 */
- typedef signed int S16; /* defined for signed 16-bits integer variable 有符號16位整型變量 */
- typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無符號32位整型變量 */
- //typedef signed long S32; /* defined for signed 32-bits integer variable 有符號32位整型變量 */
- //typedef float F32; /* single precision floating point variable (32bits) 單精度浮點數(32位長度) */
- //typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(64位長度) */
- //定時器0的定時值為1mS,即11059/12=922個時鐘脈沖,其補為65536-922=64614
- #define SYSTEMCLK 921600 //11059200/12
- #define T0CLK 921600 //11059200/12
- #define T1CLK 921600 //11059200/12
- #define T1PERIOD 1000000/921600 //T1周期時間,以微秒為單位,約為1.085uS
- #define TIMER0H 0xFC //64614/256=252
- #define TIMER0L 0x66 //54447%256=102
- //管腳定義
- sbit Trig = P1^3;
- sbit Echo = P3^2; //回波必須接在外部中斷引腳上
- sbit Beep = P2^6; //報警蜂鳴器
- sbit k1=P3^0;
- sbit k2=P3^1;
- sbit k3=P3^3;
- sbit k4=P3^4;
- sbit k5=P3^5;
- sbit k6=P2^5;
- sbit k7=P2^7;
- sbit hy=P1^1;
- unsigned char code tab[]="0123456789 :.%";
- uint h=0,v=0;
- uint V1=0,s=0;
- uchar time1,puk1=100,k=1,w=0,m=0,puk=0;
- //定義標志
- volatile bit FlagSucceed = 0; //測量成功標志
- volatile bit FlagDisplay = 0; //顯示標志
- //定義全局變量
- U16 DisplayCount=0;
- U32 time=0;
- U32 distance=0;
- //函數聲明
- void delay_20us();
- void Start_Module();
- void INT0_Init(void);
- void Data_Init();
- void Timer0_Init();
- void Timer1_Init();
- //20us延時程序,不一定很準
- void delay_20us()
- {
- U16 bt ;
- for(bt=0;bt<190;bt++); //8M晶振是100
- }
- void delayms(uchar t)
- {
- uchar a,b;
- for(a=t;a>0;a--)
- for(b=110;b>0;b--);
- }
- void speak()
- {
- Beep=0;
- delayms(200);
- Beep=1;
- }
- //數據初始化
- void Data_Init()
- {
- Trig = 0;
- distance = 0;
- DisplayCount = 0;
- }
- //外部中斷初始化函數
- void INT0_Init(void)
- {
- IT0 = 0; //負邊沿觸發中斷
- EX0=0; //關閉外部中斷
- }
- //外部中斷處理用做判斷回波電平
- void INT0_ISR (void) interrupt 0
- {
- time =TH1*256+TL1; //取出定時器的值
- FlagSucceed = 1; //置成功測量的標志
- if(s==1)
- V1=3*puk1;
- else
- V1=0;
- co_display (3,5,V1/100,V1%100/10,tab);
-
- EX0=0; //關閉外部中斷
- }
- /////////////初始化定時器///////////////////
- void InitTimer0(void)
- {
- TMOD = 0x11;
- TH0=0xff;
- TL0=0xfe;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- //////////////////PWM產生函數//////////////////////////////
- void Timer0Interrupt(void) interrupt 1
- {
- TH0=0xff;
- TL0=0xfe; //從新賦值
- time1++;
- if(time1<puk1)pwm1=1; //time小于給的那個值時就是高電平
- else
- if((time1>=puk1)&&(time1<=100))pwm1=0; // 如果puk1到100的就是低電平
- else
- if(time1>=100)time1=0; //time大于100就清0
- }
- //定時器1初始化,16位計數模式,時鐘為11059200/12=921600Hz
- //60ms計數為55296,即0xD800
- void Timer1_Init()
- {
- TMOD = 0x11; //定時器0和1工作在16位方式
- TH1 =0;
- TL1= 0;
- ET1 = 1;
- }
- //啟動模塊,Trig管腳20us正脈沖
- void Start_Module() //啟動模塊
- {
- Trig=1; //啟動一次模塊
- delay_20us();
- Trig=0;
- }
- /********************************************************************
- * 名稱 : Main()
- * 功能 : 主函數
- ***********************************************************************/
- void key()
- {
- if(k1==0||hy==0)
- {
- pwm(w);
- // puk1=puk;
- cn_display(1,6,0,"啟");
- s=1;
- }
- if(k2==0)
- {
- delay_20us();
- delay_20us();
- pwm(2);
- s=0;
- {
- if(k==1)
- cn_display(1,4,0,"伸"),w=1,k=0;
- else if(k==0)
- cn_display(1,4,0,"縮"),w=0,k=1;
- // else
- // cn_display(1,4,0,"停"),pwm(w),k=1;
- }
- }
- if(k3==0)
- {
- h++;
- if(h>=30)
- h=30;
- }
- if(k4==0)
- {
- h--;
- if(h==0)
- h=30;
- }
- if(k5==0)
- {
- v++;
- if(v>=30)
- v=30;
- }
- if(k6==0)
- {
- v--;
- if(v==0)
- v=30;
- }
- if(k7==0)
- {
- m++;
- if(m>6)
- m=0;
- }
- }
- void chaosheng()
- {
- EA= 0;
- //以下為一次檢測過程:先發出Trig電平,打開外部中斷,清零T1,
- //最后在外部中斷下降沿觸發時取出T1當前值,計算出Trig脈沖寬度。
- while (Echo == 1) ;
- Start_Module();
- while(Echo==0) ;//等待Echo回波引腳變高電平
- FlagSucceed = 0;
- EX0=1;
- TH1= 0;
- TL1= 0;
- TF1= 0;
- TR1=1; //啟動定時器1開始計數
- EA = 1;
- while (TH1<83) ; //盲區
- TR1 = 0 ; //關閉定時器1
- EX0 = 0; //關閉外部中斷
- if(FlagSucceed==1) //一次測試成功,則計算距離,單位為厘米
- {
- distance = time * 1.085 ; //計算得到脈沖時間(以微秒為單位)
- //將微秒時間轉變成厘米距離的算法: Y米=(X秒*344)/2
- // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
- distance /=58;
- //如果距離小于20cm,則聲光報警
- distance*=10;
- distance-=35;
- distance-=520;
- co_display (2,6,distance%1000/100,distance%100/10,tab);
- }
- }
- void init()
- {
- U16 i;
- init_lcd ();
- InitTimer0();
- for(i=0;i<8;i++)
- cn_display(1,i,i," 陜西首屆高校 ");
- for(i=0;i<8;i++)
- cn_display(2,i,i,"教師電子設計競賽");
- delayms(2000);
- clrram ();
- EA = 0;
- INT0_Init();
- Timer1_Init(); //定時器1初始化
- Data_Init();
- EA = 1;
- for(i=0;i<8;i++)
- cn_display(0,i,i,"同位伸縮控制系統");
- for(i=0;i<8;i++)
- cn_display(1,i,i," A狀態: ");
- pwm(2);
- for(i=0;i<2;i++)
- cn_display(2,i,i,"SET:");
- cn_display(2,3,0,"cm");
- cn_display(2,4,0,"RU");
- cn_display(2,5,0,"N:");
- cn_display(2,7,0,"cm");
- cn_display(3,0,0,"V:");
- cn_display(3,2,0,"mm");
- cn_display(3,3,0,"/s");
- cn_display(3,4,0,"V:");
- cn_display(3,6,0,"mm");
- cn_display(3,7,0,"/s");
- }
- void main()
- {
- uint l=1,pt=1;
- init();
- while(1)
- {
- chaosheng();
- co_display (1,3,11,m%10,tab);
- co_display (2,2,h/10,h%10,tab);
- co_display (3,1,v/10,v%10,tab);
-
- if(m==0)
- {
- if((distance/10==h))
- {
- pwm(2),w=2;
- speak();
- }
- }
- if(m==1)
- {
- if((v*10)>V1)
- {
- puk1+=1;
- if(puk1>=100)
- puk1=100;
- }
- else
- if((v*10)<V1)
- {
- puk1-=1;
- if(puk1==40)
- puk1=40;
- }
- else
- {
- speak();
- }
- }
- if(m==2)
- {
- if(distance/10==20)
- pwm(0),pt=0;
- else if((distance/10<=1) &&pt==0)
- pwm(2),speak(),pt=1;
- }
- key();
- }
- }
復制代碼
|