控制P1口LED灯渐亮和渐暗程序

合集下载

51单片机控制LED灯程序设计

51单片机控制LED灯程序设计

51单片机:LED灯亮灯灭程序设计1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。

程序:01: MOV A , #11111110B ; 存入欲显示灯的位置数据02: MOV P1,A ; 点亮第一只灯03: JMP $ ; 保持当前的输出状态04: END ; 程序结束2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。

程序:01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据02:MOV P1,A ; 点亮灯03:JMP START ; 重新设定显示值04:END ; 程序结束3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。

程序:01:START: MOV R0, #8 ;设左移8次02:MOV A, #11111110B ;存入开始点亮灯位置03:LOOP: MOV P1, A ;传送到P1并输出04:RL A ;左移一位05:DJNZ R0, LOOP ;判断移动次数06:JMP START ;重新设定显示值07:END ;程序结束4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。

程序:01:START: MOV R0, #8 ;设右移8次02:MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出04: ACALL DELAY ;调延时子程序05: RR A ;右移一位06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ;09:DLY1: MOV R6,#100 ;10: DLY2: MOV R7,#100 ;11: DJNZ R7,$ ;12: DJNZ R6,DLY2 ;13: DJNZ R5,DLY1 ;14: RET ;子程序返回15:END ;程序结束5.功能说明:单片机P1端口接8只LED,每次点亮一只,先把右边的第一只点亮,0.5秒后点亮右数的第二只灯,第一只熄灭,再过0.5秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。

CC2530单片机用定时器产生LED渐亮渐灭

CC2530单片机用定时器产生LED渐亮渐灭
用按位或比较好
呼吸灯
呼吸灯
原理:脉冲宽度调制
方法: 改变灯泡亮灭的时间
条件: 灯亮时间+灯灭时间=常量
灯亮时间+灯灭时间<20ms
方法一:延时
亮 亮延时

灭延时(周期减亮延时)
判断:改变亮度的时间到了吗?
Y
N
增加亮时间/减少亮时间
#include <ioCC2530.h> #define uint unsigned int #define uchar unsigned char #define LED1 P1_0 //定义LED1为P1.0口控制 /**************************** //初始化程序 *****************************/ void InitLed(void)//初始化函数 { P1DIR |= 0x01; //P1_0定义为输出 LED1 = 1; //LED1灯初 始化熄灭 } void ys(uchar h)//延时 { uchar i,j; for(i=0;i<h;i++) for(j=0;j<200;j++);//改变判断语句可以改变周期(有闪烁感时,改小) } /*************************** 主函数 ***************************/ void main(void) { uchar h=0;//h越大越亮 uchar zt=1;//zt为1是渐亮,为2是渐灭 uint js=0; InitLed(); //调用初始化函数
是通道2,T1STAT&0x04>0时,灯就灭了。
输出比较模式
1.输出的引脚,P1.0设置为输出。

[VIP专享]PWM控制LED渐亮与渐灭

[VIP专享]PWM控制LED渐亮与渐灭

2006年经省农业厅,南平市政府19批41准年,毛南泽平东农在校《与改建造阳我农们业的工学程习学》校一合文署中办,学把,这强句强原联指合治,学实态行度一的套话班古子为,今两用个,校从区哲的学管的理高体度制做,了从新而的使分学析校,的深办化学了规对模实,事办求学是实的力理都解有,长并足为的其发提历展出史,了的逐一经步个验发经教展典训成的告为注诉有释我着,们广指:泛出什发:么展“时空‘候间实坚和事持良’实好就事发是求展客是前观,景存党的在和闽着国北的家唯一的一切事一事业所物就集,会文第‘顺理一是利、个’发农问就展工题是;商,客什实贸实观么事为事事时求一求物候是体是的背是,地内离一面看部实个向待联事老全我系求话国们,是题招的即,,生学规党实和校律和事就。性国求业职,家是的业‘的一,教求事一语办育’业、,学明就就实出规显是会事自模不我遭求东最同们遇是汉大于去挫地班、高研折看固师等究。待所资教”同学著力育。时校《量和毛,、汉最中泽只学书雄学东有生河厚教对坚和间、育中持学献办,国实校王学不社事当传质同会求前》量点、是工。和就中,作书办在国党以中学于革和及称声职命人存赞誉业的民在刘高教分的的德的育析事问“综所无业题修合有不才学性工贯能好国作穿顺古家和着利,级任实前实重何事进事点事求,求中情是一是专都的旦。和必精背”省须神离其级靠。实意文自因事思明己而求是学完他是根校成才就据。。能必实而找然事这到遭求些中到索成国挫真绩革折理的命甚。取的至得规倒是律退得,。益制实于定事学出求校适是党合是政中马领国克导国思的情主坚的义强路世领线界导方观,针的得政根益策本于,要全指求体导,党中是员国马干革克部命思和走主教向义职胜的工利精的,髓辛实。勤事工求作是和是共中同国努革力命的实结践果经,验但的最高主度要总的结一和条概是括得,益中于国学革校命始和终建坚设持的实经事验求表是明的,原实则事,求可是以是说胜,利坚之持本实,事只求要是坚原持则实是事我求们是学,校我各们项党事就业会健永康远、立稳于定不和败谐之发地展。的重要保证。

最简单PWM技术应用渐明渐暗的LED灯

最简单PWM技术应用渐明渐暗的LED灯

最简单PWM技术应用渐明渐暗的LED灯浅谈最简单PWM技术应用--渐明渐暗的LED灯:控制简单的LED灯貌似没什么难度~但是你会不会感觉到太单调~总是同一个频率在闪烁~总是同一个亮度在闪烁。

大家有否想过能让LED灯由暗逐渐变亮~然后再由亮变暗该从什么地方入手呢,这里就不得不提到PWM技术。

这里着重注意最后面对所给完整程序的分析。

