[vip专享]103636_基于MSP430G2553的频率计设计
- 格式:pdf
- 大小:192.46 KB
- 文档页数:8
基于MSP430G2553的数字频率计的设计
1数字式频率计一、设计概述在电子技术中,频率是最基本的参数之一,数字频率计具有精度高、使用方便、测量迅速、以及便于实现测量过程自动化等优点,是近代电子技术领域的重要工具之一,在许多领域得到广泛应用。本系统以超低功耗MSP430G2553单片机为核心处理芯片来测量信号的频率,通过定时器A采用计数法完成信号频率测量,并将被测频率值通过LCD12864液晶串行显示。频率可测量范围在1Hz到999MHz之间。如需要,范围可继续扩宽,频率计的误差在1%以内。二、原理图基于MSP430G2553的频率计设计原理图如图1所示,通过串口方式液晶显示,只需配置单片机三个口线便可以实现对频率的测量。其中待测频率信号从P1.0口输入,然后可以直接在液晶屏上显示。
三、引脚说明(一)MSP430G2553引脚功能说明由原理图可以看出,430单片机的最小系统用到1脚电源、16脚复位端、20脚接地端、配置P1.0口为待测信号输入端,P1.4为串行数据输出口,P1.5为串行时钟输出口,图
1
基于MSP430G2553频率计设计原理图
基于MSP430G2553的数字频率计的设计
2如表1所示。表1 MSP430G2553引脚功能说明引脚序号引脚名称功能说明备注1VCC电源正2P1.0频率信号输入端6P1.4串行数据输出端7P1.6串行时钟输出端16RST复位脚20GND电源地(二)LCD12864引脚功能说明LCD12864液晶显示屏用到1、2脚,电源接口线,19、20脚背光电源接口线,15脚并行/串行接口选择,5脚串行数据口,6脚串行的同步时钟。LCD12864引脚功能如表2所示。表2 LCD12864接口说明引脚序号引脚名称功能说明备注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液晶显示屏串行显示出来。开始
图3 MSP430初始化流程图结束开中断定时器A配置ANGI/O口配置关闭看门狗
进入中断count = count +65535开始
结束图4 中断函数
基于MSP430G2553的数字频率计的设计
4五、程序源代码/***************************************************************基于定时器A,采用计数法完成信号频率的测量使用片内时钟DOC,时钟频率默认值采用12864串行显示频率测量范围:1Hz -- MHz(只要需要,范围可以继续扩宽,误差在1%以内)被测信号输入管脚P1.0WR数据引脚 P1.4SCLK模拟时钟引脚 P1.5PSB串行/并行选择引脚 接GND*****************************************************************/#include#define uint unsigned int#define uchar unsigned char a#define ulint unsigned long intulint count=0;void delay(uint t);void delay1(void);void int_430(void);void sendbyte(uchar zdata);void write_com(uchar cmdcode);void write_data(uchar Dispdata);计数1s
调用数据处理函数1清定时器A计数内容
关闭定时器A清屏开始
count≥ ?610NNYYcount≥1000?调用数据处理函数3调用数据处理函数2
结束图5 频率显示函数
基于MSP430G2553的数字频率计的设计
5void lcdinit();void print_string( char *s);void display(void);/*************主函数************/void main(){ int_430(); lcdinit(); while(1) { display(); count=0; }}/*************延时函数************/void delay(uint t){ uint i,j; for(i=0;i
基于MSP430G2553的数字频率计的设计
6 if(code_seg7&serial_shift) { P1OUT|=BIT4; //SID为1 } else { P1OUT&=~BIT4; //SID为0 } P1OUT&=~BIT5; //产生时钟信号下沿 P1OUT|=BIT5; //产生时钟信号上沿 serial_shift=serial_shift>>1; //准备发送下一位数据 }}/*************写命令函数************/void write_com(uchar cmdcode){ //串口控制格式(11111AB0) //A数据方向控制,A=H时读,A=L时写 //B数据类型选择,B=H时为显示数据,B=L时为命令 sendbyte(0xf8); //MCU向LCD发命令 sendbyte(cmdcode & 0xf0); //发高四位数据(数据格式D7D6D5D4_0000) sendbyte((cmdcode << 4) & 0xf0); //发低四位数据(数据格式D3D2D1D0_0000) delay(2); //延时等待}/*************写数据函数************/void write_data(uchar Dispdata){ sendbyte(0xfa); //MCU向LCD发数据 sendbyte(Dispdata & 0xf0); //发高四位数据 sendbyte((Dispdata << 4) & 0xf0); //发低四位数据 delay(2);}/*************LCD初始化函数************/void lcdinit(){ delay(20000); //复位等待(内部自带上电复位电路),时间较长 write_com(0x30); //功能设定:基本指令集操作 delay(50); //延时等待 write_com(0x0c); //整体显示,关游标 delay(50);}/*************送字符串函数************/void print_string( char *s){ while(*s > 0) //C语言里字符串末尾自动加“\0”(ASCII码值为0) { delay(50); write_data(*s); //发送字符对应的ASCII码,12864指针可设置自动指向下一个显示地址 s++; }}/*************频率显示函数************/void display(void){ ulint a1,a2,a3,a4,a5,a6,a7,a8,a9; // 声明计数数据变量 TAR=0x0000; // 定时器 A 计数寄存器内容清零 TACTL=MC_2; // 定时器 A 工作模式选择:连续模式
基于MSP430G2553的数字频率计的设计
7 delay1(); // 产生 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); //第一行首地址0x80 print_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码,显示dat7的值 write_data(a8+0x30); //发送dat1的ASCII码,显示dat8的值 write_data(a9+0x30); //发送dat1的ASCII码,显示dat9的值 write_com(0x88); print_string("单位: "); write_data('M'); //发送H的ASCII码,显示M write_data('H'); //发送H的ASCII码,显示H write_data('z'); //发送z的ASCII码,显示z; delay(500); } else { if(count>=1000) { a1=count/100000; a2=count%100000/10000; a3=count%100000%10000/1000; a4=count%100000%10000%1000/100; a5=count%100000%10000%1000/100; a6=count%100000%10000%1000%100%10; write_com(0x03); delay(50); //延时 // 读定时器 A 计数寄存器内容 write_com(0x80); //第一行首地址0x80 print_string("德州仪器MSP430 "); //第一行显示(必须加一个空格否则不能下载) write_com(0x90); print_string("频率: "); write_com(0x94); //第二行首地址0x90,从第四个开始显示