打印

基于MSP430G2553的频率计设计

[复制链接]
1220|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2015-8-3 22:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于MSP430G2553的频率计设计
***************************

file:///F:\TEMP\ksohtml\wpsDAC8.tmp.png
五、程序源代码
/***************************************************************
基于定时器A,采用计数法完成信号频率的测量
使用片内时钟DOC,时钟频率默认值
采用12864串行显示
频率测量范围:1Hz -- MHz(只要需要,范围可以继续扩宽,误差在1%以内)
被测信号输入管脚P1.0
WR数据引脚    P1.4
SCLK模拟时钟引脚   P1.5
PSB串行/并行选择引脚  接GND
*****************************************************************/
#include<msp430g2553.h>
#define uint unsigned int
#define uchar unsigned char
#define ulint unsigned long int

ulint 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);
void 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<t;i++)
    for(j=0;j<10;j++);
}
//1s延时的计数闸门
void delay1(void)
{
  unsigned long i;
  for(i=0;i<119000;i++)
  {
    _NOP();   // 该函数用来产生一个 MSP430 系统时钟周期的延时
  }
}
/*************430初始化函数************/
void int_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 时钟源选择:TACLK
  TACTL=ID_3;        // 计数时钟分频系数选择:1
  CCTL0 = CCIE;       //开中断
  CCR0 = 65535;    // 计数终值,方波频率为:1048576/65536/8/2=1HZ

  _EINT();
}
/*************数据传送函数************/
void sendbyte(uchar zdata)
{
  uchar code_seg7,serial_clk, serial_shift;
  code_seg7=zdata;
  serial_shift=0x80;
  for(serial_clk=0; serial_clk<8; serial_clk++)
  {
    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 工作模式选择:连续模式
  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,从第四个开始显示
      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_com(0x88);
      print_string("单位: ");
      write_data('K');    //发送H的ASCII码,显示K
      write_data('H');    //发送H的ASCII码,显示H
      write_data('z');     //发送z的ASCII码,显示z
      delay(500);        //较长时间延时,保证下次操作前LCD完成上述功能处于非忙状态
    }
    else
    {
      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,从第四个开始显示
      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_com(0x88);
      print_string("单位: ");
      write_data('H');    //发送H的ASCII码,显示H
      write_data('z');    //发送z的ASCII码,显示z
      delay(500);       //较长时间延时,保证下次操作前LCD完成上述功能处于非忙状态
    }
  }
}
#pragma vector = TIMER0_A0_VECTOR   //Timer_A中断向量
__interrupt void Tiemr_A(void)
{
  count +=65535;
}


基于MSP430G2553的频率计设计.zip

47.63 KB

相关帖子

沙发
dirtwillfly| | 2015-8-4 08:01 | 只看该作者
感谢分享

使用特权

评论回复
板凳
zhanglangxiao| | 2015-9-30 22:41 | 只看该作者
     TACTL=ID_3;        // 计数时钟分频系数选择:1  这个部分是不是错了
还有: CCR0 = 65535;    // 计数终值,方波频率为:1048576/65536/8/2=1HZ  这句是什么意思 注释看不懂    我借用了楼主的程序  但部分不明白 希望给予指点;

使用特权

评论回复
地板
成谶| | 2016-4-8 11:12 | 只看该作者
zhanglangxiao 发表于 2015-9-30 22:41
TACTL=ID_3;        // 计数时钟分频系数选择:1  这个部分是不是错了
还有: CCR0 = 65535;    // 计 ...

这个问题我也不知道,你解决了吗??

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

462

主题

7478

帖子

29

粉丝