在开始我们的工程之前,首先来了解一个概念:PWM。

PWM是脉冲宽度调制的英文单词的缩写。

脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。

脉宽调制是开关型稳压电源中的术语。

这是按稳压的控制方式分类的,除了PWM型,还有PFM型和PWM、PFM混合型。

脉宽调制式开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。

读起来有点晦涩难懂。

其实简单的说来,PWM技术就是通过调整一个周期固定的方波的占空比,来调节输出电压的平均当电压,电流或者功率等被控量。

我们可以用个一水龙头来类比,把1s时间分成50等份,即每一个等份20ms。

在这20ms 时间里如果我们把水龙头水阀一直打开,那么在这20ms里流过的水肯定是最多的,如果我们把水阀打开15ms,剩下的5ms关闭水阀,那么流出的水相比刚才20ms全开肯定要小的多。

同样的道理,我们可以通过控制20ms时间里水阀开启的时间的长短来控制流过的水的多少。

那么在1s内平均流出的水流量也就可以被控制了。

当我们调整PWM的占空比时,就会引起电压或者电流的改变,LED的明暗状态就会随之发生相应的变化,听起来好像可以通过这种方法来实现我们想要的渐明渐暗的效果。

让我们来试一下吧。

大家都知道人眼有一个临界频率,当LED的闪烁频率达到一定的时候,人眼就分辨不出LED是否在闪烁了。

为了让我们的LED在变化的过程中,我们感觉不到其在闪烁,可以将其闪烁的频率定在50Hz以上。

LED灯慢慢亮和慢慢暗程序

LED灯慢慢亮和慢慢暗程序

试了一下,效果很好,看起来象是模拟开关一样,我已经把部分注解了一下,实现的原理很简单,效果也不错, ;控制P1口LED灯渐亮和渐暗程序ORG 00HJMP MAINORG 30HMAIN:MOV A,#0CALL LOOP ;由暗变亮子程序MOV P1,#0FFH ;关灯,全暗MOV A,#0CALL LOOP2 ;由亮变暗子程序MOV P1,#0 ;开灯,全亮JMP MAIN;以下一段为由暗变亮的子程序,变化程度共255级,由两段程序组成,一段点亮,时间值由A中的数决定;另一段将A取反后作延时时间值,这样无论A是什么值,每个周期时间相等,但点亮和关闭的值就不断变化;类似一个频率一定,占空比可调的方波,从而实现灯光由暗到亮.LOOP:;这一段为点亮灯的延时MOV P1,#0 ;把灯点亮INC A ;A的值加1CJNE A,#0FFH,E2 ;A还没有加到FF,跳转E2E1:JMP OVER ;A加到了FF,结束返回E2:MOV R7,A ;A的值存入R7D1:MOV R6,#30 ;延时子程序DJNZ R6,$DJNZ R7,D1 ;R7-1不为零就转D1,这里R7即上面预置的A值,用在这里,就是每次延时时间不同,有255级MOV P1,#0FFH ;延时时间到,送所有灯;这一段为关掉灯的延时,两段相加,组成占空比可变的方波输出控制灯由暗到亮CPL A ;A的值取反,MOV R7,AD2:MOV R6,#30 ;延时子程序DJNZ R6,$DJNZ R7,D2CPL A ;再取反,恢复原来的值JMP LOOP ;跳回循环OVER:RET;以下为由亮变暗子程序,原理与上面一样.LOOP2:MOV P1,#0FFHINC A ;程序运行到此,A的值为0,经这一步后为1CJNE A,#0FFH,W2W1:JMP OVER2W2:MOV R7,AD11:MOV R6,#30DJNZ R6,$DJNZ R7,D11MOV P1,#0CPL AMOV R7,AD22:MOV R6,#30DJNZ R6,$DJNZ R7,D22CPL AJMP LOOP2OVER2:RETEND补充一下,11.0592M的晶振下,效果很好,6M下,有明显的闪烁感,可以通过修改R6的值来解决这个问题。

实验二P1口控制LED发光二极管

实验二P1口控制LED发光二极管

实验二 P1口控制LED发光二极管一、实验目的1、进一步熟练Proteus及Keil软件的基本操作2、掌握8051单片机P1口的使用方法3、掌握LED发光二极管的原理及使用方法4、学习汇编程序的调试及仿真方法二、实验电路三、实验内容及步骤:要求:8个LED发光二极管循环左移显示(发光的移位),间隔时间为一秒。

1、使用Proteus画出电路原理图2、在Keil uVision中完成程序编辑、调试及编译,生成.HEX文件3、进行Protues与Keil uVision联动的相关设置:4、在Proteus中仿真运行。

四、思考1、将本实验的实验现象改为“不发光二极管循环移位”。

2、将本实验的实验现象改为“每隔0.5秒发光二极管循环移位”。

参考程序:ORG 0LJMP MAINORG 30H MAIN: MOV A,#0FEH LOOP: MOV P1,ALCALL DELAYRL ASJMP LOOP DELAY: MOV R7,#20H DELAY1:MOV R6,#200 DELAY2:MOV R5,#123DJNZ R5,$DJNZ R6,DELAY2DJNZ R7,DELAY1RETEND实验三数码管静态显示实验一、实验目的1、进一步熟悉51系列单片机2、了解8051单片机P0口的使用方法3、掌握共阴极数码管的原理及使用方法4、学习8051的编程、调试、编译、仿真。

二、实验电路图3 数码管静态显示电路原理图注:数码管要从元件库选择Optoelectronics类中的7SEG-COM-CAT-GRN。

三、要求及步骤:要求:在七段数码管上以递增方式循环显示数字0—9,间隔时间为一秒。

1、使用Proteus画出电路原理图2、在Keil uVision中完成程序编辑、调试及编译,生成.HEX文件3、进行Protues与Keil uVision联动的相关设置:4、在Proteus中仿真运行。

