標題:
簡易同位升降系統(tǒng)的單片機源碼(用超聲波測距實現(xiàn))
[打印本頁]
作者:
初學者孟憲
時間:
2018-7-10 17:12
標題:
簡易同位升降系統(tǒng)的單片機源碼(用超聲波測距實現(xiàn))
0.png
(5.05 KB, 下載次數(shù): 46)
下載附件
2018-7-10 18:40 上傳
全部資料51hei下載地址:
程序.zip
(130.97 KB, 下載次數(shù): 8)
2018-7-10 17:12 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
Project Logs for 電鋼.zip
(5.68 KB, 下載次數(shù): 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) 單精度浮點數(shù)(32位長度) */
//typedef double F64; /* double precision floating point variable (64bits) 雙精度浮點數(shù)(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;
//函數(shù)聲明
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;
}
//數(shù)據(jù)初始化
void Data_Init()
{
Trig = 0;
distance = 0;
DisplayCount = 0;
}
//外部中斷初始化函數(shù)
void INT0_Init(void)
{
IT0 = 0; //負邊沿觸發(fā)中斷
EX0=0; //關(guān)閉外部中斷
}
//外部中斷處理用做判斷回波電平
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; //關(guān)閉外部中斷
}
/////////////初始化定時器///////////////////
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小于給的那個值時就是高電平
else
if((time1>=puk1)&&(time1<=100))pwm1=0; // 如果puk1到100的就是低電平
else
if(time1>=100)time1=0; //time大于100就清0
}
//定時器1初始化,16位計數(shù)模式,時鐘為11059200/12=921600Hz
//60ms計數(shù)為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()
* 功能 : 主函數(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;
//以下為一次檢測過程:先發(fā)出Trig電平,打開外部中斷,清零T1,
//最后在外部中斷下降沿觸發(fā)時取出T1當前值,計算出Trig脈沖寬度。
while (Echo == 1) ;
Start_Module();
while(Echo==0) ;//等待Echo回波引腳變高電平
FlagSucceed = 0;
EX0=1;
TH1= 0;
TL1= 0;
TF1= 0;
TR1=1; //啟動定時器1開始計數(shù)
EA = 1;
while (TH1<83) ; //盲區(qū)
TR1 = 0 ; //關(guān)閉定時器1
EX0 = 0; //關(guān)閉外部中斷
if(FlagSucceed==1) //一次測試成功,則計算距離,單位為厘米
{
distance = time * 1.085 ; //計算得到脈沖時間(以微秒為單位)
//將微秒時間轉(zhuǎn)變成厘米距離的算法: 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,"教師電子設(shè)計競賽");
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,"同位伸縮控制系統(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();
}
}
復制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1