基于PIC16F877A的简易数字频率计的设计

发布者:alpha11最新更新时间:2010-12-30 关键字:简易数字频率计  测量 手机看文章 扫描二维码
随时随地手机看文章

//本程序利用CCP1模块实现一个“简易数字频率计”的功能
  #include 
  #include 
  #include 
  const  char table[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0xFF};
  //不带小数点的显示段码表
  const  char table0[11]={0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10,0xFF};
  //带小数点的显示段码表
  bank3 int cp1z[11];   //定义一个数组,用于存放各次的捕捉值
  union cp1
  {int  y1;
  unsigned  char cp1e[2];
  }cp1u;       //定义一个共用体
  unsigned char COUNTW,COUNT; //测量脉冲个数寄存器
  unsigned char COUNTER,data,k;
  unsigned char FLAG @ 0XEF;
  #define FLAGIT(adr,bit)  ((unsigned)(&adr)*8+(bit)) //绝对寻址位操作指令
  static bit FLAG1  @ FLAGIT(FLAG,0);
  static bit FLAG2  @ FLAGIT(FLAG,1);
  static bit FLAG3  @ FLAGIT(FLAG,2);
  unsigned char s[4];    //定义一个显示缓冲数组
  int  T5 ,uo;
  double RE5;
  double puad5;
  //spi方式显示初始化子程序
  void SPIINIT()
  {
  PIR1=0;
  SSPCON=0x30;
  SSPSTAT=0xC0;
  //设置SPI的控制方式,允许SSP方式,并且时钟下降沿发送,与"74HC595,当其
  //SCLk从低到高跳变时,串行输入寄存器"的特点相对应
  TRISC=0xD7;    //SDO引脚为输出,SCK引脚为输出
  TRISA5=0;     //RA5引脚设置为输出,以输出显示锁存信号
  FLAG1=0 ;
  FLAG2=0 ;
  FLAG3=0 ;
  COUNTER=0X01;
  }
  //CCP模块工作于捕捉方式初始化子程序
  void ccpint( )
  {
  CCP1CON=0X05;    //首先设置CCP1捕捉每个脉冲的上升沿
  T1CON=0X00;    //关闭TMR1震荡器
  PEIE=1;      //外围中断允许(此时总中断关闭)
  CCP1IE=1;     //允许CCP1中断
  TRISC2=1;     //设置RC2为输入
  }
  //系统其它部分初始化子程序
  void initial( )
  {
  COUNT=0X0B;    //为保证测试精度,测试5个脉冲的参数后
  //求平均值,每个脉冲都要捕捉其上升、下降沿,
  //故需要有11次中断
  TRISB1=0;
  TRISB2=0;
  TRISB4=1;
  TRISB5=1;     //设置与键盘有关的各口的输入、输出方式
  RB1=0;
  RB2=0;      //建立键盘扫描的初始条件
  }
  //SPI传送数据子程序
  void    SPILED(data)
  {
  SSPBUF=data;    //启动发送
  do {
  ;
  }while(SSPIF==0);
  SSPIF=0;
  }
  //显示子程序,显示4位数

  void display( )
  {
  RA5=0;      //准备锁存
  for(COUNTW=0;COUNTW<4;COUNTW++){
  data=s[COUNTW];
  data=data&0x0F;
  if(COUNTW==k) data=table0[data];//第二位需要显示小数点
  else data=table[data];
  SPILED(data);   //发送显示段码
  }
  for(COUNTW=0;COUNTW<4;COUNTW++){
  data=0xFF;
  SPILED(data);   //连续发送4个DARK,使显示好看一些
  }
  RA5=1;      //最后给一个锁存信号,代表显示任务完成
  }
  //键盘扫描子程序
  void keyscan( )
  {
  if((RB4==0)||(RB5==0)) FLAG1=1 ;//若有键按下,则建立标志FLAG1
  else FLAG1=0 ;    //若无键按下,则清除标志FLAG1
  }
  //键服务子程序
  void  keyserve( )
  {
  PORTB=0XFD ;
  if(RB5==0) data=0X01;
  if(RB4==0) data=0X03;
  PORTB=0XFB;
  if(RB5==0) data=0X02;
  if(RB4==0) data=0X04;  //以上确定是哪个键按下
  PORTB=0X00;    //恢复PORTB的值
  if(data==0x01) {
  COUNTER=COUNTER+1; //若按下S9键,则COUNTER加1
  if(COUNTER>4) COUNTER=0x01;//若COUNTER超过4,则又从1计起
  }
  if(data==0x02) {
  COUNTER=COUNTER-1; //若按下S11键,则COUNTER减1
  if(COUNTER<1) COUNTER=0x04;//若COUNTER小于1,则又循环从4计起
  }
  if(data==0x03) FLAG2=1 ;  //若按下S10键,则建立标志FLAG2
  if(data==0x04) FLAG2=0 ;  //若按下S12键,则清除标志FLAG2
  }
  //中断服务程序
  void  interrupt cp1int(void)
  {
  CCP1IF=0;     //清除中断标志
  cp1u.cp1e[0]=CCPR1L;
  cp1u.cp1e[1]=CCPR1H;
  cp1z[data]=cp1u.y1;   //存储1次捕捉值
  CCP1CON=CCP1CON^0X01; //把CCP1模块改变成捕捉相反的脉冲沿
  data++;
  COUNT--;
  }
  //周期处理子程序
  void   PERIOD( )
  {
  T5=cp1z[10]-cp1z[0];   //求得5个周期的值
  RE5=(double)T5;    //强制转换成双精度数
  RE5=RE5/5;     //求得平均周期,单位为μs
  }
  //频率处理子程序
  void   FREQUENCY( )
  {
  PERIOD( );     //先求周期
  RE5=1000000/RE5;   //周期值求倒数,再乘以1 000 000,得频率,
  //单位为HZ
  }
  //脉宽处理子程序
  void  PULSE( )
  {
  int pu;
  for(data=0,puad5=0;data<=9;data++) {
  pu=cp1z[data+1]-cp1z[data];
  puad5=(double)pu+puad5;
  data=data+2;
  }       //求得5个脉宽的和值
  RE5=puad5/5;    //求得平均脉宽
  }
  //占空比处理子程序
  void  OCCUPATIONAL( )
  {
  PULSE( );     //先求脉宽
  puad5=RE5;     //暂存脉宽值
  PERIOD();     //再求周期
  RE5=puad5/RE5;    //求得占空比
  }
  //主程序
  main( )
  {
  SPIINIT( );     //SPI方式显示初始化

  while(1) {
  ccpint();     //CCP模块工作于捕捉方式初始化
  initial();     //系统其它部分初始化
  if(FLAG2==0) {
  s[0]=COUNTER;  //第一个存储COUNTER的值
  s[1]=0X0A;
  s[2]=0X0A;
  s[3]=0X0A;   //后面的LED将显示"DARK"
  }
  display( );    //调用显示子程序
  keyscan();    //键盘扫描
  data=0x00;    //存储数组指针赋初值
  TMR1H=0;
  TMR1L=0;    //定时器1清0
  CCP1IF=0;    //清除CCP1的中断标志,以免中断一打开就进入
  //中断
  ei( );     //中断允许
  TMR1ON=1;    //定时器1开
  while(1){
  if(COUNT==0)break;
  }      //等待中断次数结束
  di();     //禁止中断
  TMR1ON=0;    //关闭定时器
  keyscan();    //键盘扫描
  if(FLAG1==1) keyserve() ; //若确实有键按下,则调用键服务程序
  if(FLAG2==0) continue; //如果没有按下确定键,则终止此次循环,
  //继续进行测量
  //如果按下了确定键,则进行下面的数值转换和显示工作
  if(COUNTER==0x01) FREQUENCY(); //COUNTER=1,则需要进行频率处理
  if(COUNTER==0x02) PERIOD();   //COUNTER=2,则需要进行周期处理
  if(COUNTER==0x03) OCCUPATIONAL();//COUNTER=3,则需要进行占空比处理
  if(COUNTER==0x04) PULSE();   //COUNTER=4,则需要进行脉宽处理
  k=5;
  if(RE5<1){
  RE5=RE5*1000;   //若RE5<1,则乘以1 000,保证小数点的精度
  k=0x00;
  }
  else if(RE5<10){
  RE5=RE5*1000;   //若RE5<10,则乘以1 000,保证小数点的精度
  k=0x00;
  }
  else if(RE5<100){
  RE5=RE5*100;   //若RE5<100,则乘以100,保证小数点的精度
  k=0x01;
  }
  else if(RE5<1000){
  RE5=RE5*10;   //若RE5<1000,则乘以10,保证小数点的精度
  k=0x02;
  }
  else RE5=RE5 ;
  uo=(int)RE5;
  sprintf(s,"%4d",uo);  //把需要显示的数据转换成4位ASII码,且放入数
  //组S中
  display();
  }
  }

