MSP430实现精确延时20us

#defineCPU_F((double)8000000)#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/... #define CPU_F ((double)8000000)
#define delay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms_(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))

delay_us(20);
跪求大神解答,超声波模块需要20us的延时。
展开
 我来答
军林天下hjl
2014-04-07
知道答主
回答量:13
采纳率:0%
帮助的人:19.3万
展开全部
/*
* 超声波HC-SR04程序,p1.1 echo p1.2=trig 测得距离显示在12864上,单位为mm
* main.c
*/
#include"msp430f169.h"

#define uchar unsigned char
#define uint unsigned int

#define RISE 1
#define FALL 0

unsigned int TA_Overflow_Cnt;//TA溢出次数存放变量
unsigned long int Period;//脉宽存放结果变量
unsigned long int S;
unsigned int distance;
unsigned int RiseCapVal;//上升沿时刻捕获值存放变量
unsigned char Edge=1;//当前触发沿
unsigned char disbuff[4]="0.00";

//long unsigned int distance;

unsigned char a[]="远上寒山石径斜,";
unsigned char b[]="白云深处有人家。";
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))

#define LCD_RS_1 P6OUT|=BIT3
#define LCD_RS_0 P6OUT&=~BIT3
#define LCD_RW_1 P6OUT|=BIT4
#define LCD_RW_0 P6OUT&=~BIT4
#define LCD_E_1 P6OUT|=BIT5
#define LCD_E_0 P6OUT&=~BIT5
#define LCD_PSB_1 P6OUT|=BIT6

/*******************************************************************/
/* */
/*检查LCD忙状态 */
/*lcd_busy为1时,忙,等待。lcd-busy为0时,闲,可写指令与数据。 */
/* */
/*******************************************************************/
uchar lcd_busy()
{
uchar result;
P2DIR=0;
LCD_RS_0;
LCD_RW_1;
LCD_E_1;
if(P2IN&BIT7) result=1;
else result =0;
LCD_E_0;
return(result);

}
/*******************************************************************/
/* */
/*写指令数据到LCD */
/*RS=L,RW=L,E=高脉冲,D0-D7=指令码。 */
/* */
/*******************************************************************/
void write_com(uchar com)
{
while(lcd_busy());
P2DIR=0XFF;
LCD_RS_0;
LCD_RW_0;
LCD_E_0;
P2OUT=com;
// delay_ms(5);
LCD_E_1;
// delay_ms(5);
LCD_E_0;
}
/*******************************************************************/
/*写显示数据到LCD */
/*RS=H,RW=L,E=高脉冲,D0-D7=数据。 */
/*******************************************************************/
void write_data(uchar d)
{
while(lcd_busy());
P2DIR=0XFF;
LCD_RS_1;
LCD_RW_0;
LCD_E_0;
P2OUT=d;
// delay_ms(5);
LCD_E_1;
// delay_ms(5);
LCD_E_0;

}
/*********************************************************/
/* 设定显示位置 */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==1)
{X=0x80;}
else if (X==2)
{X=0x90;}
else if (X==3)
{X=0x88;}
else if (X==4)
{X=0x98;}
pos = X+Y ;

write_com(pos); //显示地址
}

void lcdinit()//液晶初始化
{
P6DIR|=BIT3+BIT4+BIT5+BIT6;
//P2DIR=0XFF;
LCD_PSB_1;//并行方式选择
write_com(0x34);//扩充指令操作
delay_ms(5);
write_com(0x30);//基本指令操作
delay_ms(5);
write_com(0x0c);//显示打开,关光标
delay_ms(5);
write_com(0x01);//清除lcd内容
delay_ms(5);

}

// 选择系统主时钟为8MKz
void initsys()
{
unsigned int iq0;
BCSCTL1&=~XT2OFF;//打开XT2振荡器 XT2OFF=0x80
do
{
IFG1&=~OFIFG;//清除振荡器失效标志
for(iq0=0xff;iq0>0;iq0--);//延时,等待XT2起振
}
while((IFG1&OFIFG)!=0);//判断XT2是否起振
BCSCTL2|=SELM_2+SELS;//选择MCLK,SMCLK为XT2
_EINT();
}
/*******************************************
函数名称:Delay_1ms
功 能:延时约1ms的时间
参 数:无
返回值 :无
********************************************/
void Delay_1ms(void)
{
unsigned char i;

for(i = 150;i > 0;i--) _NOP();
}
/*******************************************
函数名称:Delay_Nms
功 能:延时N个1ms的时间
参 数:n--延时长度
返回值 :无
********************************************/
void Delay_Nms(unsigned int n)
{
unsigned int i;

for(i = n;i > 0;i--) Delay_1ms();
}
//初始化定时器A函数
void init_timerA()
{
TACTL |= TASSEL_2+MC_2+ ID_3;//SMCLK,连续计数,中断允许,计数器清零
TACCTL0 |= CAP+CM_1+CCIS_0+SCS+CCIE;//捕获模式,上升沿捕获,CCI1A输入,同步捕获,中断允许
}
//初始化端口函数
void init_IO()
{
P1DIR |= BIT2;//P1.2输出 TRIG
P1DIR &=~ BIT1;//P1.1输入 ECHO
P1SEL = BIT1;//P1.1第二功能,捕获输入

P1OUT &=~BIT2;
Delay_Nms(1000);

}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD; //关看门狗
init_IO();
init_timerA();
int i;
initsys();
lcdinit();

delay_ms(15);
write_com(0x80);
for(i=0;i<20;i++)
{
write_data(a[i]);
}
write_com(0x90);
for(i=0;i<20;i++)
{
write_data(b[i]);
}
TACCTL0 |= CM_1 + SCS + CCIS_0 + CAP + CCIE;//改为上升沿捕获

while(1)
{
P1OUT |= BIT2;
Delay_Nms(10);
P1OUT &=~BIT2;
Delay_Nms(80);
write_com(0x88);
write_data((S/10000)%10+0x30);
write_data((S/1000)%10+0x30);
write_data((S/100)%10+0x30);
write_data((S/10)%10+0x30);
write_data(S%10+0x30);

}
}

//定时器A服务程序
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
switch(TAIV)
{
case 0: if(Edge==RISE)
{
RiseCapVal = TACCR0;
TACCTL0 |= CAP+CM_2+CCIS_0+SCS+CCIE;//改为下降沿捕获
//TACCTL1 |= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = FALL;//下降沿捕获标志
}
else
{

_DINT();

Period = TACCR0-RiseCapVal;
S=(Period*17)/100;
TACCR0 = 0;
TACCTL0|= CAP+CM_1+CCIS_0+SCS+CCIE;//改为上升沿捕获
Edge = RISE;//上升沿捕获标志
_EINT();
}
break;
case 10: TA_Overflow_Cnt++;_EINT();
break;
}

}
ZESTRON
2024-09-04 广告
电子失效分析是指对电子元件或系统进行系统调查,以确定失效原因。通过显微镜、光谱学和电气测试等技术,分析人员可以查明导致故障的缺陷或问题。此过程包括检查物理损坏、分析电气特性和进行环境测试以确定根本原因。电子故障分析在半导体制造、汽车电子和消... 点击进入详情页
本回答由ZESTRON提供
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式