四、思考1、为什么要将P0口各引脚通过电阻R3-R9接到电源?2、如何在共阴数码管上循环显示十六进制数字0—F(不区分字母的大小写)?3、怎样修改程序使数字以递减方式循环显示?4、若用共阳极数码管应如何修改电路和程序,才能完成本实验的功能?参考程序:ORG 00HLJMP STARTORG 30HSTART: MOV DPTR,#TABLES1: MOV R4,#00HS2: MOV A,R4MOVC A,@A+DPTRMOV P0,ALCALL DELAYINC R4CJNE R4,#0AH,S2SJMP S1DELAY: MOV R5,#20 ;延时子程序D2: MOV R6,#200D1: MOV R7,#123DJNZ R7,$DJNZ R6,D1DJNZ R5,D2RETTABLE: DB 3FH,06H,5BH,4FH,66H ;段码表DB 6DH,7DH,07H,7FH,6FHEND实验四基本输入/输出实验一、实验目的1、进一步熟悉8051单片机并行I/O口的使用方法3、掌握并行I/O口输入/输出操作的方法4、学习8051的编程、调试、编译、仿真。

51单片机的七彩LED灯渐变调光调色程序

51单片机的七彩LED灯渐变调光调色程序

51单片机的七彩LED灯渐变调光调色程序//------------------------------------------------------------------------------------// Main.c//------------------------------------------------------------------------------------// Copyright (C) 2013 Shenyang JYXD.// WEN BO RUI// Tool chain: KEIL Full 'c'////#pragma CD OE DB SB// Compilation directives#include;#include;#define uchar unsigned char#define uint unsigned intuint Period;//Period刷新周期uint PWM;uint Pulse;//脉冲个数uchar Speed;//速度变量uchar count;uint excount;bit Gra;//渐变/跳变总控制位bit Gra7;//七彩渐亮渐灭控制位bit Gra3;//红绿蓝渐亮渐灭控制位bit BP;//亮到暗,暗到亮转换位bit LEDdelay ;//LED定时到标志位sbit key1 = P3^1;//花样组合键1sbit key2 = P3^0;//花样组合键2sbit key3 = P3^5;//速度组合键1sbit key4 = P3^4;//速度组合键2ucharled1[12]={0x10,0x030,0x20,0x60,0x40,0x50,0x70,0x5 0,0x40,0x60,0x20,0x30};//红、黄、绿、青、蓝、粉、白、粉、蓝、青、绿、黄ucharled2[24]={0x10,0x00,0x30,0x00,0x20,0x00,0x60,0x00 ,0x40,0x00,0x50,0x00,0x70,0x00,0x50,0x00,0x40,0x00,0x60,0x00,0x20,0x00 ,0x30,0x00};uchar led3[3]={0x10,0x20,0x40};//红、绿、蓝uchar ledcount,ledcount1;//*********************************************** ************//以下定义函数// 1毫秒延时函数delayms();花样及速度扫描函数keyscan();//*********************************************** ************/*void delayms(unsigned int ms){unsigned char i ;while(ms--){for(i = 0 ; i ;跳变无灭灯过程void Pattern2();//花样2函数--------->;跳变有灭灯过程void Pattern34();void keyscan(){if((key4==1)&&(key3==1)) {Speed= 20;Period = 25;}//预设4种速度200MSif((key4==0)&&(key3==1)) {Speed= 50;Period = 50;}//500MSif((key4==1)&&(key3==0)) {Speed= 100;Period = 100;}//1Sif((key4==0)&&(key3==0)) {Speed= 150;Period = 200;}//1.5Sif((key2==1)&&(key1==1)) {ledcount1 =0;Pattern1();}//预设4种花样if((key2==0)&&(key1==1)) {ledcount1 =0;Pattern2();}if((key2==1)&&(key1==0)) {ledcount = 0;Gra3 = 1;Pattern34();}if((key2==0)&&(key1==0)) {ledcount = 0;Gra7 = 1;Pattern34();}}void value(){if(Speed == 20) PWM = Pulse*8;if(Speed == 50) PWM = Pulse*4;//脉冲个数if(Speed == 100)PWM = Pulse*2;if(Speed == 150)PWM = Pulse;}void Reset(void){unsigned char coderst[ ]={0xe4,0xc0,0xe0,0xc0,0xe0,0x32};(*((void (*)(void))(rst)))();}void main(){_nop_ ();_nop_ ();_nop_ ();P1 = 0;TMOD = 0x11;//11.0592M晶振的10ms定时初值(100分之一秒)TH0 = 0x0db;TL0 = 0x0ff;TH1 = 0x0ff;//0.05ms(20000分之一秒)TL1 = 0x0D1;EA = 1;//开启总中断允许ET0 = 1;//允许T0定时器中断ET1 = 1;//允许T1定时器中断TR0 = 1;//开启T0定时器EX0=1;//开外部中断0IT0=1;//下降沿触发while(1){keyscan();}}//*********************************************** **************************//Pattern1() 花样函数1-------------跳变无灭灯过程//*********************************************** **************************void Pattern1(){//keyscan();Gra = 0;//跳变位=0if(LEDdelay){LEDdelay = 0;P1 = led1[ledcount];ledcount++;if(ledcount>;11){ledcount = 0;}}}//*********************************************** ************************//Pattern2() 花样函数2-------------跳变有灭灯过程//*********************************************** ************************void Pattern2(){//keyscan();Gra = 0;if(LEDdelay){LEDdelay = 0;P1 = led2[ledcount];ledcount++;if(ledcount>;23){ledcount = 0;}}}//*********************************************** ************************//Pattern3() 花样函数3-------------3彩渐变//*********************************************** ************************/*void Pattern3(){keyscan();if(Speed == 20) Period = 25;if(Speed == 50) Period = 50;if(Speed == 100)Period = 100;if(Speed == 150)Period = 200;Gra = 1;Gra3 = 1;}*///*********************************************** ************************//Pattern4() 花样函数4-------------7彩渐变//*********************************************** ************************void Pattern34(){Gra = 1;//渐变位 = 1}/************************************************ *********/// 定时器0中断服务程序/************************************************ *********/void time0(void) interrupt 1{TR1 =0;TF0 =0;TH0=0xdb;//重新写入初值TL0=0xff;if(!Gra)//执行跳变程序{count ++;if(count >; Speed){LEDdelay = 1;count = 0;}}if(Gra){TR1 = 1;//开启TR1;if(!BP)//{if(Gra7){P1 = led1[ledcount1]; //10ms到,亮相应的LED }if(Gra3){P1 = led3[ledcount1]; //10ms到,亮相应的LED }Pulse++;value();if(Pulse >;= Period) {Pulse = Period;BP = 1;//一个周期完成转换模式}}if(BP){if(Gra7){P1 = led1[ledcount1]; //10ms到,亮相应的LED }if(Gra3){P1 = led3[ledcount1]; //10ms到,亮相应的LED }value();Pulse--;//脉冲个数if(Pulse == 0){Pulse = 0;BP = 0;//一个周期完成转换模式 ledcount1++;if(Gra7){if(ledcount1 >; 11) {ledcount1 = 0;}Gra7 = 0;}if(Gra3){if(ledcount1 >; 2) {ledcount1 = 0;}Gra3 = 0;}}}}/************************************************ *********/// 定时器1中断服务程序/************************************************ *********/void timer1() interrupt 3{PWM --;TH1 = 0xff;//0.05ms(20000分之一秒)TL1 = 0xD1;if(PWM == 0){P1 = 0;TR1 = 0;}}/************************************************ *********/// 外部中断0中断服务程序下降沿触发/*********************************************************/void extern0(void) interrupt 0 {IE0 = 0;// 清标志位excount++;if(excount>;50)// 50大约3秒{EA = 0;//P1_5 = 1;excount = 0;Reset();}}。

