完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
#include "ML51.h"
/* if define tiMER0_FSYS_DIV12, timer = (0x1FFF-0x1000)*12/24MHz = 4.08ms */ /* if define TIMER0_FSYS, timer = (0x1FFF-0x0010)/24MHz = 340us */ #define TH0_INIT 0x10 #define TL0_INIT 0x00 #define pwm_num 1000 sbit LED = P1^4; /************************************************************************************************************ * TIMER 0 interrupt subroutine ************************************************************************************************************/ void Timer0_ISR (void) interrupt 1 //interrupt address is 0x000B { static unsigned char counter = 0; _push_(SFRS); TH0 = TH0_INIT; TL0 = TL0_INIT; TF0 = 0 ; P32 = ~P32; // GPIO toggle when interrupt counter++; if(counter==1500) counter=0; LED = (counter<=pwm_num)?0:1; _pop_(SFRS); } /************************************************************************************************************ * Main function ************************************************************************************************************/ void main (void) { /* As defaut all multi function define as GPIO */ ALL_GPIO_QUASI_MODE; MFP_P32_GPIO; P32_PUSHPULL_MODE; MFP_P14_GPIO; P14_PUSHPULL_MODE; ENABLE_TIMER1_MODE0; //Timer 0 mode configuration TIMER0_FSYS_DIV12; TH0 = TH0_INIT; TL0 = TL0_INIT; ENABLE_TIMER0_INTERRUPT; //enable Timer0 interrupt ENABLE_GLOBAL_INTERRUPT; //enable interrupts set_TCON_TR0; //Timer0 run while(1); } 现在遇到什么问题呢?说一下看看。 |
|
相关推荐
1个回答
|
|
主函数 ***********************************************************************************************/void main(void){ unsigned int i; P12_QUASI_MODE; //将P1.2声明为准双向口 P12_PUSHPULL_MODE;//将P1.2声明为推挤输出模式 PWM0_P12_OUTPUT_ENABLE;//开启PWM0将其输出至P1.2 LED = 1; //先关闭LED P12 = 0; //将P1.2输出低电平 TMOD = 0x01; //设定Timer0为模式1 TH0 = TH0_INIT; //设定Timer0的重载值为:0x100 TL0 = TL0_INIT; //设定Timer0的初值为0 TR0 = 1; //开启Timer0 PWM0_CLOCK_DIV_1; //设定PWM时钟分频数为1 PWM0_MODE3_OUTPUT; //选取PWM模式3 PWM0_DATA = pwm_num; //设定PWM的周期为pwm_num while(1){ if(TF0){ //如果Timer0计数溢出 TF0 = 0; //清除TF0标志位 P12 ^= 1; //P1.2输出反转信号 } } }
该代码的主要逻辑是使用 Timer0 产生周期为 PWM_NUM 的 PWM 波,其中 PWM0 输出到 P1.2 管脚,通过改变 P1.2 输出电平来实现 PWM 的产生。每当 Timer0 计数完成后,通过 P12 引脚的翻转来改变 P1.2 管脚的输出电平,从而实现 PWM 的输出。在 main 函数中,通过无限循环来等待 Timer0 计数完成的中断,并进行相应的处理,实现 PWM 输出的连续周期性。整体逻辑是正确的,但是该代码存在一些问题: 1. 定时器初值为 TL0_INIT,但是 TL0_INIT 被设定为了 0x00,这使得 Timer0 计数初始值为 0,极易导致紊乱。建议将 TL0_INIT 设定为一个不为 0 的值。 2. 在 main 函数中,除了无限循环以外,没有其他的控制语句。这意味着程序不会有任何的结束和退出状态,而是一直处于 while(1) 循环中,这不利于程序的执行和调试。建议加入适当的结束语句,以便更好地控制程序的执行过程。 3. 在 main 函数中,当 Timer0 计数完成时,P12 被翻转,但是没有针对 PWM 进行相应的处理。想要产生周期为 PWM_NUM 的 PWM 波,需要在每个计数周期结束时,调整 PWM0_DATA 的值,以达到所需的占空比。因此,在 Timer0 中断处理函数中,需要加入相应的 PWM 调整操作。 |
|
|
|
只有小组成员才能发言,加入小组>>
800 浏览 0 评论
1156 浏览 1 评论
2531 浏览 5 评论
2863 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2714 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1092浏览 3评论
197浏览 2评论
463浏览 2评论
376浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
458浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 07:22 , Processed in 1.074709 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号