单片机控制LED灯点亮(C语言)(精)
- 格式:doc
- 大小:4.00 MB
- 文档页数:23
1 例子 1 第二个灯亮#include<>void main(){P1=0xfd;}#include<>Sbit D1=P1^0;Void main(){D1=0}注意:略微改程序时需从头例子 2 第一个灯亮hex 化#include<> include<>// 52 单片机头文件sbit led1=P1^0;// 单片机管脚位申明void main()// 主函数{unsigned int i; //定义一个int型变量while(1){i=50000; led1=0;// 变量赋初值为// 点亮灯50000while(i--);// 延时i=50000;led1=1;// 熄灭灯while(i--);}}3 例子 1 3 5 7 灯同时亮#include<> //52 单片机头文件sbit led1=P1^0;// 单片机管脚位申明sbit led3=P1^2;// 单片机管脚位申明sbit led5=P1^4;// 单片机管脚位申明sbit led7=P1^6;// 单片机管脚位申明void main()// 主函数{led1=0; led3=0; led5=0; led7=0;// 将单片机口清零// 将单片机口清零// 将单片机口清零// 将单片机口清零while(1);// 程序停止在这里,在后边会讲到为何这样写。
}例子 2 1 3 5 7 同时亮#include<> //52 单片机头文件void main()// 主函数{P1=0xaa; while(1);// 将单片机P1 口的 8 个口由高到低分别赋值为// 程序停止在这里,在后边会讲到为何这样写。
}例子 3 流水灯一个一个接着亮不循环#include<> //52 单片机头文件void main(){// 主函数unsigned int i; //定义一个int型变量while(1){i=50000; P1=0xfe; while(i--); i=50000; P1=0xfd; while(i--); i=50000; P1=0xfb; while(i--); i=50000; P1=0xf7; while(i--); i=50000; P1=0xef; while(i--); i=50000; P1=0xdf; while(i--); i=50000; P1=0xbf; while(i--); i=50000; P1=0x7f; while(i--);// 变量赋初值为// 点亮第一个灯// 延时// 变量赋初值为// 点亮第二个灯// 延时// 变量赋初值为// 点亮第三个灯// 延时// 变量赋初值为// 点亮第四个灯// 延时// 变量赋初值为// 点亮第五个灯// 延时// 变量赋初值为// 点亮第六个灯// 延时// 变量赋初值为// 点亮第七个灯// 延时// 变量赋初值为// 点亮第八个灯// 延时5000050000500005000050000500005000050000}}例子 4#include<>#include <>#define uint unsigned int#define uchar unsigned charuchar temp,num,num1;sbit beep=P2^3;void delay(uint);void main(){temp=0xfe;while(1){for(num1=0;num1<3;num1++){for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_crol_(temp,1);P1=0xff;beep=1;delay(100);}}for(num1=0;num1<3;num1++){for(num=0;num<8;num++){P1=temp;beep=0;delay(100);temp=_cror_(temp,1);P1=0xff;beep=1;delay(100);}}while(1);}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}4延时子程序void delay(){uint x;for(x=100;x>0;x--){} ;}For 的嵌套void delay(){uint x,y;%局部变量for(x=100;x>0;x--)%小括号后不加分号for(y=600;y>0;y--);%小括号后的分号表示该语句是上一条语句的,分号将该句与下句分开 (或许 {for(y=600;y>0;y--);})#include<>例子 1#include<>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;void delay();%注意分号不可以少void main(){while(1){D1=0;delay();D1=1;delay();}}void delay(){uint x,y;for(x=100;x>0;x--)for(y=600;y>0;y--);}带参数的比不带参数的要方便例子 2 无参和有参的对照#include<>#define uint unsigned int#define uchar unsigned charsbit D1=P1^0;//void delay();void delay(uint);% 带一个参数的,参数种类一定要写,参数可不写。
单片机交替闪烁灯代码单片机在电子设备中起着至关重要的作用,它能够控制各种不同的电路和外部设备。
其中,控制LED灯进行交替闪烁是单片机的常见应用之一。
本文将介绍一种单片机交替闪烁灯的代码,并给出相应的格式。
该代码使用C语言编写,基于Keil C51编译器,并使用STC89C52单片机进行控制。
```c#include <reg52.h>// 定义延时函数void delay(unsigned int t) {while(t--);}// 主函数void main(){// 设置端口P1和P2为输出口P1 = 0x00;P2 = 0x00;// 无限循环while(1) {// P1灭,P2亮P1 = 0x00;P2 = 0xFF;// 延时delay(50000);// P1亮,P2灭P1 = 0xFF;P2 = 0x00;// 延时delay(50000);}}```根据上述代码,我们可以看到,交替闪烁灯的实现非常简单。
在主函数中,我们首先将单片机的P1口和P2口设为输出。
然后,在一个无限循环中,我们将P1口置为低电平(灯灭),P2口置为高电平(灯亮),并延时一段时间。
接下来,我们将P1口置为高电平(灯亮),P2口置为低电平(灯灭),再次延时一段时间。
通过循环这两个步骤,就可以实现交替闪烁效果。
这段代码使用了一个延时函数来控制灯的闪烁频率。
在delay函数中,我们使用了一个循环来模拟延时。
延时时间的长短,可以通过调整循环次数来实现。
50000这个值只是一个示例,您可以根据实际需要进行调整。
在实际应用中,单片机交替闪烁灯可以用于各种情景,例如警示灯、信号灯等。
无论是在家庭电器中还是在工业设备中,这种闪烁效果都能够起到引人注目的作用。
以上是单片机交替闪烁灯的代码,您可以根据实际需要进行修改和扩展。
单片机的应用非常广泛,掌握它的原理和编程能够为您在电子领域的学习和工作带来很大的帮助。
祝您在单片机的探索中取得成功!。
实验二控制 LED 灯点亮实验一、实验目的1.. 进一步熟悉单片机编程和程序调试方法2. 学习 P1口的使用方法3. 学习延时子程序的编写和应用二、实验内容1.让实验板上的第 1、 3、 5、 7位置上的灯与第 2、 4、 6、 8位置上的灯交替闪烁。
2、设计出如下要求的流水灯程序。
变化要求:先从第 4个灯向左逐个点亮,接着从第 5个灯向右逐个点亮,然后, 从第 1个向右、第 8个向左同时开始的向内逐个点亮再从中间向两边逐个点亮的。
三、实验相关说明1、实验电路原理图100注意:在实验报告中,请画出实际运行你程序的电路的原理图2、 LED 灯控制。
从电路原理图可看到 ,当 P1 .0端口输出高电平,即 P1.0=1时 ,发光二极管 L1熄灭;当 P1 .0输出低电平即 P1 .0=0时, L 1亮;在汇编语言里可用 SETB P1.0指令使 P 1. 0端口输出高电平 ,用 CLR P1.0指令使 P1 .0 端口输出低电平, 从而控制 LED 的亮、灭。
注意:实验板是用哪个口连接了 LED 。
3.延时子程序的设计、应用单片机指令的执行时间很短,时间在微秒级,因此,如果我们想看灯闪烁, 那么就必须在用指令控制灯处于亮或灭的状态后, 保证那状态维持一段时间后再转换成另一状态。
如何做到维持一段时间呢?方法有很多, 其中最易实现的一种方法是:通过插入一段程序, 每条指令执行都需要 1个或若干个机器周期的时间。
因而执行完这段程序就过了一段时间, 通常把这称为延时。
延时程序一般采用单重或多重循环程序。
可以根据需要延时的时间来设计这段程序包含哪些指令、循环次数。
设计举例如下:若单片机晶振为 12MHz ,因此,则单片机的 1个机器周期为 1微秒,则下面这段循环程序中每条指令执行所需的机器周期数及其要花的时间列在下面。
机器周期微秒MOV R6,#20 2个机器周期 2D1: MOV R7,#248 2个机器周期 2×20DJNZ R7,$ 2个机器周期 2×248×20DJNZ R6,D1 2个机器周期 2×20=4010002 因此,上面的延时程序时间为10.002ms 。
单片机实验——利用中断控制LED灯1.实验目的(1掌握单片机中断的基本原理。
(2掌握单片机中断程序的编制方法。
2.预习要点(1单片机中断基本原理(2中断程序编制方法3.实验设备计算机、单片机实验箱、信号发生器。
4.实验内容基本要求:将信号发生器输出的脉冲信号连接到CPU的INT0上,将CPU的P1.0到P1.7和八个LED连接,脉冲信号为5V、100Hz,每输入一百个脉冲LED灯亮一次,并且LED灯顺序循环移位一次,形成跑马灯。
扩展要求:提高输入脉冲频率,但跑马灯的显示频率不变。
实验4ORG 0000HAJMP MAIN;******************************************;中断子程序入口地址ORG 0003HLJMP EXINT0;******************************************;主程序ORG 0030HMAIN:MOV SP,#70HSETB IT0 ;设置为下降沿触发SETB EX0 ;开INT0的中断开关SETB EA ;开总中断开关MOV R0,#01H ;只让一盏灯亮,R0赋给P1口MOV R3,#00H ;R3用来记中断次数MOV A,R0MOV P1,AHERE:SJMP HERE ;死循环,还有另外一种形式是SJMP $ ;******************************************;外中断0服务程序EXINT0:INC R3 ;每来一次中断R3自加1CJNE R3,#100,NEXT ;当来了100次中断之后,R3清零,然后P1口的MOV R3,#00H ;数左移一位,也就是让下一个LED亮MOV A,R0RL AMOV P1,AMOV R0,A ;保存左移之后的结果NEXT:RETI;******************************************END实验4扩展ORG 0000HAJMP MAIN;******************************************;中断入口地址ORG 0003HLJMP EXINT0;******************************************;主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断0SETB IT0SETB EX0SETB EA;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9 ;这一句后面的CJNE会用到,用来判断1-8是否已经显示完了MOV R2,#00H ;用R2来记中断来的次数MOV 40H,#01H ;用40H存放LED的状态MOV A,40HMOV P1,AMOV R0,#30H ;显示缓存区首地址给R0MOV R4,#0FEH ;字位送R4,因为只需要亮一个数码管,所以选择静态显示,没必要用动态显示LOOP:LCALL DISPLAY ;循环调用显示程序SJMP LOOP;******************************************;中断子程序EXINT0:INC R2CJNE R2,#100,NEXT ;来100次中断之后才进行操作MOV R2,#00HMOV A,40H ;移动LEDRL AMOV P1,AMOV 40H,AINC R0 ;让显示的数+1CJNE @R0,#9,NEXT ;如果到了9就回到1,因为我们只显示1-8 MOV R0,#30HNEXT:RETI;******************************************;显示子程序DISPLAY:MOV DPTR,#0102H ;送字位MOV A,R4MOVX @DPTR,AMOV DPTR,#DTAB ;查表,送字形MOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAYLD1:RET;****************************************** ;字形表DTAB:DB 3FH,06H,5BH,4FH,66HDB 6DH,7DH,07H,7FH,6FH ;0-FDB 77H,7CH,39H,5EH,79HDB 71H;****************************************** ;延时1ms子程序DELAY:MOV R7,#02HDEL1:MOV R6,#0FFHDEL2:DJNZ R6,DEL2DJNZ R7,DEL1RET;****************************************** ENDORG 0000HAJMP MAIN;中断入口地址ORG 0003HLJMP EXINT0;******************主程序ORG 0030HMAIN:MOV SP,#70H;初始化外中断0SETB IT0SETB EX0SETB EA;初始化8155MOV DPTR,#0100HMOV A,#03HMOVX @DPTR,A;显示缓存区MOV 30H,#1MOV 31H,#2MOV 32H,#3MOV 33H,#4MOV 34H,#5MOV 35H,#6MOV 36H,#7MOV 37H,#8MOV 38H,#9MOV 40H,#01H ;用40H存发光二极管的状态MOV R2,#00HMOV A,40HMOV P1,AMOV R0,#30HMOV R4,#0FEHLOOP:LCALL DISPLAY SJMP LOOP;************************* ;中断子程序EXINT0:INC R2CJNE R2,#100,NEXTMOV R2,#00HMOV A,40HRL AMOV P1,AMOV 40H,AINC R0CJNE @R0,#9,NEXT1MOV R0,#30HNEXT1:MOV A,R4RL AMOV R4,ANEXT:RETI;显示子程序DISPLAY:MOV A,R4MOV DPTR,#0102HMOVX @DPTR,AMOV DPTR,#DTABMOV A,@R0MOVC A,@A+DPTRMOV DPTR,#0101HMOVX @DPTR,ALCALL DELAY LD1:RET ;字形表 DTAB: DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH ;延时 1ms 子程序 DELAY: MOVR7,#02H DEL1:MOV R6,#0FFH DEL2:DJNZ R6,DEL2 DJNZ R7,DEL1 RET END ;说明: ;R4 是保存数码管字位 ;R3 ;R2 是保存中断次数满 100 清 0 ;R1 ;R0 是保存数码管的字型实验 5(1 ORG 0000H SJMPMAIN ;****************************************8*********** ;中断入口地址ORG 000BH LJMP T0INT ;************************************************ ;主程序 ORG 0030H MAIN:MOV SP,#70H MOV TMOD,#01H ;T0 选择方式 1,16 位定时器 MOV TH0,#0F6H ;#9EH ;因为用示波器观察 20HZ 的方波不易观察,频率太低了,所以我换成了 MOV TL0,#3CH ;#58H ;200HZ 的,原理都是一样的,这样只是为了让波形更容易观察,后者是 20HZ 的初值 SETB EA ;开总中断 SETB ET0 ;开定时器 0 中断 SETB TR0 ;启动定时器 0 SJMP$ ;死循环 ;********************************************************;定时器 0 中断子程序 (25ms 2.5ms 来一次中断 T0INT:MOV TH0,#0F6H ;#9EH ;重新赋初值 MOV TL0,#3CH ;#58H CPL P1.1 ;改变电平RETI ;******************************************************。