51单片机:LED灯亮灯灭程序设计之欧阳文创编

51单片机:LED灯亮灯灭程序设计之欧阳文创编

1.功能说明:控制单片机P1端口输出,使P1.0位所接的LED点亮,其他7只灯熄灭。

程序:01: MOV A , #11111110B ; 存入欲显示灯的位置数据02: MOV P1, A ; 点亮第一只灯03: JMP $ ; 保持当前的输出状态04: END ; 程序结束2.功能说明:单片机P1端口接8只LED,点亮第1、3、4、6、7、8只灯。

程序:01:START: MOV A , #00010010B ; 存入欲显示灯的位置数据02: MOV P1, A ; 点亮灯03: JMP START ; 重新设定显示值04: END ; 程序结束3.功能说明:单片机P1端口接8只LED,每次点亮一只,向左移动点亮,重复循环。

程序:01: START: MOV R0, #8 ;设左移8次02: MOV A, #11111110B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出04: RL A ;左移一位05: DJNZ R0, LOOP ;判断移动次数06: JMP START ;重新设定显示值07: END ;程序结束4.功能说明:单片机P1端口接8只LED,每次点亮一只,向右移动点亮,重复循环。

程序:01: START: MOV R0, #8 ;设右移8次02: MOV A, #01111111B ;存入开始点亮灯位置03: LOOP: MOV P1, A ;传送到P1并输出04: ACALL DELAY ;调延时子程序05: RR A ;右移一位06: DJNZ R0, LOOP ;判断移动次数07: JMP START ;重新设定显示值08: DELAY: MOV R5,#50 ;09: DLY1: MOV R6,#100 ;10: DLY2: MOV R7,#100 ;11: DJNZ R7,$ ;12: DJNZ R6,DLY2 ;13: DJNZ R5,DLY1 ;14: RET ;子程序返回15: END ;程序结束5.功能说明:单片机P1端口接8只LED,每次点亮一只,先把右边的第一只点亮,0.5秒后点亮右数的第二只灯,第一只熄灭,再过0.5秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。

单片机PWM控制LED亮度

单片机PWM控制LED亮度

//1ms 延时常数 //频率调节 //脉宽调节
else Beep() ; } while(K1==0); do{ if(PWM!=0x02) {PWM-- ;delayms(10);} else Beep() ; } while(K2==0); } } /*********************************************************/ // 定时器 0 中断服务程序. /*********************************************************/ void timer0() interrupt 1 { TR1=0 ; TH0=0xfc ; TL0=0x66 ; TH1=PWM ; TR1=1 ; P0=0x00 ; //启动输出 } /*********************************************************/ // 定时器 1 中断服务程序 /*********************************************************/ void timer1() interrupt 3 { TR1=0 ; P0=0xff ; //结束输出 } /*********************************************************/ //蜂鸣器子程序 /*********************************************************/ void Beep() { unsigned char i ; for (i=0 ;i<100 ;i++) {
void Beep(); void delayms(unsigned char ms); void delay(unsigned char t);

PWM 控制 LED 灯渐亮渐灭程序

PWM 控制 LED 灯渐亮渐灭程序

// PWM 控制LED 灯渐亮渐灭程序[转摘自伟纳电子]// 晶振为11.0592M// 利用定时器控制产生占空比可变的PWM 波// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。

// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

