STC15W401AS使用CCP1捕捉的高电平不对,求帮忙

[复制链接]
994|1
 楼主| yueguang3048 发表于 2019-12-27 15:25 | 显示全部楼层 |阅读模式
本帖最后由 yueguang3048 于 2019-12-27 15:48 编辑
  1. -------------刚开始玩单片机代码,拿STC官方的代码修改的:--------------
软PWM,1KHz 占空比1%,输入到CCP1中,取高电平的时间,发现打印出来的一直是300uS,正常结果应该是500uS,求高手帮助,谢谢
  1. void GPIO_Init()
  2. {
  3.     P0M0 = 0x00;P0M1 = 0x00;
  4.     P1M0 = 0x00;P1M1 = 0x00;
  5.     P2M0 = 0x00;P2M1 = 0x00;
  6.     P3M0 = 0x00;P3M1 = 0x00;
  7.     P4M0 = 0x00;P4M1 = 0x00;
  8.     P5M0 = 0x00;P5M1 = 0x00;
  9.     P6M0 = 0x00;P6M1 = 0x00;
  10.     P7M0 = 0x00;P7M1 = 0x00;
  11.          
  12.     ACC = P_SW1;
  13.     ACC &= ~(CCP_S0 | CCP_S1);      //CCP_S0=0 CCP_S1=0
  14.     P_SW1 = ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
  15. }
  16. void Timer0Init(void)                //@24.000MHz定时器0//24US
  17. {
  18.         AUXR |= 0x80;                //定时器时钟1T模式
  19.         TMOD &= 0xF0;                //设置定时器0为模式0(16位自动重装载)
  20.         TL0 = (65536-LOWDUTY);          //初始化定时器初值和重装值
  21.         TH0 = (65536-LOWDUTY) >> 8;

  22.         flag = 0;                       //初始化标志位
  23.         TR0 = 1;                        //定时器0开始计时
  24.         ET0 = 1;                        //使能定时器0中断
  25.         TR0 = 1;                        //定时器0开始计时
  26.         PWM=1;
  27. }
  28. void UartInit(void)                //115200bps@24.000MHz定时器2
  29. {
  30.         SCON = 0x50;                //8位数据,可变波特率
  31.         AUXR |= 0x01;                //串口1选择定时器2为波特率发生器
  32.         AUXR |= 0x04;                //定时器2时钟为Fosc,即1T
  33.         T2L = (65536 - (FOSC/4/BAUD));                //设定定时初值
  34.         T2H = (65536 - (FOSC/4/BAUD))>>8;;
  35.         AUXR |= 0x10;                //启动定时器2
  36.         ACC = P_SW1;
  37.         ACC &= ~(S1_S0 | S1_S1);    //S1_S0=0 S1_S1=0
  38.         P_SW1 = ACC;                //(P3.0/RxD, P3.1/TxD)
  39. //        ES = 1;                     //使能串口1中断
  40. }
  1. void CCP1_Init()
  2. {
  3.     CCON = 0;                       //初始化PCA控制寄存器//PCA定时器停止//清除CF标志//清除模块中断标志
  4.     CL = 0;                         //复位PCA寄存器
  5.     CH = 0;
  6.     CCAP1L = 0;                                                                                        //捕获通道0
  7.     CCAP1H = 0;
  8.         
  9.     CMOD = 0x09;                    //设置PCA时钟源为系统时钟24MHz,1分频,且使能PCA计时溢出中断
  10.     CCAPM1 = 0x21;                  //PCA模块0为16位捕获模式(上升沿捕获,可测从高电平开始的整个周期),且产生捕获中断
  11. //  CCAPM1 = 0x11;                  //PCA模块0为16位捕获模式(下降沿捕获,可测从低电平开始的整个周期),且产生捕获中断
  12. //  CCAPM1 = 0x31;                  //PCA模块0为16位捕获模式(上升沿/下降沿捕获,可测高电平或者低电平宽度),且产生捕获中断                    
  13.     CR = 0;                         //关闭PCA定时器
  14. }
  1. void main()
  2. {
  3.         Rising_flag=0;
  4.         cnt = 0;
  5.         count1 = 0;
  6.         GPIO_Init();
  7.         Timer0Init();
  8.         UartInit();
  9.         CCP1_Init();               
  10.         EA = 1;
  11.         SendString("Uart Test !\r\n");
  12.         while (1)
  13.         {                              
  14.                         length = count1/24;   //计算为us  1分频
  15.                         count1 = 0;
  16.                         CL = 0;
  17.                         CH = 0;
  18.                         cnt = 0;
  19.         
  20.                         SendData(length%1000000000/100000000+0x30);
  21.                         SendData(length%100000000/10000000+0x30);
  22.                         SendData(length%10000000/1000000+0x30);
  23.                         SendData(length%1000000/100000+0x30);
  24.                         SendData(length%100000/10000+0x30);
  25.                         SendData(length%10000/1000+0x30);
  26.                         SendData(length%1000/100+0x30);
  27.                         SendData(length%100/10+0x30);
  28.                         SendData(length%10+0x30);
  29.                         SendString("uS\r\n");
  30.                         Delay500ms();
  31.         }
  32.                
  33. }
  34. void PCA_isr() interrupt 7
  35. {
  36.     if (CCF1)
  37.     {               
  38.         CCF1 = 0;                                 //PCA模块的中断标志位不会由硬件自动清除,需要软件清除
  39.          if (CF && ((CCAP1H & 0x80) == 0))//捕获到有效脉冲信号的同时,发生了溢出中断的问题
  40.           {
  41.                CF = 0;
  42.                 cnt++;
  43.          }
  44.          if(Rising_flag == 0)                                                        //捕获到上升沿,开定时器,准备捕获下降沿
  45.         {
  46.            CR = 1;                         //PCA定时器开始工作
  47.            CCAPM1 = 0x11;                  //PCA模块0为16位捕获模式(下降沿捕获),且产生捕获中断               
  48.            Rising_flag = 1;        
  49.          }
  50.          if(Rising_flag == 1)                                                         //捕获到下降沿,读取定时器
  51.           {
  52.             CR = 0;                 
  53.              ((BYTE *)&count1)[3] = CCAP1L;   //保存本次的捕获值
  54.              ((BYTE *)&count1)[2] = CCAP1H;
  55.              ((BYTE *)&count1)[1] = cnt;
  56.              ((BYTE *)&count1)[0] = 0;                              
  57.             CCAP1H = 0;
  58.             CCAP1L = 0;
  59.             CCAPM1 = 0x21;                  //PCA模块0为16位捕获模式(上降沿捕获),且产生捕获中断
  60.             Rising_flag = 0;                           
  61.            }
  62.      }
  63.     if (CF)
  64.     {
  65.         CF = 0;
  66.          CL = 0;                         //复位PCA寄存器
  67.          CH = 0;
  68.         cnt++;                      //PCA计时溢出次数+1
  69.     }
  70. }

fenghui198 发表于 2020-2-22 19:17 | 显示全部楼层
谢谢分享~~~~~~~~~~~~~~~~~~~~
个人签名:海纳百川,有容乃大 壁立千仞,无欲则刚

11

主题

1110

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部