关键字:简易数字频率计  测量 引用地址:基于PIC16F877A的简易数字频率计的设计

上一篇:PIC单片机与串行闪存的SPI接口设计
下一篇:Microchip扩展了32位PIC单片机产品线

推荐阅读最新更新时间:2024-03-16 12:31

内锥流量计在氟化氢流量测量中的改进及应用
在通常情况下,氟化氢是无色易流动的液体。其沸点为19.5℃,在常温下易挥发,它的化学性质很活泼,能与绝大多数金属、碱、氧化物以及硅酸盐反应,具有极强的腐蚀性。氟化氢广泛用于核工业、石油化工等行业,是制取氟气、无机氟化物、各种有机氟化物的主要原料。但在实际生产中,氟化氢的流量控制仍是一个难题,因为一般金属难以耐其腐蚀。在国内,氟化氢流量计的应用技术还不完善,测量精度低,寿命短。DYNZ系列内锥流量计具有压损小、精度高、重复性好等优点,对内锥流量计的进行技术改进,使其适合氟化氢的流量测量,对实际生产和完善氟化氢流量计制造技术意义重大。 1 锥流量计的原理及特点 内锥流量计与传统差压流量计的工作原理完全相同,当流体流进流量计时,被测流
[测试测量]
内锥流量计在氟化氢流量<font color='red'>测量</font>中的改进及应用
意法半导体(ST)推出业界最小的集成式6轴惯性测量元件
横跨多重电子应用领域、全球领先的半导体供应商、全球第一大MEMS制造商、世界最大的消费电子及移动应用MEMS产品供应商 及汽车应用MEMS供应商 意法半导体(STMicroelectronics,简称ST;纽约证券交易所代码:STM)推出业界最小的6轴惯性测量元件 (IMU, Inertial Measurement Unit)。新产品通过了汽车级产品质量测试,具有噪声低和高输出分辨率的特点。 ASM330LXH 微型测量元件是汽车仪表板内置车载导航系统解决方案的理想选择,因为车载导航系统需要精确度高,可靠性优的惯性传感器来提升定位和定向的精准度。新推出的传感器在全球导航卫星系统 (GNSS, Global Navigation S
[测试测量]
精确测量功率MOSFET的导通电阻
  电阻值的测量通常比较简单。但是,对于非常小阻值的测量,我们必须谨慎对待我们所做的假定。对于特定的几何形状,如电线,Kelvin方法是非常精确的。可以使用类似的方法来测量均匀样本的体电阻率和面电阻率,但是所使用的公式不同。在这些情况下,必须考虑探针间距和样本厚度。仅仅运用Kelvin法本身无法保证精度。如果布局和连接数发生变化,就很难精确地预测非均匀几何形状的电阻。   MOSFET最重要的特性之一就是漏极到源极的导通电阻(RDS(on))。在封装完成之后测量RDS(on)很简单,但是以晶圆形式测量该值更具有其优势。   晶圆级测量   为了保证Kelvin阻值测量的精度,需要考虑几项重要的因素:(1)待测器件(DUT)的几
[测试测量]
精确<font color='red'>测量</font>功率MOSFET的导通电阻
万用表测量集成电路注意事项
在测量时要注意以下几点: 1、万用表要有足够大的内阻,至少要大于被测电路电阻的10倍以上,以免造成较大的测量误差。 2、表笔或探头要采取防滑措施。因任何瞬间短路都容易损坏集成电路。可采取如下方法防止表笔滑动:取一段自行车用气门芯套在表笔尖上,并长出表笔尖约0.5毫米左右,这既能使表笔尖良好地与被测试点接触,又能有效防止打滑,即使碰上邻近点也不会短路。 3、当测得某一引脚电压与正常值不符时,应根据该引脚电压对集成电路正常工作有无重要影响以及其他引脚电压的相应变化进行分析,才能判断集成电路的好坏。 4、集成电路引脚电压会受外围影响。当外围元器件发生漏电、短路、开路或变值时,或外围电路连接的是一个阻值可变的电位器,则电位器滑动臂所处的位
[测试测量]
温度测量系统设计,基于msp430单片机
  本文介绍一种应用msp430单片机测量温度的方法,来代替传统教学中相对落后的热敏电阻结合电流表的实验方法。   1 温度测量部分   用于测量温度的温度敏感元件有很多种,比如热电偶、热敏电阻、集成温度传感器、数字温度传感器等等。本系统采用的是热敏电阻。热敏电阻由对温度非常敏感的半导体陶瓷质工作体构成。与一般常用的金属电阻相比,它有较大的电阻温度系数,可以获得较高的温度分辨率。不同材料制成的热敏电阻适用的测温范围不同,如CuO和MnO2制成的热敏电阻适用于-70~120℃,适于测量体温。温度是模拟量,要把被测的模拟量转换成数字量,以供单片机处理。为了节约成本,可以通过斜率A/D转换来实现模数转换。斜率A/D转换是利用外接电容
[单片机]
温度<font color='red'>测量</font>系统设计,基于msp430单片机
使用PWM和PAM测量电路的交流功耗
通过采样电压与电流的乘积并进行平均处理可以完成60Hz电路的平均功耗测量(相当于VRMS IRMS cos( ))。这里要用四象限乘法,因为瞬时电压和电流可能具有相反的极性。它有很多种实现方法,包括模数(A/D)转换+数字信号处理,或者使用相对昂贵的模拟乘法器芯片+模拟或数字处理。本设计实例介绍了第三种方法。这种方法使用便宜的运放和模拟开关实现脉冲宽度/脉冲幅度调制器(PWM/PAM)并将它用作四象限乘法器。这种电路经过修改可以用于许多不同的应用。 PWM/PAM乘法器的基本概念是,一个(非重叠)脉冲波形在单个周期内的平均值等于脉冲面积除以脉冲重复周期。由于每个矩形脉冲幅度正比于电压值,宽度正比于电流,矩形面积正比于电压与电流的
[测试测量]
使用PWM和PAM<font color='red'>测量</font>电路的交流功耗
超宽带通信信号解调分析--射频信号测量连载(七)
在WLAN、卫星通信、光通信领域,可能需要对非常高带宽的信号( 500MHz)进行性能测试和解调分析,这对于测量仪器的带宽和通道数要求非常高。比如在光纤骨干传输网上,已经实现了单波长100Gbps的信号传输,其采用的技术就是把2路25Gbps的信号通过QPSK的调制方式调制到激光器的一个偏振态,然后把另2路25Gbps的信号通过同样的方式调制到激光器一个偏振态上,然后把两个偏振态的信号合成在一起实现100Gbps的信号传输。而在下一代200Gbps或者400Gbps的技术研发中,可能会采用更高的波特率以及更高阶的调制如16QAM、64QAM甚至OFDM等技术,这些都对测量仪器的带宽和性能提出了非常高的要求。 如下图所示是
[测试测量]
超宽带通信信号解调分析--射频信号<font color='red'>测量</font>连载(七)
基于DS18B20的智能温度测量装置
作者Email: jsmo739@yeah.net 一、前言 温度是一种最基本的环境参数,人民的生活与环境的温度息息相关,在工业生产过程中需要实时测量温度,在农业生产中也离不开温度的测量,因此研究温度的测量方法和装置具有重要的意义。测量温度的关键是温度传感器,温度传感器的发展经历了三个发展阶段:①传统的分立式温度传感器,②模拟集成温度传感器,③智能集成温度传感器。目前,国际上新型温度传感器正从模拟式向数字式,从集成化向智能化、网络化的方向飞速发展。文章将介绍智能集成温度传感器DS18B20的结构特征及控制方法,并对以此传感器,89C2051单片机为控制器构成的温度测量装置的工作原理及程序设计作了详细的介绍。该装置适用于
[应用]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved