完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
下面是所用的程序:
#include "reg51.h" //模拟PWM输出控制灯的10个亮度级 ***it P2_0=P2^0 ; ***it P2_1=P2^1 ; unsigned int scale=0; //占空比控制变量 void main(void) // 主程序 { //unsigned int n; //延时循环变量 TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式 TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz) TL0=0x06; //写入预置值 TR0=1; //启动定时器 ET0=1; //允许定时器0中断 EA=1; //允许总中断 while(1) //无限循环,实际应用中,这里是做主要工作 { for(n=0;n<50000;n++); //每过一段时间,就自动加一个档次的亮度 scale++; //占空比控制变量scale加1 if(scale==10) scale=0; //如果scale=10,使scale为0 } } timer0() interrupt 1 //定时器0中断服务程序 { static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置 tt++; //每250微秒增加1 if(tt==10) //2.5毫秒的时钟周期 { tt=0; //使tt=0,开始新的PWM周期 P2_0=0; //使LED灯亮 } if(scale==tt) //按照当前占空比切换输出为高电平 P2_0=1; //使LED灯灭 } /*程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。*/ 我想问的是程序的运行的顺序是怎么情况,里面time0()运行时,void main()里的程序运不运行?还有就是倒数第二句if(scale=tt)没看懂,我单步运行的时候观察scale一直为0,很是抓狂.望高手指点迷津!谢谢。。。非常非常感谢!!!!! |
|
相关推荐
11个回答
|
|
{:2:}
|
|
|
|
看不懂。。。
|
|
|
|
这个程序使用定时器中断。单片机任何时候只同时执行一条指令,中断时也就是执行time0()时,main函数被中断,不执行。这个程序是:无论如何每隔2.5毫秒就点亮LED一次,而关闭LED的时间长则由scal和tt决定。因为有个for循环,而且值很大,单步运行至少需要50000*n 次才能看到scal 值增加一
|
|
|
|
|
|
|
|
嗯,谢谢。中午又琢磨了一会,算是搞明白了。不过用protues仿真不明显,在实验板上,效果挺好的。 |
|
|
|
正解! |
|
|
|
这个占空比该如何计算?
|
|
|
|
这个没算过,不过可以画出输出是的波形图,我想可以直接用示波器测出来的。这个程序的占空比是周期型变化的。 |
|
|
|
新手不要用仿真
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
690 浏览 0 评论
735 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
624 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
1099 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1092 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11795 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-26 13:53 , Processed in 0.763508 second(s), Total 61, Slave 55 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号