Ⅰ 单片机调光程序
//程序两个按键接的是外部中断0、1的输入口,按下键就触发相应的中断
//变量和变暗是PWM来控制的,具体在定时中断中说明
#include <reg51.h>
sbit K1 =P3^2 ; //亮度增加键
sbit K2 =P3^3 ; //亮度减少键
sbit led=P0^0;
bit t=0;
unsigned char zhankongbi=0;
unsigned char a=0;
void delay (unsigned char i);
void main ()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
TMOD=0x02;
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
while(1);
}
void delay (unsigned char i)
{
unsigned char a;
while(i--)
{
for(a=120;a>0;a--);
}
}
void zengjia () interrupt 0 // 变亮按键
{
if(K1==0)
{
delay (1);
if(K1==0)
{
t=1;
}
}
}
void jianshao () interrupt 2 // 变暗按键
{
if(K2==0)
{
delay (1);
if(K2==0)
{
t=0;
}
}
}
void time () interrupt 1
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
if(t) //当按下变量按键时
{
a++;
if(a<=3)
{
led=1; //LED控制高电平为7毫秒
}
else if(a<=10)
{
led=0; //LED控制低电平为3毫秒
}
else if(a==11)
{
a=0;
}
}
else //当按下变暗键时
{
a++;
if(a<=7)
{
led=1; //LED控制高电平为3毫秒
}
else if(a<=10)
{
led=0; //LED控制低电平为7毫秒
}
else if(a==11)
{
a=0;
}
}
}
//可见变亮开关按下LED控制PWM脉宽比为7:3
//变暗开关按下LED控制PWM脉宽比为3:7
//这样就达到了控制LED亮暗的目的,这个程序没有实现亮到按的逐步变化。
Ⅱ 51单片机输出pwm
15-PWM调光
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void Delay(unsigned int t)
{
while(--t);
}
void main ( )
{
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
while (1) //主循环
{
P2=0X00;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
P2=0XFF; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
P2=0X00; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
P2=0XFF;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{ //与逐渐变亮相反的过程
P2=0XFF;
Delay(PWM_LOW);
P2=0X00;
Delay(CYCLE-PWM_LOW);
}
}
}
自己修改 可以改变占空比
Ⅲ 基于51单片机的可控硅调压调光程序-带过零检测
程序:
#include<reg52.h>
#include<intrins.h>
sbitledRS=P1^0;
sbitledRW=P1^1;
sbit ledE=P1^2;
sbit keyjia=P2^7;
sbitkeyjian=P2^6;
sbitcontrolLD=P1^3;
bitflag1=1;
bitflag2=1;
unsigned
char code table[]=" guang liang
";
unsignedchar code table1[]=" 00 ";
intnum,flag=0,count=0;
charliang=3;
voiddelaykt(void) //导通延时
{
unsigned char a;
for(a=2;a>0;a--);
}
voiddelay(int z) //可调延时
{
unsigned x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void
delay9ms(void) //误差
-0.43402777778us 延时9ms
{
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=224;b>0;b--)
for(a=17;a>0;a--);
}
voidwrite_com(unsigned com) //写指令
{
ledRS=0;
P0=com;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_date(unsigned date) //写数据
{
ledRS=1;
P0=date;
delay(10);
ledE=1;
delay(20);
ledE=0;
}
voidwrite_liang(unsigned liang) //写亮度
{
int shi,ge;
shi=(liang-3)/10;
ge=(liang-3)%10;
write_com(0x80+0x40+7);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidinit() //初始化
{
controlLD=1; //触发控制初始化
ledRW=0; //液晶初始化
ledE=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x80);
for(num=0;num<15;num++)
{
write_date(table[num]);
delaykt();
}
write_com(0x80+0x40);
for(num=0;num<15;num++)
{
write_date(table1[num]);
delaykt();
}
EA=1; //外部中断设置
EX0=1;
IT0=1;
}
voidkeyscanf() //键盘判断
{
if(keyjia==0) //加键判断
{
delaykt();
if(keyjia==0)
{
if(flag1==1)
{
flag1=0;
liang++;
if(liang==10)
liang=3;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjia!=0)
{
delaykt();
if(keyjia!=0)
flag1=1;
}
if(keyjian==0) //减键判断
{
delaykt();
if(keyjian==0)
{
if(flag2==1)
{
flag2=0;
liang--;
if(liang==2)
liang=9;
write_com(0x80+0x40+7);
write_liang(liang);
}
}
}
else if(keyjian!=0)
{
delaykt();
if(keyjian!=0)
flag2=1;
}
}
voidzhongan() interrupt 0 //外部中断
{
flag=1;
}
voidtimepd() //同步标志判断与定时器设置
{
if(flag==1)
{
flag=0;
TMOD=0x01;
TH0=(65536-1000*(10-liang))/256;
TL0=(65536-1000*(10-liang))%256;
ET0=1;
TR0=1;
}
}
voidtime0() interrupt 1 //定时中断程序
{
count=1;
}
voidchufa() //MOS3020触发
{
if(count==1)
{
count=0;
controlLD=0;
delaykt();
controlLD=1;
delay9ms();
controlLD=0;
delaykt();
controlLD=1;
}
}
voidmain()
{
init();
while(1)
{
keyscanf();
timepd();
chufa();
}
}
Ⅳ 您好,我们是初学者,想编写一个c程,输出基于51单片机的能够控制舵机的pwm信号,望您赐教!谢谢!
51单片机是5v 的,要控制舵机得用到继电器,声称PWm波的程序给你粘一个:
#include <reg52.h>
sbit LED = P1^2;
unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 0.1ms
unsigned char PWM_ON ;//定义高电平时间
void delay(unsigned int cnt)
{
while(--cnt);
}
main()
{
bit Flag;
TMOD |=0x01;//定时器设置 0.1ms in 12M crystal
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时0.1mS
IE= 0x82; //打开中断
TR0=1;
CYCLE = 10;// 时间可以调整 这个是10调整 8位PWM就是256步
while(!Flag)
{
delay(20000); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果
PWM_ON++; //这个使用较长延时,以便能看清楚变化过程
if(PWM_ON == CYCLE)
{ //这个里可以添加其他程序 如到最亮时候控制设备
Flag=1;
}
}
while(Flag) //亮度递减 同上,是个相反的过程
{
delay(20000);
PWM_ON--;
if(PWM_ON == 0)
{
Flag=0;
}
}
}
/********************************/
/* 定时中断 */
/********************************/
void tim(void) interrupt 1 using 1
{
static unsigned char count; //
TH0=(65536-100)/256;
TL0=(65536-100)%256;//定时0.1mS
if (count==PWM_ON)
{
LED = 1; //灯灭
}
count++;
if(count == CYCLE)
{
count=0;
if(PWM_ON!=0) //如果左右时间是0 保持原来状态
LED = 0;//灯亮
}
}
这是用51单片机PWM 进行液晶调光的程序,你可以参考下!PWM波的频率和占空比,通过设置定时期的值来确定。
Ⅳ 用51单片机 调光
你的电路构思不太好,目的一样但是电路构成的方法有很多的,你这种办法比较耗费元件,并且因为过多的原件而导致可靠性下降。实现你的要求有简单的办法,就是采用单片机产生可控的PWM(PWM(PulseWidthMolation)控制——脉冲宽度调制技术。通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。)通过光电耦合隔离电路并经过驱动放大对双向可控硅G极控制,可控硅和220v电源相连串在灯上。参考电路:
Ⅵ 高分悬赏:51单片机 程序分析,请求前辈的指导,
问题1:这个程序确实分了10段,初始时K=5,而J的值是反复从0到9在变化。当K=5,则在J=0-4期间输出高电平,5-9期间输出低电平
问题2:K=10和K=0这个确实是为了限制K的范围,防止程序出现异常(当K成了负值,K就永远不能大于J了,然后输出一直是低电平;K大于9以后也是一样的)
问题3:TH0和TL0等于多少与你的晶振频率有关,这个是为了计算时间方便。比如用11.0592MHZ的晶振,定时器计满一次用时(1/11059200)*12*256ms,计时满1秒需要3600次定时器计满。程序是取值56,然后还计时满5000次,实际用时1秒。这个程序实际运行后LED灯估计能看到很明显的闪烁。如果你想实现255级调光,这个程序不能胜任(我估计是按照书上套下来的程序,这个程序时间误差很大)。其实我也自己写有这种模拟PWM的程序,255级调光,其实很容易,自己多想想。建议:定时器中断里面只执行一个i++就可以了,剩下的事情全放到中断外面执行(不仅是这个程序,以后写别的程序也要尽量让中断里面的程序尽可能的少,这样CPU可以有时间多执行主程序,不影响程序整体的运行)
Ⅶ 51单片机PWM调光程序无法正常运行
http://..com/question/316661185
参考。
Ⅷ 51单片机 PWM LED 调光程序,请高人帮忙讲一下执行过程,重点是CYCLE、PWM_ON是怎样的变化的。
CYCLE=10;在初始化中,在程序中不会改变;pwm周期
PWM_ON只在主循环来改变;延时程序很长delay(1000); 中断函数执行很多次,第一次count=0时,就把led灭了,当PWM_ON=2时,有了亮度,此亮度保持到,PWM_ON=2,加亮,直到PWM_ON=10,最亮,开始执行变暗程序。
Ⅸ 如何用51单片机产生pwm 并利用pwm控制led灯的功率
#include<reg52.h>
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
#define uint unsigned int
#define uchar unsigned char
uchar whith_p=50;
uchar max_p=255;
uchar min_p=1;
uint fre = 0xffff;
sbit CR = 0xDE;
sbit led = P2^0;
void timer0_int (void) interrupt 1 using 1
{
TH0 = fre >> 8;
TL0 = fre & 0xff;
led = ~led;
}
void timer0_init(void)
{
TMOD &= 0xf0;
TMOD |= 0x1;
TH0 = 0xff;
TL0 = 0xff;
TR0 = 1;
ET0 = 1;
}
void pwm_init(void)
{
CMOD = 0x4;
CL = 0x0;
CH = 0x0;
CCAP0H = whith_p;
CCAPM0 = 0x42;
CR = 1;
}
void soft_delay(uint _1ms)
{
unsigned int tmp;
while(_1ms--!=0) {
for(tmp=0;tmp<144;tmp++);
}
}
void pwm_out(void)
{
whith_p=50;
while(whith_p<max_p)
{ CCAP0H =whith_p;
soft_delay(10);
whith_p=whith_p+5;
CCAP0H = whith_p;
soft_delay(10);
}
whith_p=max_p;
while(min_p<whith_p)
{ CCAP0H = whith_p;
soft_delay(10);
whith_p=whith_p-5;
CCAP0H = whith_p;
soft_delay(10);
}
}
void main (void)
{
pwm_init();
timer0_init();
EA = 1;
while(1){
pwm_out();
}
}
STC单片机具有PWM输出功能,最近玩12864LCD万年历时,用的是杜洋的FT4时钟电路,用他提供的H文件控制时,具有调光功能,由于只是玩一玩,没有购买源码,而网上流行的程序都没有此功能,无奈,只能自己弄,好在杜老师及人所及早在网站中备下了资料,简单攒一下,居然成功了,并成功的汇入了万年历的程序中,现在将其改成完整的控制程序公开于此供参考。
/*************************************************
STC单片机单/双键控制LED亮度PWM调光程序 原创WanNengGong 2010/09/20
参考程序: 杜洋工作室PWM功能程序模块
*************************************************/
#include<STC12C5A60S2.H> //头文件
#define uchar unsigned char
#define uint unsigned int
uchar vx=5;
//vx=5在用于12864LCD的LED背光调整时上电为半亮度状态,可根据自己的用途及要求任意设定
sbit KEY_H=P2^4;
sbit KEY_L=P2^5;
/*******************************************************************************/
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP1H=0x00; // PWM0初始时为0
CR=1; //启动PCA定时器
}
/******************************************************************************/
void PWM0_set (uchar a){//PWM0占空比设置函数
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延时函数 1mS/次(用于1T单片机)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
} }
/****************************************************************************/
void main(void)
{
KEY_H = 1;KEY_L = 1;
PWM_init ();
while(1)
{
PWM0_set(vx*24);
//数字24是配合vx调试取得的,此时vx的赋值范围约为1-10对应最暗-最亮
//--------减调整---------//
if (KEY_L == 0 ){
DelayM(20); //延时20毫秒消抖动
if(KEY_L == 0){ //如果20SM后KEY_L还是0状态则确认下调键是按下的
vx--;
if(vx<1){vx=5;}
//如果设定vx=10,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
}
while(KEY_L == 0);//等待键松开
}
//--------加调整---------//
if (KEY_H == 0 ){
DelayM(20);
if(KEY_H == 0){
vx++;
if(vx>10){vx=5;}
}
while(KEY_H == 0);
}
}
}
程序自己理解消化了,就可以编出你自己的程序了,你说的,完全可以实现,而且比这俩个例子简单N多。
这是网络里面别人的回答,感觉可以解决您单片机产生PWM的问题了,至于后面如何控制功率,那你就要搞清功率的单位是什么,除了w,还有什么,在时间一定的情况下,如何改变功率,只需要改变其PWM的占空比。如果一个周期里面,它有50%是高电平,那么它是正常输入的50%的功率,如果只有20%呢,10%呢?这不就在改变其功率么?