#i nclude < reg51.h >#i nclude < intrins.h >sbit K1 =P1^4 ; //增加键sbit K2 =P1^5 ; //减少键sbit BEEP =P3^7 ; //蜂鸣器unsigned char PWM=0x7f ; //赋初值void Beep();void delayms(unsigned char ms);void delay(unsigned char t);void main(){P1=0xff;TMOD=0x21 ;TH0=0xfc ; //1ms延时常数TL0=0x66 ; //频率调节TH1=PWM ; //脉宽调节TL1=0 ;EA=1;ET0=1;ET1=1;TR0=1 ;while(1){do{if(PWM!=0xff){PWM++ ;delayms(10);}else Beep() ;}while(K1==0);if(PWM!=0x02){PWM-- ;delayms(10);}else Beep() ;}while(K2==0);}}/***************************************************** ****/// 定时器0中断服务程序./***************************************************** ****/void timer0() interrupt 1{TR1=0 ;TH0=0xfc ;TL0=0x66 ;TH1=PWM ;TR1=1 ;P0=0x00 ; //启动输出}/***************************************************** ****/// 定时器1中断服务程序/***************************************************** ****/void timer1() interrupt 3{TR1=0 ;P0=0xff ; //结束输出}/***************************************************** ****///蜂鸣器子程序/***************************************************** ****/void Beep(){unsigned char i ;for (i=0 ;i<100 ;i++)delay(100) ;BEEP=!BEEP ; //Beep取反}BEEP=1 ; //关闭蜂鸣器delayms(100);}/***************************************************** ****/// 延时子程序/***************************************************** ****/void delay(unsigned char t){while(t--) ;}/***************************************************** ****/// 延时子程序/***************************************************** ****/void delayms(unsigned char ms){unsigned char i ;while(ms--){for(i = 0 ; i < 120 ; i++) ;}}#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义sbit LED1 = P3^0;sbit LED = P3^1; //定义LED灯,通过LED显示调光效果sbit LED2 = P3^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 crystalTH0=(65536-100)/256;TL0=(65536-100)%256; //定时0.1mSIE= 0x82; //打开中断TR0=1;CYCLE = 50; // 时间可以调整这个是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.1mSif (count==PWM_ON){LED1 = 1;LED = 1; //灯灭LED2 = 1;}count++;if(count == CYCLE){count=0;if(PWM_ON!=0) //如果左右时间是0 保持原来状态LED1 = 0;LED = 0; //灯亮LED2 = 0;}}参考链接:/news/2010-12/2402.htm#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit CLK=P2^4; //时钟信号sbit ST=P2^5; //启动信号sbit EOC=P2^6; //转换结束信号sbit OE=P2^7; //输出使能sbit PWM=P3^0; //PWM 输出//延时void DelayMS(uint ms){uchar i;while(ms..) for(i=0;i<40;i++);}//主程序void main(){uchar Val;TMOD=0x02; //T1 工作模式2TH0=0x14;TL0=0x00;IE=0x82;TR0=1;while(1){ST=0;ST=1;ST=0; //启动A/D 转换while(!EOC); //等待转换完成OE=1;Val=P1; //读转换值OE=0;if(Val==0) //PWM 输出(占空比为0%){PWM=0;DelayMS(0xff);continue;}if(Val==0xff) //PWM 输出(占空比为100%){PWM=1;DelayMS(0xff);continue;}PWM=1; //PWM 输出(占空比为0%~100%) DelayMS(Val);PWM=0;DelayMS(0xff.Val);}}//T0 定时器中断给ADC0808 提供时钟信号void Timer0_INT() interrupt 1{CLK=~CLK;}。

LED渐变C程序

LED渐变C程序

/*-----------------------------------------------名称:PWM 调光日期:2009.5修改:无内容:1、学习目的:利用定时器产生PWM,了解原理和使用方法2、硬件要求:LED灯定时器3、试验现象:LED灯由亮到灭,由灭到亮逐步变化,也就是调光现象------------------------------------------------*/#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义unsigned char BL;sbit LEDR = P2^0; //定义LED灯,通过LED显示调光效果sbit LEDG = P2^1;sbit LEDB = P2^2;unsigned char CYCLE; //定义周期该数字X基准定时时间如果是10 则周期是10 x 0.1ms unsigned char R,G,PWM_ON;//定义高电平时间//sfr IAP_CONTR=0xE7;sfr ISP_contro=0xE7;sbit key=P3^0;void checkreload(){if(key==0)ISP_contro=0xe0;}//void Init_Com();/******************************************************************//* 延时函数*//******************************************************************/void delay(unsigned int cnt){while(--cnt);}/******************************************************************//* 定时器初始化*//******************************************************************/typedef enum Timern{Timer0,Timer1,Timer2,}Timern;unsigned int US0,US1,US2;void Init_timer(Timern timern,unsigned int us){switch(timern){case Timer0:TMOD |=0x01;TH0=(65536-us)/256;TL0=(65536-us)%256;ET0=1;EA=1;TR0=1;//US0=us;break;case Timer1:TMOD |=0x02;TH1=(65536-us)/256;TL1=(65536-us)%256;ET1=1;EA=1;TR1=1;//US0=us;break;}}/******************************************************************//* 主函数*//******************************************************************/void main(){bit Flag;Init_timer(Timer0,10);//定时器初始化//Init_Com();CYCLE =255; // 时间可以调整这个是10调整8位PWM就是256步//PWM_ON=60;BL=1;R=1;G=1;US0=10;//BL=200;/*while(1){G++;delay(100);}*///*while(1){while(!Flag){delay(100); //延时时间,从一个亮度到下一个亮度的间隔时间,速度快就能看到连续效果BL++; //这个使用较长延时,以便能看清楚变化过程R--;if(R<1)R=1;if(BL == CYCLE){ //这个里可以添加其他程序如到最亮时候控制设备Flag=1;}}while(Flag) //亮度递减同上,是个相反的过程{delay(100);BL--;if(BL<1)BL=1;R++;if(BL == 1){Flag=0;}}//*/}}/******************************************************************//* 定时器0中断函数*//******************************************************************/void tim(void) interrupt 1 using 1{static unsigned char count;TH0=(65536-10)/256;TL0=(65536-10)%256; //定时0.01mScount++;checkreload();if (count==R){LEDR = 1; //灯灭}if (count==G){LEDG = 1;}if (count==BL){LEDB = 1;}if(count == CYCLE){count=0;//if(PWM_ON!=0) //如果左右时间是0 保持原来状态LEDR = 0;LEDG = 0;LEDB = 0;}}。

