基于MSP430G2553的数字频率计的设计1数字式频率计一、设计概述在电子技术中,频率是最基本的参数之一,数字频率计具有精度高、使用方便、测量迅速、以及便于实现测量过程自动化等优点,是近代电子技术领域的重要工具之一,在许多领域得到广泛应用。本系统以超低功耗MSP430G2553单片机为核心处理芯片来测量信号的频率,通过定时器A采用计数法完成信号频率测量,并将被测频率值通过LCD12864液晶串行显示。频率可测量范围在1Hz到999MHz之间。如需要,范围可继续扩宽,频率计的误差在1%以内。二、原理图基于MSP430G2553的频率计设计原理图如图1所示,通过串口方式液晶显示,只需配置单片机三个口线便可以实现对频率的测量。其中待测频率信号从P1.0口输入,然后可以直接在液晶屏上显示。三、引脚说明(一)MSP430G2553引脚功能说明由原理图可以看出,430单片机的最小系统用到1脚电源、16脚复位端、20脚接地端、配置P1.0口为待测信号输入端,P1.4为串行数据输出口,P1.5为串行时钟输出口,如表1图1基于MSP430G2553频率计设计原理图基于MSP430G2553的数字频率计的设计2所示。表1MSP430G2553引脚功能说明引脚序号引脚名称功能说明备注1VCC电源正2P1.0频率信号输入端6P1.4串行数据输出端7P1.6串行时钟输出端16RST复位脚20GND电源地(二)LCD12864引脚功能说明LCD12864液晶显示屏用到1、2脚,电源接口线,19、20脚背光电源接口线,15脚并行/串行接口选择,5脚串行数据口,6脚串行的同步时钟。LCD12864引脚功能如表2所示。表2LCD12864接口说明引脚序号引脚名称功能说明备注1VSS模块的电源地2VDD模块的电源正端4RS(CS)并行指令/数据选择信号;串行片选信号5R/W(SID)并行读写选择信号;串行的数据口6E(CLK)并行使能信号;串行的同步时钟15PSBPSB并/串行接口选择:H-并行,L-串行19LED_A背光源正极20LED_K背光源负极(0V)四、软件设计流程图系统软件设计包括初始化模块、中断模块和信号频率显示模块。(一)主函数主函数流程图如图2所示。在主程序中,主要对单片机配置进行初始化和屏幕初始化,以及频率信号数据的处理并实时显示。单片机初始化开始屏初始化显示结束图2主函数流程图基于MSP430G2553的数字频率计的设计3(二)单片机初始化函数单片机初始化函数包括对看门狗定时器模式的设置、I/O口输入/输出功能的配置。定时器A所需时钟源、分频系数的选择,并将总中断打开。函数流程图如图3所示。(三)中断函数中断函数流程图如图4所示。当定时器A溢出后就进入中断,count就加上65535。(四)频率显示函数频率显示流程图如图5所示。频率显示函数包含对定时器A相关内容的操作,将定时器A计数寄存器内容清零后,设置定时器A的工作模式,产生1s计数闸门,关闭定时器A,记下count的值即为所测得频率的大小。最后根据数据的大小,按不同的单位将数据通过12864液晶显示屏串行显示出来。开始图3MSP430初始化流程图结束开中断定时器A配置ANGI/O口配置关闭看门狗进入中断count=count+65535开始结束图4中断函数基于MSP430G2553的数字频率计的设计4五、程序源代码/***************************************************************基于定时器A,采用计数法完成信号频率的测量使用片内时钟DOC,时钟频率默认值采用12864串行显示频率测量范围:1Hz--MHz(只要需要,范围可以继续扩宽,误差在1%以内)被测信号输入管脚P1.0WR数据引脚P1.4SCLK模拟时钟引脚P1.5PSB串行/并行选择引脚接GND*****************************************************************/#includemsp430g2553.h#defineuintunsignedint#defineucharunsignedchara#defineulintunsignedlongintulintcount=0;voiddelay(uintt);voiddelay1(void);voidint_430(void);voidsendbyte(ucharzdata);voidwrite_com(ucharcmdcode);voidwrite_data(ucharDispdata);计数1s调用数据处理函数1清定时器A计数内容关闭定时器A清屏开始count≥?610NNYYcount≥1000?调用数据处理函数3调用数据处理函数2结束图5频率显示函数基于MSP430G2553的数字频率计的设计5voidlcdinit();voidprint_string(char*s);voiddisplay(void);/*************主函数************/voidmain(){int_430();lcdinit();while(1){display();count=0;}}/*************延时函数************/voiddelay(uintt){uinti,j;for(i=0;it;i++)for(j=0;j10;j++);}//1s延时的计数闸门voiddelay1(void){unsignedlongi;for(i=0;i119000;i++){_NOP();//该函数用来产生一个MSP430系统时钟周期的延时}}/*************430初始化函数************/voidint_430(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P1SEL&=~BIT4;P1DIR|=BIT4;P1OUT&=~BIT4;P1SEL&=~BIT5;P1DIR|=BIT5;P1OUT&=~BIT5;P1SEL|=BIT0;//设置P1.0为TimerA外部计数信号输入口P1DIR&=~BIT0;//设置P1.0为输入口//TimerA配置TACTL=TASSEL_0;//定时器A时钟源选择:TACLKTACTL=ID_3;//计数时钟分频系数选择:1CCTL0=CCIE;//开中断CCR0=65535;//计数终值,方波频率为:1048576/65536/8/2=1HZ_EINT();}/*************数据传送函数************/voidsendbyte(ucharzdata){ucharcode_seg7,serial_clk,serial_shift;code_seg7=zdata;serial_shift=0x80;for(serial_clk=0;serial_clk8;serial_clk++){基于MSP430G2553的数字频率计的设计6if(code_seg7&serial_shift){P1OUT|=BIT4;//SID为1}else{P1OUT&=~BIT4;//SID为0}P1OUT&=~BIT5;//产生时钟信号下沿P1OUT|=BIT5;//产生时钟信号上沿serial_shift=serial_shift1;//准备发送下一位数据}}/*************写命令函数************/voidwrite_com(ucharcmdcode){//串口控制格式(11111AB0)//A数据方向控制,A=H时读,A=L时写//B数据类型选择,B=H时为显示数据,B=L时为命令sendbyte(0xf8);//MCU向LCD发命令sendbyte(cmdcode&0xf0);//发高四位数据(数据格式D7D6D5D4_0000)sendbyte((cmdcode4)&0xf0);//发低四位数据(数据格式D3D2D1D0_0000)delay(2);//延时等待}/*************写数据函数************/voidwrite_data(ucharDispdata){sendbyte(0xfa);//MCU向LCD发数据sendbyte(Dispdata&0xf0);//发高四位数据sendbyte((Dispdata4)&0xf0);//发低四位数据delay(2);}/*************LCD初始化函数************/voidlcdinit(){delay(20000);//复位等待(内部自带上电复位电路),时间较长write_com(0x30);//功能设定:基本指令集操作delay(50);//延时等待write_com(0x0c);//整体显示,关游标delay(50);}/*************送字符串函数************/voidprint_string(char*s){while(*s0)//C语言里字符串末尾自动加“\0”(ASCII码值为0){delay(50);write_data(*s);//发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址s++;}}/*************频率显示函数************/voiddisplay(void){ulinta1,a2,a3,a4,a5,a6,a7,a8,a9;//声明计数数据变量TAR=0x0000;//定时器A计数寄存器内容清零TACTL=MC_2;//定时器A工作模式选择:连续模式基于MSP430G2553的数字频率计的设计7delay1();//产生1s计数闸门TACTL=MC_0;//定时器A工作模式选择:停止模式count+=TAR;write_com(0x01);//清屏指令if(count=1000000){a1=count/100000000;a2=count%100000000/10000000;a3=count%100000000%10000000/1000000;a4=count%100000000%10000000%1000000/100000;a5=count%100000000%10000000%1000000/100000;a6=count%100000000%10000000%1000000%100000/10000;a7=count%100000000%10000000%1000000%100000%10000/1000;a8=count%100000000%10000000%1000000%100000%10000%1000/100;a9=count%100000000%10000000%1000000%100000%10000%1000%100/10;write_com(0x03);write_com(0x80);//第一行首地址0x80print_string(德州仪器MSP430);//第一行显示(必须加一个空格否则不能下载)write_com(0x90);print_string(频率:);write_com(0x93);//第二行首地址0x90,从第四个开始显示write_data(a1+0x30);//发送dat1的ASCII码,显示dat1的值write_data(a2+0x30);//发送dat1的ASCII码,显示dat2的值write_data(a3+0x30);//发送dat1的ASCII码,显示dat3的值write_data('.');//发送.write_data(a4+0x30);//发送dat1的ASCII码,显示dat4的值write_data(a5+0x30);//发送dat1的ASCII码,显示dat5的值write_data(a6+0x30);//发送dat1的ASCII码,显示dat6的值write_data(a7+0x30);//发送dat1的ASCII码,显示da