专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
最近在做用msp430f149做一个频率计,不能正确显示,各位大手帮下忙
2019-07-17 15:56
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
7424
19
1235
网上找的代码,经过自己修改还是不能显示频率
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
18380593018
1楼-- · 2019-07-17 16:23
精彩回答 2 元偷偷看……
加载中...
18380593018
2楼-- · 2019-07-17 19:26
上代码:
#include <msp430x14x.h>
#include "LCD1602.c"
#include "delay.c"
#include "delay.h"
unsigned int old_cap=0;//捕获的旧值
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
/*****系统时钟配置****/
void init_MCLK()
{ uchar i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz
do//do这个循环不能删除,否则下载到硬件电路上没法实现测温功能
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz
}
/*********/
/****捕获方式设置****/
void cap_init()
{
P1SEL|=BIT2; // 设置 P1.2为第二功能引脚TA1
P1DIR&=~BIT2; // 设置P1.2为输入引脚
//TACTL=TACLR; //定时器清零
TACTL = TASSEL_2 + MC_2+ID_3+TAIE; //计数时钟为1MHz,计数方式为连续计数
CCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;
// 上升沿捕获,同步,CCI0A(P1.2信号源),捕获功能,中断允许
TACCR1=0;
}
/****频率计算及显示****/
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_String(5,2,&lcdbuf[2]);
else
LCD_Write_String(5,2,&lcdbuf[1]);
}
else
LCD_Write_String(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_String(5,2,&lcdbuf[2]);
LCD_Write_String(11,2," ");
}
else
{
LCD_Write_String(5,2,&lcdbuf[1]);
LCD_Write_String(12,2," ");
}
}
else
LCD_Write_String(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_String(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
display_freq();//脉宽计算及显示
}
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
switch(TAIV)
{
case 2://比较/捕获模块1中断
period=TA_ov_num*65536+TACCR1-old_cap;
old_cap=TACCR1;
TA_ov_num=0;
break;
case 4:break;//比较/捕获模块2中断未用
case 10:TA_ov_num++;
break;
}
}
加载中...
dirtwillfly
3楼-- · 2019-07-17 22:22
估计是1602的驱动不正确,或者背光电压不合适。
建议单独调试1602的显示,调试没问题再和其他部分的程序一起调试。
加载中...
fentianyou
4楼-- · 2019-07-18 02:36
楼主上图看一下显示是结果有什么不一样的。
加载中...
fentianyou
5楼-- · 2019-07-18 05:28
18380593018 发表于 2017-5-2 15:36
上代码:
#include
#include "LCD1602.c"
LCD显示的是字符串,需要转换为字符串才能显示。
加载中...
isseed
6楼-- · 2019-07-18 08:35
精彩回答 2 元偷偷看……
加载中...
1
2
3
4
下一页
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#include <msp430x14x.h>
#include "LCD1602.c"
#include "delay.c"
#include "delay.h"
unsigned int old_cap=0;//捕获的旧值
unsigned long int period=0;//信号周期
unsigned char TA_ov_num=0;//定时器计数溢出次数
/*****系统时钟配置****/
void init_MCLK()
{ uchar i;
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
BCSCTL1&=~ XT2OFF; //msp430f149 选择XT2频率,一般为8MHz
do//do这个循环不能删除,否则下载到硬件电路上没法实现测温功能
{
IFG1 &= ~OFIFG; //清除晶振失败标志
for (i = 0xFF; i > 0; i--); //等待8MHz晶体起振
}
while ((IFG1 & OFIFG)); //晶振失效标志仍然存在?
BCSCTL2 |= (SELM_2 + DIVM_0 + SELS+DIVS_0); // SMCK=MCLK=8MHz
}
/*********/
/****捕获方式设置****/
void cap_init()
{
P1SEL|=BIT2; // 设置 P1.2为第二功能引脚TA1
P1DIR&=~BIT2; // 设置P1.2为输入引脚
//TACTL=TACLR; //定时器清零
TACTL = TASSEL_2 + MC_2+ID_3+TAIE; //计数时钟为1MHz,计数方式为连续计数
CCTL1 |= CAP+CM_1 + SCS + CCIS_0+ CCIE;
// 上升沿捕获,同步,CCI0A(P1.2信号源),捕获功能,中断允许
TACCR1=0;
}
/****频率计算及显示****/
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_String(5,2,&lcdbuf[2]);
else
LCD_Write_String(5,2,&lcdbuf[1]);
}
else
LCD_Write_String(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_String(5,2,&lcdbuf[2]);
LCD_Write_String(11,2," ");
}
else
{
LCD_Write_String(5,2,&lcdbuf[1]);
LCD_Write_String(12,2," ");
}
}
else
LCD_Write_String(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_String(0,1,"freq:");//从第一行第0列开始显示
while(1)
{
display_freq();//脉宽计算及显示
}
}
#pragma vector=TIMERA1_VECTOR//捕获中断子程序
__interrupt void TimerA1(void)
{
switch(TAIV)
{
case 2://比较/捕获模块1中断
period=TA_ov_num*65536+TACCR1-old_cap;
old_cap=TACCR1;
TA_ov_num=0;
break;
case 4:break;//比较/捕获模块2中断未用
case 10:TA_ov_num++;
break;
}
}
建议单独调试1602的显示,调试没问题再和其他部分的程序一起调试。
LCD显示的是字符串,需要转换为字符串才能显示。
一周热门 更多>