实验1:P1口亮灯控制程序-实验说明

实验1:P1口亮灯控制程序-实验说明

实验1: P1口亮灯控制程序一、连接方法1、将SIP8-3用跳线帽上连2、依据ISP在线编程步骤将程序写到入芯片中;3、打开电源程序即可运行。

4、注意该实验结束后可将SPL上的跳线帽去掉,以减少开发板的功耗。

二、相应原理图如下:三、实验说明:、本实验仅用到L1灯。

本例实验主要用到了延时子程序,clr,lcall,ajmp 指令,通过控制P1.0口实现效果。

用户可以通过此程序的学习,只要你掌握了该程序,你就成功迈出了学习单片机的第一步!四、程序范例:;****************************************************************************************;*描述: 端口亮灯控制程序;*公司:深圳信盈达电子有限公司;*编写: 牛乐乐;*日期: 2009年07月15日;*版本: V1.0;*连接: SPL跳线连接;;*说明:实现P1.0控制L1灯常亮;****************************************************************************************/ ORG 0000HLJMP MAINORG 0030H ;到0030h处避开00-30之间的敏感地址MAIN:CLR P1.0 ;将P1.0送0指令LCALL DEL ;延时LJMP MAIN ;循环;//******延时子程序**********//DEL: MOV R2,#200 ;执行1该条指令需要1us时间D1: MOV R3,#250 ;执行1该条指令需要1us时间D2: DJNZ R3,D2 ;执行1该条指令需要2us时间DJNZ R2,D1 ;执行1该条指令需要2us时间RET ;执行1该条指令需要1us时间END;延时子程序延时时间T=1+(1+2*250+2)*200+1=2+100600=100602us=100.6ms=0.1s ;//计算延时间;t=2+100*(2+250*(4)+2)=100 000us=0.1s(约等于1s)。

渐明渐暗动态流水灯效果(C源程序)

渐明渐暗动态流水灯效果(C源程序)

//--------------------------------------------------------//项目: 灯闪控制//设计: 程序匠人//--------------------------------------------------------/*匠人按:一般的流水灯,LED都是固定亮度的。

本程序在此基础上,实现渐明渐暗的效果。

原理就是采用软件实现PWM,通过调节每个LED的亮灭时间比(占空比)来调节LED的亮度。

本程序在EDN提供的51助学板上测试通过。

*///--------------------------------------------------------/*版本说明:程序01_P0口灯闪_V01: 2008-5-21 22:538个LED一起闪烁程序01_P0口灯闪_V02: 2008-5-21 22:538个LED流水灯程序01_P0口灯闪_V03: 2008-5-22 21:36仍旧是8个LED流水灯,规范程序程序01_P0口灯闪_V04: 2008-5-22 21:52优化程序程序01_P0口灯闪_V05: 2008-5-22 23:19渐明渐暗动态流水灯效果*///--------------------------------------------------------//插入文件包//--------------------------------------------------------#i nclude<at89x52.h> //加入头文件;//--------------------------------------------------------//重新命名数据类型//--------------------------------------------------------typedef unsigned char tU08; //unsigned 8 bit definitiontypedef unsigned char tU8; //unsigned 8 bit definitiontypedef unsigned int tU16; //unsigned 16 bit definitiontypedef unsigned long tU32; //unsigned 32 bit definitiontypedef signed char tS08; //signed 8 bit definitiontypedef signed char tS8; //signed 8 bit definitiontypedef signed int tS16; //signed 16 bit definitiontypedef signed long tS32; //signed 32 bit definitiontypedef float tF32;//--------------------------------------------------------//--------------------------------------------------------#define LED_ON 0 //LED点亮#define LED_OFF 1 //LED熄灭/*//--------------------------------------------------------//延时子程序//--------------------------------------------------------void delay(tU16 a){tU16 b;for(b=0;b<a;b++); //根据输入A 的值达到某一定时间的延时;}*///--------------------------------------------------------//主函数//--------------------------------------------------------void main(){tU08 i,j ;tU08 t_jsq ; //周期计数器(范围0~199)tU08 duty_led0 ; //LED0的占空(范围0~200;数值越大,LED越亮;下同) tU08 duty_led1 ; //LED1的占空tU08 duty_led2 ; //LED2的占空tU08 duty_led3 ; //LED3的占空tU08 duty_led4 ; //LED4的占空tU08 duty_led5 ; //LED5的占空tU08 duty_led6 ; //LED6的占空tU08 duty_led7 ; //LED7的占空tU08 duty_led_buf0 ; //缓冲tU08 duty_led_buf1 ; //缓冲tU08 duty_led_buf2 ; //缓冲tU08 duty_led_buf3 ; //缓冲tU08 duty_led_buf4 ; //缓冲tU08 duty_led_buf5 ; //缓冲tU08 duty_led_buf6 ; //缓冲tU08 duty_led_buf7 ; //缓冲while(1) //无限循环{duty_led0 = 0 ;duty_led1 = 0 ;duty_led2 = 0 ;duty_led3 = 0 ;duty_led4 = 0 ;duty_led5 = 0 ;duty_led6 = 0 ;duty_led7 = 0 ;duty_led_buf0 = 1 ;duty_led_buf1 = 2 ;duty_led_buf2 = 4 ;duty_led_buf3 = 200 ;duty_led_buf4 = 4 ;duty_led_buf5 = 2 ;duty_led_buf6 = 1 ;duty_led_buf7 = 0 ;//P1_0 = LED_ON ;//P1_1 = LED_ON ;//P1_2 = LED_ON ;//P1_3 = LED_ON ;for ( j = 0 ; j<50 ; j++ ) //调节流水灯间隔时间{for ( i = 0 ; i<5 ; i++ ) //调节流水灯速度{//根据占空比,控制每个LED的亮度for ( t_jsq = 0 ; t_jsq <200 ; t_jsq ++ ){if ( t_jsq < duty_led0 ) P0_0 = LED_ON ; else P0_0 = LED_OFF ; if ( t_jsq < duty_led1 ) P0_1 = LED_ON ; else P0_1 = LED_OFF ; if ( t_jsq < duty_led2 ) P0_2 = LED_ON ; else P0_2 = LED_OFF ;if ( t_jsq < duty_led3 ) P0_3 = LED_ON ; else P0_3 = LED_OFF ; if ( t_jsq < duty_led4 ) P0_4 = LED_ON ; else P0_4 = LED_OFF ; if ( t_jsq < duty_led5 ) P0_5 = LED_ON ; else P0_5 = LED_OFF ; if ( t_jsq < duty_led6 ) P0_6 = LED_ON ; else P0_6 = LED_OFF ; if ( t_jsq < duty_led7 ) P0_7 = LED_ON ; else P0_7 = LED_OFF ;}}//占空队列移动duty_led0 = duty_led1 ;duty_led1 = duty_led2 ;duty_led2 = duty_led3 ;duty_led3 = duty_led4 ;duty_led4 = duty_led5 ;duty_led5 = duty_led6 ;duty_led6 = duty_led7 ;duty_led7 = duty_led_buf0 ;duty_led_buf0 = duty_led_buf1 ;duty_led_buf1 = duty_led_buf2 ;duty_led_buf2 = duty_led_buf3 ;duty_led_buf3 = duty_led_buf4 ;duty_led_buf4 = duty_led_buf5 ;duty_led_buf5 = duty_led_buf6 ;duty_led_buf6 = duty_led_buf7 ;duty_led_buf7 = 0 ;}//delay(65535); //延时}}//--------------------------------------------------------//// THE END//// 版权所有:程序匠人(引用者请保留原作者姓名)////--------------------------------------------------------。

