|
使用超聲波型號(hào)SR04/SR05
主要代碼如下:(非完整!!!)
#include <AT89X51.H>
#include <intrins.h>
#include <stdio.h>
void InitIRQ(void);
void Conut(void);
void delayms(unsigned int ms);
void StartModule();
#define uchar unsigned char
#define uint unsigned int
#define RX P1_1
#define TX P1_2
unsigned int time=0;
float Distance=0;//距離
bit flag =0; //中斷溢出標(biāo)志
/********************************************************/
void main()
{
InitIRQ();
while(1)
{
StartModule();
while(!RX); //當(dāng)超聲波模塊接收口輸出低電平則等待
TR0=1; //開啟計(jì)數(shù)
while(RX); //當(dāng)RX為1計(jì)數(shù)并等待
TR0=0; //關(guān)閉計(jì)數(shù)
Conut(); //讀取定時(shí)器的值,計(jì)算
delayms(60);
}
}
/*********** 中斷寄存器設(shè)置初始化 ***********/
void InitIRQ(void)
{
TMOD=0x21; //T/C工作方式寄存器 0010 0001
//T0 :GATE=0; 定時(shí)模式; 工作方式1,16位T/C; 計(jì)數(shù)器溢出中斷,用于判定超出測(cè)距范圍
//T1 :GATE=0; 定時(shí)模式; 工作方式2,8位可自動(dòng)重載T/C; 用于串口通信 波特率發(fā)生器
SCON=0x50; //串行口控制寄存器 0101 0000
//SM0 SM1:工作方式1;10位異步收發(fā);波特率由定時(shí)器T1控制
//SM2: 多機(jī)通信控制位,方式0和方式1為非多機(jī)通信,設(shè)置0
//REN: 串行口接收允許位,允許串行口接收數(shù)據(jù)
//TB8:方式0和方式1中該位不用
//RB8: 方式0和方式1中該位不用
//TI: 發(fā)送中斷標(biāo)志位。串行發(fā)送停止位時(shí),由內(nèi)部硬件置1,向CPU發(fā)中斷申請(qǐng),必須由軟件清0
//RI: 接收中斷標(biāo)志位。串行接收停止位時(shí),由內(nèi)部硬件置1,向CPU發(fā)中斷申請(qǐng),必須由軟件清0
TH0=0; //T0初始化,,用于判斷測(cè)距溢出,最大65.536 ms
TL0=0;
TH1=0xFD; //T1初始化 設(shè)定波特率9600 (波特率計(jì)算參考文檔)
TL1=0xFD;
ET0=1; //T0中斷允許
TR0=1; //開啟定時(shí)器0
TR1=1; //開啟定時(shí)器1
//ES=1; //串口允許中斷
/*
可刪除,我的理解是:在系統(tǒng)正常運(yùn)行情況下,串口發(fā)送完成則置位TI=1,
向CPU請(qǐng)求中斷,在我們軟件人為的直接設(shè)置TI=1的情況下可以直接向CPU
請(qǐng)求中斷了,已經(jīng)跳過了“允許”那一步
并且最好刪除!
因?yàn)門I為中斷標(biāo)志位如果程序使用了串口中斷,那么每次調(diào)用printf都
會(huì)進(jìn)入中斷,因此在使用printf前要禁用中斷
*/
TI=1; /*
發(fā)送中斷標(biāo)志 ☆直接使用printf必須加此語句才能發(fā)送
在KEILC中,printf在傳輸數(shù)據(jù)前需要確保前一個(gè)數(shù)據(jù)傳輸
結(jié)束,也就是TI=1,否則將處于等待狀態(tài)
因?yàn)閜rintf函數(shù)會(huì)調(diào)用putchar函數(shù),而putchar函數(shù)會(huì)判斷TI,
不為1則等待(相當(dāng)于死機(jī)),為1則清0,發(fā)送完成后又自動(dòng)置1
因此第一次運(yùn)行printf時(shí)檢查TI=1則進(jìn)行發(fā)送,發(fā)送完成后
發(fā)送中斷標(biāo)志位TI又自動(dòng)置1
*/
EA=1; //開啟總中斷
}
|
評(píng)分
-
查看全部評(píng)分
|