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的延时。 展开
#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的延时。 展开
展开全部
/*
* 超声波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;
}
}
* 超声波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;
}
}
Storm代理
2023-07-25 广告
2023-07-25 广告
StormProxies是一家可靠的代理服务提供商,提供原生IP(住宅原生IP)和高匿名代理服务。以下是关于StormProxies的原生IP服务的一些信息:1. 住宅原生IP:StormProxies提供的住宅原生IP是指从真实的家庭或企...
点击进入详情页
本回答由Storm代理提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询