PWM控制LED渐亮与渐灭

PWM控制LED渐亮与渐灭

PWM控制LED渐亮与渐灭发表于2007/7/31 20:21:09;设计思路:用定时器中断产生最小时间单位T0,每m个T0组成一个子周期T10,其中前n个T0为LED导通时间,即Ton=n*T0,则Toff=(m-n)*T0;每X个T10组成一个母周期T20,其中前y个T10为有效控制时间,后续的(x-y)个T10令LED熄灭或者子周期占空比调至最小。

;适当调节n/m和x/y的比例使显示效果达到最佳。

;以下是刚刚调试通过的小段程序,显示效果良好。

;实验过程本人有一种推测,不知是否成立:;子周期的最小占空比的宽度应大于LED的点亮时间,即点亮LED的时间宽度n/m*T0应足够产生余辉。

类似于动态数码管对点亮时间的要求。

;母周期的宽度应小于1/50s,提高刷新频率以令肉眼察觉不出闪烁。

;未经验证的推测,可能是错误的,请大家接着探讨。

;芯片: AT89C2051;晶振:18.9375;电路描述:输入5V电源,简易RC复位,P3.3对地接KEY(减1),P3.3对地接KEY2(加1),P3.7接三极管C106驱动LED。

LED直径5mm,红色。

限流电阻471、1/4W.;功能描述:LED渐亮渐灭。

按住KEY可以保持住当前某占空比的亮度(如一开始按住KEY再通电,将看到空度比为1%的亮度)。

;调节子周期和母周期,均可渐亮渐灭。

