完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 dushen244 于 2016-5-8 11:58 编辑
为什么程序不能实时改变脉冲宽度?,仿真时只有第一次可以转换,芯片是PIC16F877a #include #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); //等待中断 } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2086 浏览 1 评论
3630 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4029 浏览 5 评论
978浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6364浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 17:59 , Processed in 0.611230 second(s), Total 79, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号