专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
最近在做用msp430f149做一个频率计,不能正确显示,各位大手帮下忙
2019-07-17 15:56
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7531
19
1235
网上找的代码,经过自己修改还是不能显示频率
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
19条回答
18380593018
2019-07-19 02:49
#include <msp430x14x.h>
#include "Config.h"
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
unsigned int old_cap=0;//捕获的旧值
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{
P4SEL = 0x00;
P4DIR = 0xFF; //数据口输出模式
P5SEL = 0x00;
P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式
}
//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com; //命令写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
RS_SET;
RW_CLR;
EN_SET;
DataPort = data; //数据写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01); //清屏幕显示
delay_ms(5);
}
//***********************************************************************
// 显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
while (*s)
{
LCD_write_data( *s);
s ++;
}
}
//***********************************************************************
// 显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
LCD_write_data( data);
}
//***********************************************************************
// 显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(0x38); //显示模式设置
delay_ms(5);
LCD_write_com(0x08); //显示关闭
delay_ms(5);
LCD_write_com(0x01); //显示清屏
delay_ms(5);
LCD_write_com(0x06); //显示光标移动设置
delay_ms(5);
LCD_write_com(0x0C); //显示开及光标设置
delay_ms(5);
}
/*****系统时钟配置****/
void init_MCLK()
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz
}
/*********/
/****捕获方式设置****/
void cap_init()
{
P1SEL|=0X02;
P1DIR |= 0x08; // P1.2 and P1.3 output
CCTL0|=CM_1+SCS+CAP+CCIE;
TACTL|= TASSEL_2 + MC_2+TAIE; // SMCLK, up-down mode
_EINT();
while(1);
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
if(TACCTL0&CM1)
{P1OUT&=~0X08;
TACCTL0|=CM_1+SCS+CAP+CCIE;
}
else if(TACCTL0&CM0)
{P1OUT|=0X08;
TACCTL0=CM_2+SCS+CAP+CCIE;
}
}
/****频率计算及显示****/
void display_freq()
{
uchar lcdbuf[8];
unsigned long temp;
temp=period;
if(temp>1000)//表示频率小于1KHz
{
temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分
lcdbuf[0]=temp/100+0x30;
lcdbuf[1]=(temp%100)/10+0x30;
lcdbuf[2]=temp%10+0x30;
lcdbuf[3]='H';
lcdbuf[4]='z';
lcdbuf[5]=' ';
lcdbuf[6]=' ';
lcdbuf[7]=' ';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
LCD_write_str(5,2,&lcdbuf[2]);
else
LCD_write_str(5,2,&lcdbuf[1]);
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
else//表示频率大于1KHz
{
temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数
//1000/period再扩大10倍以显示小数
lcdbuf[0]=temp/1000+0x30;
lcdbuf[1]=(temp%1000)/100+0x30;
lcdbuf[2]=(temp%1000)%100/10+0x30;
lcdbuf[3]='.';
lcdbuf[4]=(temp%1000)%10+0x30;;
lcdbuf[5]='K';
lcdbuf[6]='H';
lcdbuf[7]='z';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
{
LCD_write_str(5,2,&lcdbuf[2]);
LCD_write_str(11,2," ");
}
else
{
LCD_write_str(5,2,&lcdbuf[1]);
LCD_write_str(12,2," ");
}
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
}
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
volatile unsigned int i;
init_MCLK();//初始化系统时钟
for (i=0; i<20000; i++); // 延时等待晶振稳定
cap_init();//捕获初始化
_EINT(); // 开总中断
LCD_init();//液晶初始化
LCD_write_str(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
display_freq();//脉宽计算及显示
}
}
加载中...
查看其它19个回答
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include "Config.h"
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
unsigned int old_cap=0;//捕获的旧值
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{
P4SEL = 0x00;
P4DIR = 0xFF; //数据口输出模式
P5SEL = 0x00;
P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式
}
//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com; //命令写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
RS_SET;
RW_CLR;
EN_SET;
DataPort = data; //数据写入端口
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01); //清屏幕显示
delay_ms(5);
}
//***********************************************************************
// 显示屏字符串写入函数
//***********************************************************************
void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
while (*s)
{
LCD_write_data( *s);
s ++;
}
}
//***********************************************************************
// 显示屏单字符写入函数
//***********************************************************************
void LCD_write_char(unsigned char x,unsigned char y,unsigned char data)
{
if (y == 0)
{
LCD_write_com(0x80 + x); //第一行显示
}
else
{
LCD_write_com(0xC0 + x); //第二行显示
}
LCD_write_data( data);
}
//***********************************************************************
// 显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(0x38); //显示模式设置
delay_ms(5);
LCD_write_com(0x08); //显示关闭
delay_ms(5);
LCD_write_com(0x01); //显示清屏
delay_ms(5);
LCD_write_com(0x06); //显示光标移动设置
delay_ms(5);
LCD_write_com(0x0C); //显示开及光标设置
delay_ms(5);
}
/*****系统时钟配置****/
void init_MCLK()
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz
}
/*********/
/****捕获方式设置****/
void cap_init()
{
P1SEL|=0X02;
P1DIR |= 0x08; // P1.2 and P1.3 output
CCTL0|=CM_1+SCS+CAP+CCIE;
TACTL|= TASSEL_2 + MC_2+TAIE; // SMCLK, up-down mode
_EINT();
while(1);
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
if(TACCTL0&CM1)
{P1OUT&=~0X08;
TACCTL0|=CM_1+SCS+CAP+CCIE;
}
else if(TACCTL0&CM0)
{P1OUT|=0X08;
TACCTL0=CM_2+SCS+CAP+CCIE;
}
}
/****频率计算及显示****/
void display_freq()
{
uchar lcdbuf[8];
unsigned long temp;
temp=period;
if(temp>1000)//表示频率小于1KHz
{
temp=1000000/temp;//定时器的计数时钟为1MHz,且以Hz为单位只显示整数部分
lcdbuf[0]=temp/100+0x30;
lcdbuf[1]=(temp%100)/10+0x30;
lcdbuf[2]=temp%10+0x30;
lcdbuf[3]='H';
lcdbuf[4]='z';
lcdbuf[5]=' ';
lcdbuf[6]=' ';
lcdbuf[7]=' ';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
LCD_write_str(5,2,&lcdbuf[2]);
else
LCD_write_str(5,2,&lcdbuf[1]);
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
else//表示频率大于1KHz
{
temp=10000/temp;//定时器的计数时钟为1MHz,以KHz为单位显示,且显示2位小数
//1000/period再扩大10倍以显示小数
lcdbuf[0]=temp/1000+0x30;
lcdbuf[1]=(temp%1000)/100+0x30;
lcdbuf[2]=(temp%1000)%100/10+0x30;
lcdbuf[3]='.';
lcdbuf[4]=(temp%1000)%10+0x30;;
lcdbuf[5]='K';
lcdbuf[6]='H';
lcdbuf[7]='z';
if(lcdbuf[0]==0x30)
{
if(lcdbuf[1]==0x30)
{
LCD_write_str(5,2,&lcdbuf[2]);
LCD_write_str(11,2," ");
}
else
{
LCD_write_str(5,2,&lcdbuf[1]);
LCD_write_str(12,2," ");
}
}
else
LCD_write_str(5,2,&lcdbuf[0]);
}
}
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
volatile unsigned int i;
init_MCLK();//初始化系统时钟
for (i=0; i<20000; i++); // 延时等待晶振稳定
cap_init();//捕获初始化
_EINT(); // 开总中断
LCD_init();//液晶初始化
LCD_write_str(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
display_freq();//脉宽计算及显示
}
}
一周热门 更多>