51单片机中stm32高级定时器pwm生成pwm控制电机速度,再者是外部中断程序和stm32高级定时器pwm是一回事么?

51单片机是如何产生PWM波的。。用定时器中断如何实现_百度知道&&&&51单片机产生PWM的程序和怎样控制直流电机
51单片机产生PWM的程序和怎样控制直流电机
应用89S51单片机产生PWM波来控制直流电机实现变速控制,通过典型的C语言程序应用中断及定时器加以实现,PWM控制是练习单片机基础的绝佳方法.本资源中包括PWM的程序和怎样控制直流电机,有助于提高单片机技能,希望和大家分享.
若举报审核通过,可奖励20下载分
被举报人:
shihongxiang2007
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行& &   那么就可以编写程序,根据定的时间基准t给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了 n,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了n& 如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到想要的PWM波形。
& &   /******************************************************************************************
& &   * 文件:PWM.c
& &   * 备注:51单片机PWM完全注释          *
& &   ******************************************************************************************/
& &   #include 《STC89.H》
& &   unsigned char CYCLE;      /*PWM周期长度*/
& &   unsigned char count = 0;        /*记录中断次数*/
& &   unsigned char PWM_ON;      /*PWM高电平时间计数*/
& &   void delay()          /*延时约78ms*/
& &   unsigned char i,
& &   for(j = 100; j--)
& &   for(i = 255; i--)
& &   void main()
& &   bit F       /*变化状态标志,0:渐亮,1:渐暗*/
& &   TMOD = 0x01;           /*时间基准为1ms*/
& &   TH0 = (65536 - 100) / 256;      /*右端表达式编译后为0xFF*/
& &   TL0 = (65536 - 100) % 256;      /*同上*/
& &   IE = 0x82;       /*开定时器0中断0x82 = */
& &   TR0 = 1;          /*启动定时器0*/
& &   CYCLE = 10;           /*十级亮度,即十级PWM*/
& &   while(!Flag)          /*渐亮,每一次变化亮度增加1*/
& &   delay();          /*延时*/
& &   PWM_ON++;       /*高电平脉宽延长,即亮度增加*/
& &   if(PWM_ON == CYCLE)       /*若高电平脉宽增长到整个周期*/
& &   Flag = 1;       /*则转为渐暗*/
& &   while(Flag)       /*渐暗,每一次变化亮度减少1*/
& &   delay();       /*延时*/
& &   PWM_ON--;       /*高电平脉宽缩短,即亮度降低*/
& &   if(PWM_ON == 0)      /*若高电平脉宽缩短到0*/
& &   Flag = 0;      /*则转为渐亮*/
& &   void time0_server() interrupt 1 using 1
& &   TH0 = (65536 - 100) / 256;      /*时间基准为1ms*/
& &   TL0 = (65536 - 100) % 256;      /*即每1ms触发一次中断*/
& &   if(count == PWM_ON)      /*若中断次数达到亮度设定值*/
& &   P2 = 0xFF;        /*则熄灯*/
& &   count++;        /*每次中断记录+1*/
& &   if(count == CYCLE)      /*若中断次数达到PWM周期长度*/
& &   count = 0;       /*则清零中断记录*/
& &   if(PWM_ON != 0)       /*若此时亮度值非零*/
& &   P2 = 0;        /*则点灯*/
本网站试开通微、小企业商家广告业务;维修点推荐项目。收费实惠有效果!欢迎在QQ或邮箱联系!
试试再找找您想看的资料
资料搜索:
查看相关资料 & & &
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
copyright & &广电电器(中国梧州) -all right reserved& 若您有什么意见或建议请mail: & &
地址: 电话:(86)774-2826670&查看: 11622|回复: 46
呼吸灯 单片机 定时器 产生 PWM方波 程序【每行都有注释】
本帖最后由 o0feng0o 于
14:10 编辑
quote: 昨天晚上23点到今天凌晨1点
经过接近两个小时的折腾用定时器产生的PWM在占空比不断变化下 终于可以做出呼吸灯的效果了!
这一刻我等了多少年了 哈哈哈~
介绍:定时器0 方式一 定了10us 200调节 也就是说T=2ms
所以PWM频率应该是500Hz
记得以前写程序就卡在一个周期时间不知道怎么算& &&&
一直不确定一个周期多久 一直觉得20ms挺短的 可以作为一个周期 现在看来第一 T=20ms真的闪死了 第二 周期其实可以用频率算来着。。
由于LED是低电平触发 为了方便我思考 这里的 占空比 是指低电平占总周期的比例效果图
刚加的详细注释 恳请 会的人 仔细审查错误
及时通知我修改。 不要耽误别的人。。。。。。。
每行都有注释哦 写了我半个多小时呢。。。。。累死了。。。。。
/*********************************************************************************************
程序名:PWM呼吸灯
编写人:冯文超  @JustFeng&&o0feng0o
编写时间:日
硬件支持:使用定时器0
接口说明:P1口接LED
修改日志:  
  NO.1-日 13:48:06 添加全部注释& && && && && && && && && && && && && && && && && && && && && &
/*********************************************************************************************
说明:由于LED是低电平触发 为了方便我思考 这里的占空比是 低 电平占总周期的比例
& && && && && & PWM为200级调节 自动从0到200再到0 循环& && && && && &
/*********************************************************************************************/
#include&reg52.h&//头文件
#define uchar unsigned char//宏定义 可以写的简单点
#define uint unsigned int//宏定义
//定义变量功能在下面
uchar zhankongbi,flag,flag1;//定义变量功能在下面
/*********************************************************************************************
变量功能说明:& && &&&tt:动态计数器累加位& &取值范围:0-200
& && && && && && && && && && && & zhankongbi:占空比& && && && & 取值范围:0-200
& && && && && && && && && && && &&&flag:占空比改变标志& &&&取值说明:0不改变 1改变& && &&&
& && && && && && && && && && && & flag1:占空比改变方向标志 取值说明:0增加& &1减小& && && && && && && && && && && && && && && && &
& && && && && && && && && && &&&
/*********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调&&用:无
参&&数:无
返回值:无
结&&果:程序开始处,无限循环
/**********************************************************************************************/
void main ()//主函数
& && &&&TMOD=0x01;//1.设置定时器0工作方式1
& && &&&TH0=(6; //2.设置定时器初值0.01ms
& && &&&TL0=(6; //2.设置定时器初值0.01ms
& && &&&EA=1;//3.打开总中断
& && &&&ET0=1;//3.打开定时器0中断
& && &&&TR0=1;//4.启动定时器0
& && &&&zhankongbi=0;//初始占空比
/**********以下整段while 只是用来达到呼吸灯的效果如果要固定占空比 只需修改初始占空比**********/
& && &&&while(1)//初始化完毕 进入大循环
& && && && && & if(flag==1)//如果发现占空比改变标志
& && && && && & {
& && && && && && && && &flag=0;//清除占空比改变标志
& && && && && && && && &if(flag1==0)//如果发现占空比增加标志
& && && && && && && && &{
& && && && && && && && && && &&&zhankongbi++;//增加占空比
& && && && && && && && && && &&&if(zhankongbi==200)//如果占空比达到最大值
& && && && && && && && && && && && && & flag1=1;//占空比改变方向标志(用于后续减小占空比)
& && && && && && && && &}
& && && && && && && && &if(flag1==1)//如果发现占空比减小标志
& && && && && && && && &{
& && && && && && && && && && &&&zhankongbi--;//减小占空比
& && && && && && && && && && &&&if(zhankongbi==0)////如果占空比达到最小值
& && && && && && && && && && && && && & flag1=0;//占空比改变方向标志(用于后续增加占空比)
& && && && && && && && &}
& && && && && & }
/*********************************************************************************************
函数名:计数器0处理函数
调&&用:无
参&&数:tt,zhankongbi,flag
返回值:无
/**********************************************************************************************/
void timer0() interrupt 1 //中断服务程序
& && &&&TH0=(6;//设置定时器初值0.01ms
& && &&&TL0=(6;//设置定时器初值0.01ms& && &&&
& && &&&tt++;//动态计数器累加位
& && &&&if(tt&=zhankongbi)//没到占空比(持续低电平的比例)
& && && && && & P1=0x00;//LED全亮(低电平)
& && &&&else
& && && && && & P1=0//全灭& && &&&(高电平)
& && &&&if(tt==200)//动态计数器累加到头
& && && && && & tt=0;& && &&&//动态计数器清零
& && && && && & P1=0x00;& && &&&//开灯(低电平)& && && && && && && && &
/*************一下语句用于配合主函数while内的语句达到占空比从0-200-0的自动改变的效果**********/
& && &&&if(tt%50==0)//这个 类似延时为了 到了一定时间 打开占空比改变标准
& && && && && & flag=1;//打开占空比改变标志
本帖子中包含更多资源
才可以下载或查看,没有帐号?
支持原创代码交流
楼主的注释真详细
图文很详细,赞一下,加分!!支持原创代码分享交流!!!
<font color="#8581185 发表于
楼主的注释真详细
谢谢~把思路又理顺了一遍就顺手写出来了~~~
支持原创!向LZ学习!
现在都在玩这个啊 有没有玩 光立方啊
支持一下,加油!!
zhangjinxing 发表于
现在都在玩这个啊 有没有玩 光立方啊
去年就买了个杜洋的套件谁知道那坑爹的压箱底的LED “T”*“D” 不沾锡坑爹啊。。。。。然后8片现在才焊了2.5片。。。扔在那。。。。。。一个焊点少的点一下半秒 多的点点点点点点个4 5 6 7 8 分钟 。。。。。没那耐心。。。。焊锡膏都上了 有时候还不粘锡。。。。唉。。。。。
呵呵 淡定啊 我们是自己做的 8*8*8 的 挺帅的
o0feng0o 发表于
去年就买了个杜洋的套件谁知道那坑爹的压箱底的LED “T”*“D” 不沾锡坑爹啊。。。。。然后8片现在才焊 ...
呵呵 淡定啊 我们是自己做的 8*8*8 的 挺帅的
zhangjinxing 发表于
呵呵 淡定啊 我们是自己做的 8*8*8 的 挺帅的
LED焊的我蛋碎了。。。哪天有心情再说。。。。。一个焊点5分钟是会死人的。。
楼主很不错.顶
很漂亮啊,不错,支持一下~~~
不错啊!!!!!!!
挺好的,还可以
好厉害呵呵,。。。
嗯,真不错啊。
另外想请教楼主:
我有一个测试图,由直流电源, 信号发生器, 电磁阀, ?驱动装置组成。
它们间连线关系是:电源正极与电磁阀脚一脚相接,负极与驱动通道口上负相接,信号发生器与驱动装置上的脉冲信号口相接。电磁阀另一脚与驱动的通道口1相接
那么,这四者中那个驱动是起什么作用啊?
新手,来看看!!
leyi0624 发表于
嗯,真不错啊。
另外想请教楼主:
我有一个测试图,由直流电源, 信号发生器, 电磁阀, ?驱动装置组成。
不好意思- -我真不懂= =。。。。
o0feng0o 发表于
不好意思- -我真不懂= =。。。。
恩好,谢谢!!!!
呵呵呵,不错不错
LZ很给力,顶一下。
楼主,占空比200调节是怎么确定的?为什么要选择200?
路过、、、、、、、、、、、、、
happy324403 发表于
楼主,占空比200调节是怎么确定的?为什么要选择200?
没有啊 一个周期我只分成了200段 因为好算= =
楼主,请问一下,有没有PWM调光的程序,可以增加或者减少亮度?谢谢!!!!
站长推荐 /1
18X24厘米超大PCB功能底板,板载19个芯片集成38大功能模块,扩展核心板9.5X6厘米,完美支持AT&STC51、AVR、PIC、MSP430、ARM、STM32、M0等等,配超大精美铝箱、触摸彩屏、OLED液晶....
Powered by

我要回帖

更多关于 单片机定时器中断原理 的文章

 

随机推荐