微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 求大神帮忙改程序!

求大神帮忙改程序!

时间:10-02 整理:3721RD 点击:

为什么程序不能实时改变脉冲宽度?,仿真时只有第一次可以转换,芯片是PIC16F877a

#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
__CONFIG(0x3b31);
uint adresult;
void delay(uint x)
{
     uint a,b;
     for(a=x;a>0;a--)
        for(b=110;b>0;b--);
}
void init_pwm()
{
     TRISC2=0;   //设置RC2引脚为输出模式
     CCP1CON=0x3c;   //设置CCP1位PWM工作方式,ccp1x,ccp1y为11
     T2CKPS0=1;
     T2CKPS1=0;  //设置预分频比TMR2
     PR2=244;
     TMR2ON;             //启动TMR2
}
void init_adc1()
{
     ADCON0=0x41;   // 设置时钟频率fosc/8,选择ad通道为AN0
     ADCON1=0x80;    //选择对齐方式为右对齐,选择AN0位模拟输入,其他不变
     PIE1=0x00;      //中断使能设置
     PIE2=0x00;      
     ADIE=1;           //AD转换中断允许
     PEIE=1;           //外设中断允许
     TRISA0=1;          //设置RA0位输入方式
}
void interrupt adint()
{
     ADIF=0;          //AD转换完成标志位清零
     adresult=ADRESH;
     adresult=adresult<<8|ADRESL;    //将转换结果存入全局变量adresult中
     if(adresult<0x4a)
       {
       CCPR1L=0x4a;      //设置占空比
       }
      else if(adresult>0x7c)
       {
       CCPR1L=0x7c;      //设置占空比
       }
      else
        {
        CCPR1L=adresult;      //设置占空比
        }
     GO=1;
}
void main()
{
TRISC=0x00;   //设置RC端口为输出方式
TRISA0=1;     //设置RA0为输入
init_adc1();   //AD初始化
GIE=1;         //开总中断
GO=1;           //AD转换开始
delay(1);
init_pwm();     //调用PWM子程序
while(1);       //等待中断
}


已退回5积分

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top