给出基于MSP-EXP430G2 LaunchPad(采用MSP430G2553)的转速测量仪的ccs软件代码。具体要求: (1) 转速测量仪测量范围100-3000r/m, 测量精度为1%; (2) 可用任何小电机和传感器; (3) 能在单片机开发板的LCD上显示转速。 (4) 使用中文注释,并给出必要原理解释。
时间: 2023-12-29 14:03:12 浏览: 73
下面是基于MSP-EXP430G2 LaunchPad(采用MSP430G2553)的转速测量仪的ccs软件代码,代码中包含了中文注释和必要的原理解释:
```
#include <msp430g2553.h>
#include <stdio.h>
#define LCD_RS BIT0 //LCD_RS对应P1.0
#define LCD_EN BIT1 //LCD_EN对应P1.1
#define LCD_D4 BIT2 //LCD_D4对应P1.2
#define LCD_D5 BIT3 //LCD_D5对应P1.3
#define LCD_D6 BIT4 //LCD_D6对应P1.4
#define LCD_D7 BIT5 //LCD_D7对应P1.5
#define ECHO BIT6 //ECHO对应P2.6,超声波接收引脚
#define TRIG BIT7 //TRIG对应P2.7,超声波发送引脚
volatile unsigned int timer_overflow_count = 0; //定时器溢出计数变量,用于计算超时时间
volatile unsigned int timer_start = 0; //超声波发送时间
volatile unsigned int timer_end = 0; //超声波接收时间
volatile unsigned int speed = 0; //转速变量
void init_timer(); //初始化定时器
void init_lcd(); //初始化LCD模块
void lcd_write(unsigned char byte, unsigned char rs); //向LCD写入数据或命令
void lcd_print(char *str); //在LCD上显示字符串
void lcd_print_num(unsigned int num); //在LCD上显示整数
void main()
{
WDTCTL = WDTPW + WDTHOLD; //停用看门狗定时器
init_timer(); //初始化定时器
init_lcd(); //初始化LCD模块
while(1)
{
P2OUT |= TRIG; //发送超声波
__delay_cycles(10); //延时10us
P2OUT &= ~TRIG; //停止发送
while(!(P2IN & ECHO)); //等待超声波返回
timer_start = TAR; //记录发送时间
while(P2IN & ECHO); //等待超声波结束
timer_end = TAR; //记录接收时间
if(timer_end > timer_start) //计算超时时间
{
speed = 6000000 / ((timer_end - timer_start) * 58);
}
else
{
timer_overflow_count++;
speed = 0;
}
lcd_print("转速: ");
lcd_print_num(speed);
lcd_print("r/m");
__delay_cycles(1000000); //延时1s
}
}
void init_timer()
{
TA0CTL = TASSEL_2 + MC_2; //定时器时钟为SMCLK(1MHz),连续计数模式
TA0CCTL0 = CCIE; //启用定时器中断
TA0CCR0 = 0xFFFF; //定时器最大计数
}
void init_lcd()
{
P1DIR |= LCD_RS + LCD_EN + LCD_D4 + LCD_D5 + LCD_D6 + LCD_D7; //设置LCD引脚为输出
P1OUT &= ~(LCD_RS + LCD_EN + LCD_D4 + LCD_D5 + LCD_D6 + LCD_D7); //初始化LCD引脚
__delay_cycles(100000); //等待LCD上电
lcd_write(0x28, 0); //设置LCD显示模式:双行显示,5x8点阵字符
lcd_write(0x0C, 0); //开启LCD显示,光标不显示,不闪烁
lcd_write(0x06, 0); //设置LCD输入模式:写入后光标右移,整屏不移动
lcd_write(0x01, 0); //清屏
}
void lcd_write(unsigned char byte, unsigned char rs)
{
if(rs)
P1OUT |= LCD_RS; //设置为写入数据
else
P1OUT &= ~LCD_RS; //设置为写入命令
P1OUT &= ~LCD_EN; //拉低LCD_EN引脚
P1OUT &= ~(LCD_D4 + LCD_D5 + LCD_D6 + LCD_D7); //清空LCD数据引脚
P1OUT |= ((byte >> 4) & 0x0F) << 2; //写入高4位数据
P1OUT |= LCD_EN; //拉高LCD_EN引脚
__delay_cycles(10); //等待一段时间
P1OUT &= ~LCD_EN; //拉低LCD_EN引脚
P1OUT &= ~(LCD_D4 + LCD_D5 + LCD_D6 + LCD_D7); //清空LCD数据引脚
P1OUT |= (byte & 0x0F) << 2; //写入低4位数据
P1OUT |= LCD_EN; //拉高LCD_EN引脚
__delay_cycles(10); //等待一段时间
P1OUT &= ~LCD_EN; //拉低LCD_EN引脚
__delay_cycles(100); //等待一段时间
}
void lcd_print(char *str)
{
while(*str != '\0')
{
lcd_write(*str, 1);
str++;
}
}
void lcd_print_num(unsigned int num)
{
char buf[10];
sprintf(buf, "%u", num);
lcd_print(buf);
}
```
以上代码实现了一个基于MSP430G2553的转速测量仪,使用超声波传感器测量转速,并在LCD上显示测量结果。其中,定时器溢出计数变量`timer_overflow_count`用于计算超时时间,`timer_start`记录超声波发送时间,`timer_end`记录超声波接收时间,`speed`为转速变量,单位为r/m。`init_timer()`函数初始化定时器,`init_lcd()`函数初始化LCD模块,`lcd_write()`函数向LCD写入数据或命令,`lcd_print()`函数在LCD上显示字符串,`lcd_print_num()`函数在LCD上显示整数。
阅读全文