打印
[STC单片机]

求分析下STC12C5A60S2的PCA捕获测频率的程序!!!

[复制链接]
4901|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiaoliping1945|  楼主 | 2013-8-24 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xiaoliping1945 于 2013-8-25 11:24 编辑

请教下各位大神,为什么下面中断里的弄成左移8位就不行recevie_start =recevie_start<<8+CCAP0L ;
,而换成*256就可以,(recevie_start =recevie_start*256+CCAP0L ;
)这是什么原因啊??????
#include<STC12C5A60S2.h>
#include<intrins.h>
#include"lcd1602_595.h"
/*sfr CCAPM0 = 0xDA;
sfr CCON   = 0xD8;
sfr CMOD  = 0xD9;
sbit CCF0   = CCON^0;
sbit CR     = CCON^6;
sfr CL     = 0xE9;
sfr CH     = 0xF9;
                 */
bit   FLAG;
uint   recevie_start,recevie_end;
sbit PCA_LED=P1^0;
unsigned char   code table[]="0123456789";
unsigned char   date[]="0000";

void main()
{
  init_lcd();
  write_com(0x01);
  delayus(50);
  lcd_display(0X40,11,date) ;
  delayus(50);    //就是这个延时会影响进中断
  CCON=0X01;   //清溢出标志位,清中断标志,先不启动PCA计数器
  CL=0;
  CH=0;
  CCAP0H=0;
  CCAP0L=0;
  CMOD=0X00;
  //CCAPM0=0X11; //捕获模式,下降沿触发
  //CCAPM0=0X21; //上升沿触发
  CCAPM0=0X31; //同时为下降沿和上升沿触发
  CR=1;    //启动PCA计数器  //AUXR|=0X80;定时器0设置为1T模式
  EA=1;   //开总中断
  while(1);
}
void PCA_isr() interrupt 7  using 1
{
     CCF0=0;
// CF=0;
EA=0;
recevie_start=CCAP0H;
recevie_start =recevie_start<<8+CCAP0L ;
date[1]=table[recevie_start%1000/100];//转化为lcd要显示的字符,做测试,显示得到的时间值得后三位
date[2]=table[recevie_start%100/10];
date[3]=table[recevie_start%10];
lcd_display(0X40,11,date) ;                 / /第2行第11例开始显示  
PCA_LED=~PCA_LED;
EA=1;
}








下面是串行的1602显示没问题

#ifndef __lcd1602_595_H__
#define __lcd1602_595_H__
#define uint unsigned int
#define uchar unsigned char
sbit rs=P2^2;
//rw=0;   只往lcd写入,不读出,故rw=0;
sbit en=P2^1;
sbit sclk=P2^2;    //移位时钟
sbit ds=P2^0;    //数据线
sbit rclk=P2^1 ;    //锁存输出时钟
/*-----------函数声明------------*/
void delay(uint z);
void delayus(uint i);
void write_595(uchar date);
void write_com(uchar com) ;//写指令
void write_data(uchar date ); //写数据
void init_lcd(); //注意,里面有清屏命令
void lcd_display(uchar x,uchar y,uchar *s) ; //第X行第Y例开始显示
void delay(uint z)
{  
    uint x,y;
for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}
void delayus(uint i)
{
   while(i--);
}
void write_595(uchar date)
{
uchar i;
for(i=0;i<8;i++)
   {
   sclk=0;
   ds=date&0x80;
   delay(2);
   sclk=1;
   date<<=1;   //sclk给一个上升沿脉冲即可读走一位
  }
}
void write_com(uchar com) //写指令
{
   write_595(com);
   rs=0;
   delay(1);
   //rw=0;
   rclk=1;
   delay(1);
   rclk=0;    //令595输出,并用en输出一个高脉冲
}
void write_data(uchar date ) //写数据
{
   write_595(date);  //写入数据
   rs=1;
   delay(5);
   rclk=1;
   delayus(10);
   rclk=0;    //令595输出,并用en输出一个高脉冲
}
void init_lcd()
{   
    write_com(0x38);
delayus(50);
    write_com(0x0c);
delayus(50);
    write_com(0x06);
delayus(50);
   // write_com(0x01);
   // delayus(50);
}
void lcd_display(uchar x,uchar y,uchar *s)  //第X行第Y例开始显示
{
  init_lcd();
  write_com(0x80+x+y);
  while(*s!='\0')
     {
   write_data(*s++);
   delay(5);  
  }
}
#endif

相关帖子

沙发
gonggu8181| | 2013-9-5 18:41 | 只看该作者
加个括号试试

使用特权

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

本版积分规则

11

主题

74

帖子

3

粉丝