求大神帮忙改程序!
时间: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积分