|
全部資料51hei下載地址:
程序.zip
(130.97 KB, 下載次數(shù): 8)
2018-7-10 17:12 上傳
點(diǎn)擊文件名下載附件
Project Logs for 電鋼.zip
(5.68 KB, 下載次數(shù): 6)
2018-7-10 17:12 上傳
點(diǎn)擊文件名下載附件
- /*******************************************************************/
- /*******************超聲波測(cè)距儀************************************/
- /*******************(液晶屏顯示)************************************/
- /*******************晶振 11.0592MHz********************************/
- #include <reg52.h>
- #include "12864.h"
- #include <l298.h>
- typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 無(wú)符號(hào)8位整型變量 */
- typedef signed char S8; /* defined for signed 8-bits integer variable 有符號(hào)8位整型變量 */
- typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 無(wú)符號(hào)16位整型變量 */
- typedef signed int S16; /* defined for signed 16-bits integer variable 有符號(hào)16位整型變量 */
- typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 無(wú)符號(hào)32位整型變量 */
- //typedef signed long S32; /* defined for signed 32-bits integer variable 有符號(hào)32位整型變量 */
- //typedef float F32; /* single precision floating point variable (32bits) 單精度浮點(diǎn)數(shù)(32位長(zhǎng)度) */
- //typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點(diǎn)數(shù)(64位長(zhǎng)度) */
- //定時(shí)器0的定時(shí)值為1mS,即11059/12=922個(gè)時(shí)鐘脈沖,其補(bǔ)為65536-922=64614
- #define SYSTEMCLK 921600 //11059200/12
- #define T0CLK 921600 //11059200/12
- #define T1CLK 921600 //11059200/12
- #define T1PERIOD 1000000/921600 //T1周期時(shí)間,以微秒為單位,約為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; //報(bào)警蜂鳴器
- 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;
- //定義標(biāo)志
- volatile bit FlagSucceed = 0; //測(cè)量成功標(biāo)志
- volatile bit FlagDisplay = 0; //顯示標(biāo)志
- //定義全局變量
- U16 DisplayCount=0;
- U32 time=0;
- U32 distance=0;
- //函數(shù)聲明
- void delay_20us();
- void Start_Module();
- void INT0_Init(void);
- void Data_Init();
- void Timer0_Init();
- void Timer1_Init();
- //20us延時(shí)程序,不一定很準(zhǔn)
- 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;
- }
- //數(shù)據(jù)初始化
- void Data_Init()
- {
- Trig = 0;
- distance = 0;
- DisplayCount = 0;
- }
- //外部中斷初始化函數(shù)
- void INT0_Init(void)
- {
- IT0 = 0; //負(fù)邊沿觸發(fā)中斷
- EX0=0; //關(guān)閉外部中斷
- }
- //外部中斷處理用做判斷回波電平
- void INT0_ISR (void) interrupt 0
- {
- time =TH1*256+TL1; //取出定時(shí)器的值
- FlagSucceed = 1; //置成功測(cè)量的標(biāo)志
- if(s==1)
- V1=3*puk1;
- else
- V1=0;
- co_display (3,5,V1/100,V1%100/10,tab);
-
- EX0=0; //關(guān)閉外部中斷
- }
- /////////////初始化定時(shí)器///////////////////
- void InitTimer0(void)
- {
- TMOD = 0x11;
- TH0=0xff;
- TL0=0xfe;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- //////////////////PWM產(chǎn)生函數(shù)//////////////////////////////
- void Timer0Interrupt(void) interrupt 1
- {
- TH0=0xff;
- TL0=0xfe; //從新賦值
- time1++;
- if(time1<puk1)pwm1=1; //time小于給的那個(gè)值時(shí)就是高電平
- else
- if((time1>=puk1)&&(time1<=100))pwm1=0; // 如果puk1到100的就是低電平
- else
- if(time1>=100)time1=0; //time大于100就清0
- }
- //定時(shí)器1初始化,16位計(jì)數(shù)模式,時(shí)鐘為11059200/12=921600Hz
- //60ms計(jì)數(shù)為55296,即0xD800
- void Timer1_Init()
- {
- TMOD = 0x11; //定時(shí)器0和1工作在16位方式
- TH1 =0;
- TL1= 0;
- ET1 = 1;
- }
- //啟動(dòng)模塊,Trig管腳20us正脈沖
- void Start_Module() //啟動(dòng)模塊
- {
- Trig=1; //啟動(dòng)一次模塊
- delay_20us();
- Trig=0;
- }
- /********************************************************************
- * 名稱 : Main()
- * 功能 : 主函數(shù)
- ***********************************************************************/
- 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;
- //以下為一次檢測(cè)過(guò)程:先發(fā)出Trig電平,打開(kāi)外部中斷,清零T1,
- //最后在外部中斷下降沿觸發(fā)時(shí)取出T1當(dāng)前值,計(jì)算出Trig脈沖寬度。
- while (Echo == 1) ;
- Start_Module();
- while(Echo==0) ;//等待Echo回波引腳變高電平
- FlagSucceed = 0;
- EX0=1;
- TH1= 0;
- TL1= 0;
- TF1= 0;
- TR1=1; //啟動(dòng)定時(shí)器1開(kāi)始計(jì)數(shù)
- EA = 1;
- while (TH1<83) ; //盲區(qū)
- TR1 = 0 ; //關(guān)閉定時(shí)器1
- EX0 = 0; //關(guān)閉外部中斷
- if(FlagSucceed==1) //一次測(cè)試成功,則計(jì)算距離,單位為厘米
- {
- distance = time * 1.085 ; //計(jì)算得到脈沖時(shí)間(以微秒為單位)
- //將微秒時(shí)間轉(zhuǎn)變成厘米距離的算法: Y米=(X秒*344)/2
- // X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
- distance /=58;
- //如果距離小于20cm,則聲光報(bào)警
- 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,"教師電子設(shè)計(jì)競(jìng)賽");
- delayms(2000);
- clrram ();
- EA = 0;
- INT0_Init();
- Timer1_Init(); //定時(shí)器1初始化
- Data_Init();
- EA = 1;
- for(i=0;i<8;i++)
- cn_display(0,i,i,"同位伸縮控制系統(tǒng)");
- for(i=0;i<8;i++)
- cn_display(1,i,i," A狀態(tài): ");
- 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();
- }
- }
復(fù)制代碼
|
評(píng)分
-
查看全部評(píng)分
|