同时按下“加1”和“减1”按键切换选择调节对象(2004.11.04) LED BIT P3.7KEY BIT P3.3SOV BIT 20H.0 ;子周期显示完毕标志BOV BIT 20H.1 ;母周期显示完毕标志SSS EQU 30H ;子周期占空宽度调节T10 EQU 31H ;子周期宽度AAA EQU 32H ;子周期占空宽度入口BBB EQU 33H ;母周期占空宽度入口T20 EQU 34H ;母周期宽度MMM EQU 35H ;母周期占空宽度调节A10 EQU 36H ;子周期宽度缓冲B20 EQU 37H ;母周期宽度缓冲KEY2 BIT P3.2COM1 BIT P3.5COM2 BIT P3.4COM3 BIT P3.1COM4 BIT P3.0NOISE1 EQU 38HNOISE2 EQU 39HNOISE3 EQU 3AHORG 00HLJMP MAINORG 0BHLJMP PWMPWM:MOV TH0,#0FFHMOV TL0,#90HPUSH ACC;#################################################### JB BOV,OUTLOW;*********************************************JB SOV,IFSENDDEC T10 ;保持计数同步DJNZ SSS,LRET ;占空参数修正MOV SSS,AAA ;复原子周期占空参数MOV A,T10CJNE A,#0,SCTN ;对占空比为100%时的修正AJMP T10ENDSCTN:CLR LEDSETB SOVAJMP LRETIFSEND:DJNZ T10,LRETT10END:MOV T10,A10 ;复原子周期宽度参数SETB LEDCLR SOV ;子周期处理完毕;**********************************************DEC T20DJNZ MMM,LRETMOV MMM,BBBCJNE A,#0,MCTN ;对占空比为100%时的修正AJMP T20ENDMCTN:CLR LEDSETB BOVAJMP LRETOUTLOW:CLR LED ;母周期低电平部分输出0DJNZ T10,LRET MOV T10,A10DJNZ T20,LRETT20END:MOV T20,B20SETB LEDCLR BOV ;母周期处理完毕;#############################LRET:POP ACCRETIMAIN:MOV P3,#00001100BMOV TMOD,#01HMOV A10,#10 ;子周期宽设置MOV B20,#20 ;母周期宽设置MOV T10,A10MOV T20,B20MOV AAA,#6 ;子周初始占空宽度设置MOV BBB,#20 ;母周初始占空宽度设置MOV SSS,AAAMOV MMM,BBBSETB ET0SETB TR0SETB EASETB LEDMOV 20H,#0;所有标志位清零MOV R1,#2 ;每隔0.07*250*2ms调节一次亮度FREE: ;KEY BBBBBBBBBBBBBBBBBBBBBBBBBBBB MOV PCON,#1CHANGE2:JB KEY,CHOU1JB KEY2,CHOU1DJNZ NOISE1,FREEJNB KEY,$JNB KEY2,$AJMP FREE3CHOU1:MOV NOISE1,#0DOWN1:JB KEY,UP1DJNZ NOISE2,FREEDJNZ BBB,NEXT ;减1修正MOV BBB,#1NEXT:JB KEY,FREE ;操作完成后待松键再退出JNB KEY2,FREESJMP NEXTUP1:MOV NOISE2,#0IFUP:JB KEY2,LCRNOSDJNZ NOISE3,FREEINC BBB ;加1修正MOV A,BBBCJNE A,#21,NEXT2MOV BBB,#20NEXT2:JB KEY2,FREE ;操作完成后待松键再退出JNB KEY,FREESJMP NEXT2LCRNOS:AJMP FREE ;KEY BFREE3: ;KEYMOV PCON,#1CHANGE1:JB KEY,CHOU2JB KEY2,CHOU2DJNZ NOISE1,FREE3JNB KEY,$JNB KEY2,$AJMP FREECHOU2:MOV NOISE1,#0DOWN2:JB KEY,UP2DJNZ NOISE2,FREE3DJNZ AAA,NEXT3 ;减1修正MOV AAA,#1NEXT3:JB KEY,FREE3 ;操作完成后待松键再退出JNB KEY2,FREE3SJMP NEXT3UP2:MOV NOISE2,#0IFUP2:JB KEY2,LCRNOS2DJNZ NOISE3,FREE3INC AAA ;加1修正MOV A,AAACJNE A,#11,NEXT4MOV AAA,#10NEXT4:JB KEY2,FREE3 ;操作完成后待松键再退出JNB KEY,FREE3SJMP NEXT4LCRNOS2:MOV NOISE3,#0AJMP FREE3 ;END系统分类: 单片机用户分类: pwm脉宽调制标签: pmw来源: 转贴发表评论阅读全文(812) | 回复(0)3用单片机产生正玄波信号的方法发表于2007/7/31 19:25:55一、定时/计数器PWM设计要点根据PWM的特点,在使用ATmega128的定时/计数器设计输出PWM时应注意以下几点:1.首先应根据实际的情况,确定需要输出的PWM频率范围,这个频率与控制的对象有关。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

;控制P1口LED灯渐亮和渐暗程序
ORG 00H
JMP MAIN
ORG 30H
MAIN:
MOV A,#0
CALL LOOP ;由暗变亮子程序
MOV P1,#0FFH ;关灯,全暗
MOV A,#0
CALL LOOP2 ;由亮变暗子程序
MOV P1,#0 ;开灯,全亮
JMP MAIN
;以下一段为由暗变亮的子程序,变化程度共255级,由两段程序组成,一段点亮,时间
值由A中的数决定
;另一段将A取反后作延时时间值,这样无论A是什么值,每个周期时间相等,但点亮和关
闭的值就不断变化
;类似一个频率一定,占空比可调的方波,从
而实现灯光由暗到亮.
LOOP:
;这一段为点亮灯的延时
MOV P1,#0 ;把灯点亮
INC A ;A的值加1
CJNE A,#0FFH,E2 ;A还没有加到FF,跳转E
2
E1:JMP OVER ;A加到了FF,结束返回E2:MOV R7,A ;A的值存入R7
D1:MOV R6,#30 ;延时子程序
DJNZ R6,$
DJNZ R7,D1 ;R7-1不为零就转D1,这里R7即上面预置的A值,用在这里,就是每次延时
时间不同,有255级
MOV P1,#0FFH ;延时时间到,送所有灯
;这一段为关掉灯的延时,两段相加,组成占空比可变的方波输出控制灯由暗到亮
CPL A ;A的值取反,
MOV R7,A
D2:MOV R6,#30 ;延时子程序
DJNZ R6,$
DJNZ R7,D2
CPL A ;再取反,恢复原来的值
JMP LOOP ;跳回循环
OVER:RET
;以下为由亮变暗子程序,原理与上面一样.
LOOP2:
MOV P1,#0FFH
INC A ;程序运行到此,A的值为0,经这一
步后为1
CJNE A,#0FFH,W2
W1:JMP OVER2
W2:
MOV R7,A
D11:MOV R6,#30
DJNZ R6,$
DJNZ R7,D11
MOV P1,#0
CPL A
MOV R7,A
D22:MOV R6,#30
DJNZ R6,$
DJNZ R7,D22
CPL A
JMP LOOP2
OVER2:RET
END
#include <A T89X52.h>
sbit LED = P0 ^ 0;
void delay (unsigned int d){ //延时功能函数,由d决定延时长度
unsigned char i;
while( --d != 0){
for(i = 0; i < 2; i++);
}
}
void main (void){
unsigned char a,c,b;//a控制延时长度b控制循环周期
while (1){
LED = 1;
a = 0x00;
for (b=250; b>0; b--){
a++;
c=a;
delay (c); //延时长度随a而改变
LED = 0;
c = ~c;
//a值取反,决定灯灭时的占空比
delay (c);
LED = 1;
c = ~c;
//a值取反使a回到原值继续循环
}
/*LED = 0;
//亮起LED
a = 0x00;
for (b=250; b>0; b--){
a++;
c=a;
delay (c);
LED = 1;
c = ~c;
delay (c);
LED = 0;
c = ~c;
}
LED = 1;*/
}
}
蓝色是由暗变亮。

相关文档
最新文档