|
|
使用超聲波型號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; //中斷溢出標志
/********************************************************/
void main()
{
InitIRQ();
while(1)
{
StartModule();
while(!RX); //當超聲波模塊接收口輸出低電平則等待
TR0=1; //開啟計數
while(RX); //當RX為1計數并等待
TR0=0; //關閉計數
Conut(); //讀取定時器的值,計算
delayms(60);
}
}
/*********** 中斷寄存器設置初始化 ***********/
void InitIRQ(void)
{
TMOD=0x21; //T/C工作方式寄存器 0010 0001
//T0 :GATE=0; 定時模式; 工作方式1,16位T/C; 計數器溢出中斷,用于判定超出測距范圍
//T1 :GATE=0; 定時模式; 工作方式2,8位可自動重載T/C; 用于串口通信 波特率發生器
SCON=0x50; //串行口控制寄存器 0101 0000
//SM0 SM1:工作方式1;10位異步收發;波特率由定時器T1控制
//SM2: 多機通信控制位,方式0和方式1為非多機通信,設置0
//REN: 串行口接收允許位,允許串行口接收數據
//TB8:方式0和方式1中該位不用
//RB8: 方式0和方式1中該位不用
//TI: 發送中斷標志位。串行發送停止位時,由內部硬件置1,向CPU發中斷申請,必須由軟件清0
//RI: 接收中斷標志位。串行接收停止位時,由內部硬件置1,向CPU發中斷申請,必須由軟件清0
TH0=0; //T0初始化,,用于判斷測距溢出,最大65.536 ms
TL0=0;
TH1=0xFD; //T1初始化 設定波特率9600 (波特率計算參考文檔)
TL1=0xFD;
ET0=1; //T0中斷允許
TR0=1; //開啟定時器0
TR1=1; //開啟定時器1
//ES=1; //串口允許中斷
/*
可刪除,我的理解是:在系統正常運行情況下,串口發送完成則置位TI=1,
向CPU請求中斷,在我們軟件人為的直接設置TI=1的情況下可以直接向CPU
請求中斷了,已經跳過了“允許”那一步
并且最好刪除!
因為TI為中斷標志位如果程序使用了串口中斷,那么每次調用printf都
會進入中斷,因此在使用printf前要禁用中斷
*/
TI=1; /*
發送中斷標志 ☆直接使用printf必須加此語句才能發送
在KEILC中,printf在傳輸數據前需要確保前一個數據傳輸
結束,也就是TI=1,否則將處于等待狀態
因為printf函數會調用putchar函數,而putchar函數會判斷TI,
不為1則等待(相當于死機),為1則清0,發送完成后又自動置1
因此第一次運行printf時檢查TI=1則進行發送,發送完成后
發送中斷標志位TI又自動置1
*/
EA=1; //開啟總中斷
}
|
評分
-
查看全部評分
|