基于MSP430F5438A单片机测量频率的程序实例.docx

上传人:牧羊曲112 文档编号:3384878 上传时间:2023-03-12 格式:DOCX 页数:5 大小:37.96KB
返回 下载 相关 举报
基于MSP430F5438A单片机测量频率的程序实例.docx_第1页
第1页 / 共5页
基于MSP430F5438A单片机测量频率的程序实例.docx_第2页
第2页 / 共5页
基于MSP430F5438A单片机测量频率的程序实例.docx_第3页
第3页 / 共5页
基于MSP430F5438A单片机测量频率的程序实例.docx_第4页
第4页 / 共5页
基于MSP430F5438A单片机测量频率的程序实例.docx_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于MSP430F5438A单片机测量频率的程序实例.docx》由会员分享,可在线阅读,更多相关《基于MSP430F5438A单片机测量频率的程序实例.docx(5页珍藏版)》请在三一办公上搜索。

1、基于MSP430F5438A单片机测量频率的程序实例基于MSP430F5438A单片机测量频率的程序实例 /* 程序描述:利用Timer_A捕获脉冲宽度 利用MSP430单片机定时器A和捕获/比较功能模块结合使用,实现脉冲宽度的测量 程序用到了定时器A的CCI1A端口作捕获外部输入 的脉冲电平跳变,start,end,两个个变量来计算脉冲宽度 */ #include msp430x14x.h #include lcd12864.h uint start,end; uint width; /=用于存放脉宽= uint period; /=用于存放周期= uint frequency; /=用于存

2、放频率= uint fy7; /=用于存放频率显示数据= uint pd7; /=用于存放周期显示数据= uint wh6; /=用于存放脉宽显示数据= const unsigned char zhouqi=周期为:(us) ; const unsigned char us=us ; const unsigned char pinlv=频率为:(Hz) ; const unsigned char hz=HZ ; void process(void); /=函数声明= void delay; /=延时函数=void InitSys; /=初始化时钟= /* 主函数 */ int main( vo

3、id ) WDTCTL = WDTPW + WDTHOLD; /=关狗= InitSys; /=初始化时钟,SMCLK,MCLK均为8M= P1DIR&=BIT2; P1SEL = BIT2; /=设置P1.2端口为功能模块使用,即:做捕获源= TACTL = TASSEL_2+ID_3+TACLR+TAIE+MC1;/=定时器A时钟信号选择SMCLK,8分频,同时设置定时器A计数模式为连续增计模式= CCTL1 = CM_1+SCS+CAP+CCIE; /=输入上升沿捕获,CCI0A为捕获信号源= _EINT; /=开全局中断允许= Ini_Lcd; /=初始化液晶= Clear_GDRAM

4、; /=清屏= Disp_HZ(0x80,zhouqi,8); Disp_HZ(0x88,pinlv,8); while(1) process; Write_Cmd(0x90);/=写地址= Write_Data(0x30+pd6); Write_Data(0x30+pd5); Write_Data(0x30+pd4); Write_Data(0x30+pd3); Write_Data(0x30+pd2); Write_Data(0x30+pd1); Write_Data(0x30+pd0); Write_Cmd(0x98);/=写地址= Write_Data(0x30+fy6); Write

5、_Data(0x30+fy5); Write_Data(0x30+fy4); Write_Data(0x30+fy3); Write_Data(0x30+fy2); Write_Data(0x30+fy1); Write_Data(0x30+fy0); delay; /* 初始化时钟 */ void InitSys unsigned int i; /- 使用XT2振荡器 - BCSCTL1&=XT2OFF; /=打开XT2振荡器= do IFG1 &= OFIFG; /=清除振荡器失效标志= for (i = 0xFF; i 0; i-); /=延时,等待XT2起振= while (IFG1

6、& OFIFG) != 0); /=判断XT2是否起振= BCSCTL2 =SELM_2+SELS; /=选择MCLK、SMCLK为XT2,8M= /* 延时函数 */ void delay unsigned int i; unsigned int j=10; for(i=10;i0;i-) while(j-); /* 数据处理 */ void process(void) while(endstart); /while(endstart width = end-start; /=实际脉冲宽度的计算= period = 2* width; frequency=1000000/period; pd

7、6=period/1000000; pd5=(period-1000000*pd6)/100000; pd4=(period-1000000*pd6-100000*pd5)/10000; pd3=(period-1000000*pd6-100000*pd5-10000*pd4)/1000; pd2=(period-1000000*pd6-100000*pd5-10000*pd4-1000*pd3)/100; pd1=(period-1000000*pd6-100000*pd5-10000*pd4-1000*pd3-100*pd2)/10; pd0=period%10; fy6=frequenc

8、y/1000000; fy5=(frequency-1000000*fy6)/100000; fy4=(frequency-1000000*fy6-100000*fy5)/10000; fy3=(frequency-1000000*fy6-100000*fy5-10000*fy4)/1000; fy2=(frequency-1000000*fy6-100000*fy5-10000*fy4-1000*fy3)/100; fy1=(frequency-1000000*fy6-100000*fy5-10000*fy4-1000*fy3-100*fy2)/10; fy0=frequency%10; /

9、* 中断处理函数 */ #pragma vector=TIMERA1_VECTOR /=定时器A中断处理= _interrupt void timer_a(void) switch(TAIV) /=向量查询= case 2: /=捕获中断= if(CCTL1&CM0) /=捕获到上升沿= CCTL1=(CCTL1&(CM0)|CM1; /=更变设置为下降沿触发= start=TAR; /=记录初始时间= else if (CCTL1&CM1) /=捕获到下降沿= CCTL1=(CCTL1&(CM1)|CM0; /=更变设置为上升沿触发= end=TAR; /=用start,end,overflow计算脉冲宽度= break; default: break;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号