使用定时器T0产生PWM方波,
用按键调整占空比,20级可调
控制led灯的亮度等级.
#include "my51.h" #include "timer0.h" #define grading 20 //亮度20级变化 sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++ sbit keyS4=P3^6; // PWM_keyChange-- u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化 //占空比 PWM_keyChange/grading void T0_work() //本函数由T0定时器中断函数调用 { if(timeMultiple1Flag) { led=off(7); //关闭7号灯 timeMultiple1Flag=0; //清定时器复用置位标志 } if(timeMultiple2Flag) { led=on(7); //打开7号灯 timeMultiple2Flag=0; //清定时器复用置位标志 } } void main() //测试 { u8 keyFlag=1; //程序中没有消抖处理,只是简易的按键进出自锁标志 led0=ledon; //先打开0号灯,用于和7号灯对比亮度 initT0(1,10,grading); //1毫秒的基本定时,亮的时间1*10毫秒,暗1*(grading-10)毫秒 while(1) { if(0==keyS3) { if(keyFlag) //防止一次按键中多次执行 { keyFlag=0; //清标志,类似同步锁 if(++PWM_keyChange>grading) { PWM_keyChange=grading; //占空比最大100% } initT0(1,PWM_keyChange,grading); } } else if(0==keyS4) { if(keyFlag) { keyFlag=0; if(0==--PWM_keyChange) //占空比减小 { PWM_keyChange=1; //最小占空比 1/20 } initT0(1,PWM_keyChange,grading); //占空比减小 } } else { keyFlag=1; //按键锁释放标志,下一次按键时允许调整占空比 } } }
#ifndef _MY51_H #define _MY51_H #include <reg52.h> //#include <math.h> #include <intrins.h> #include <stdio.h> #include "mytype.h" #ifndef _51LED_ #define _51LED_ #define led P1 //P1总线连8个led灯,灯连573锁存器,P1置低电平点亮 #define LED led #define ON(x) P1&(~(1<<(x))) //打开某个灯,开多个灯用 ON(m) & ON(n) #define OFF(x) P1|(1<<(x)) //关闭某个灯,关多个灯用 OFF(m)| OFF(n) #define on(x) ON(x) //包含大小写 #define off(x) OFF(x) #define ledon 0 //某个灯,打开 #define ledoff 1 //某个灯,关闭 sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3; sbit led4=P1^4; sbit led5=P1^5; sbit led6=P1^6; sbit led7=P1^7; sbit ledLock=P2^5; //锁定当前8个led的状态,0锁定 ,1不锁定 #endif /*************二进制输入宏****************************/ #ifndef _LongToBin_ #define LongToBin(n) \ ( \ ((n >> 21) & 0x80) | \ ((n >> 18) & 0x40) | \ ((n >> 15) & 0x20) | \ ((n >> 12) & 0x10) | \ ((n >> 9) & 0x08) | \ ((n >> 6) & 0x04) | \ ((n >> 3) & 0x02) | \ ((n ) & 0x01) \ ) #define bin(n) LongToBin(0x##n##l) #define BIN(n) bin(n) #define B(n) bin(n) #define b(n) bin(n) #endif /*************单个数据位的置位宏*********************/ #ifndef _BIT_ #define BIT(n) (1<<n) #define bit(n) BIT(n) #endif #define high 1 //高电平 #define low 0 //低电平 sbit beep=P2^3; //蜂鸣器 extern void delayms(u16 ms); extern void delayXus(u8 us); //函数执行(8+6x)个机器周期, 即t=(8+6x)*1.085 ///////////////////////////////////////////////////////////////////////////// #endif
#ifndef _TIMER0_H #define _TIMER0_H #include "my51.h" extern u8 timeMultiple1Flag; //中断时间复用置位标志,须手动清零 extern u8 timeMultiple2Flag; //中断时间复用置位标志,须手动清零 extern void T0_work(); //该函数未实现,需外部实现 extern void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) ; //定时器初始化 #endif
#include "timer0.h" u8 TH0Cout=0 ; //初值 u8 TL0Cout=0 ; u16 T0IntCouts1=0; //中断计数 u16 T0IntCouts2=0; //中断计数 u16 timeMultiple1=0; //中断复用时间的倍数 u16 timeMultiple2=0; //中断复用时间的倍数 u8 timeMultiple1Flag=0; //中断时间复用置位标志,须手动清零 u8 timeMultiple2Flag=0; //中断时间复用置位标志,须手动清零 //开启定时器,定时完成后需要手动关闭TR0,否则将循环定时 //参数一是定时的毫秒数,参数二和三是定时基时的倍率数(定时复用) void initT0(u8 ms,u16 t_multiple1,u16 t_multiple2) //定时器初始化设定,ms取值不超过65 { u16 N=11059.2*ms/12; //定时器总计数值 TR0=STOP; //停掉定时器 ET0=CLOSE; //关定时器中断 //对于110592晶振,ms为5的整数倍时没有计算误差,但ms最大不超过71毫秒 TH0Cout =(65536-N)/256; //装入计时值零头计数初值 TL0Cout =(65536-N)%256; if(0==t_multiple1) //0倍的基准时间是不合理的,至少1倍 { t_multiple1=1; } if(0==t_multiple2) //0倍的基准时间是不合理的,至少1倍 { t_multiple2=1; } timeMultiple1=t_multiple1; //倍时 timeMultiple2=t_multiple2; //倍时 TMOD &= 0xf0; //清定时器0配置 TMOD |= 0x01; //配置定时器0的工作方式为1 EA =OPEN; //打开总中断 ET0=OPEN; //打开定时器中断 TH0=TH0Cout; //定时器装入初值 TL0=TL0Cout; TR0=START; //启动定时器 } void T0_times() interrupt 1 //T0定时器中断函数 { TH0=TH0Cout; //重装初值 TL0=TL0Cout; if(++T0IntCouts1==timeMultiple1) //判断是否复用定时器 { T0IntCouts1=0; //中断次数清零,重新计时 timeMultiple1Flag=1; //复用定时器标志,须在T0_work()中手动清零 } if(++T0IntCouts2==timeMultiple2) //判断是否复用定时器 { T0IntCouts1=0; //这个也要清,防止到达最小公倍数时乱掉 T0IntCouts2=0; //中断次数清零,重新计时 timeMultiple2Flag=1; //复用定时器标志,须在T0_work()中手动清零 } T0_work(); //调用工作函数 }
相关推荐
介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm.在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯...
51单片机一个定时器产生可调PWM的c程序,供下载使用
STC系列51单片机利用PCA定时器产生PWM信号例程,使用STC系列单片机自带PWM功能
51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 定时器控制交通指示灯51单片机Proteus仿真实例 ...
51单片机Proteus仿真实例 定时器控制数码管动态显示51单片机Proteus仿真实例 定时器控制数码管动态显示51单片机Proteus仿真实例 定时器控制数码管动态显示51单片机Proteus仿真实例 定时器控制数码管动态显示51单片机...
51单片机定时器0模拟PWM输出C程序例程,适合刚接触PWM波调光、调速等应用场合,程序方便移植,能够直接使用
基于Keil+51单片机一个用定时器做的PWM.rar(源码+仿真)基于Keil+51单片机一个用定时器做的PWM.rar(源码+仿真)基于Keil+51单片机一个用定时器做的PWM.rar(源码+仿真)基于Keil+51单片机一个用定时器做的PWM.rar...
51单片机定时器0产生200mS方波keil工程文件C源文件,包含keil的工程文件,C语言源码,头文件等。程序注释非常详细,用keil5可以直接打开。
利用单片机定时器产生的占空比可调的PWM程序,采用C51编写的。
大大的好#include <REG52.H> //模拟PWM输出控制灯的10个亮度级 unsigned int scale; //占空比控制变量 sbit P0_0=P2^0; void main(void) // 主程序 { unsigned int n; //延时循环变量 TMOD=0x01; //定时器0...
最新单片机仿真 PWM控制LED的亮度仿真程序最新单片机仿真 PWM控制LED的亮度仿真程序最新单片机仿真 PWM控制LED的亮度仿真程序最新单片机仿真 PWM控制LED的亮度仿真程序最新单片机仿真 PWM控制LED的亮度仿真程序最新...
由于51单片机没有PWM的功能,所以控制舵机等旋转旋转固定角度相对困难,本程序利用定时器模拟一个PWM,产生的周期和频率较为准确。
51单片机输出频率可调方波控制步进电机平稳启动和调速,本程序适用于带驱动器的步进电机驱动,只需要给驱动器一个频率可调的方波既能控制步进电机的启动和调速,本例程可以实现电机的稳定启动和多档速度调节,每一次...
单片机80C51 F310产生独立PWM方波的C程序
Protues仿真实例-51单片机-定时器做的可调PWM.rar
51单片机Proteus仿真实例 定时器控制数码管动态显示 (2)51单片机Proteus仿真实例 定时器控制数码管动态显示 (2)51单片机Proteus仿真实例 定时器控制数码管动态显示 (2)51单片机Proteus仿真实例 定时器控制数码管动态...
51单片机单片机产生占空比可调方波程序(PWM).zip
用stc51系列单片机,用定时器实现pwm可调,从而实现led亮度可调 用stc51系列单片机,用定时器实现pwm可调,从而实现led亮度可调 用stc51系列单片机,用定时器实现pwm可调,从而实现led亮度可调
用51单片机作为主控芯片,采用定时器计时循环点亮8个LED小灯,在Proteus 8.6 中建立仿真测试,内含程序源码(keil 5.26),Proteus仿真模型
基于51单片机输出频率和占空比可调的方波,以及频率和占空比的回测。频率,占空比可键盘输入,12864液晶显示