51单片机闪烁灯

合集下载

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

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

51单片机控制LED灯程序设计首先,我们需要明确要使用到的硬件资源和引脚连接情况。

假设我们使用的是STC89C51单片机,LED灯的正极连接到单片机的P1口,负极通过电阻连接到地。

接下来,我们需要了解一些基本的汇编指令和编程规范。

在编写51单片机程序时,需要使用到一些特定的寄存器和指令。

首先是P1寄存器,它用来控制P1口的输出和输入状态。

然后是MOV指令,这是一个用来将数据从一个寄存器复制到另一个寄存器的指令。

最后是一个延时函数,可以利用循环来实现延时。

首先,我们需要初始化P1口为输出状态。

在51单片机中,IO口可以被配置为输入(1)或输出(0)。

我们可以使用MOV指令将0赋值给P1寄存器,将其配置为输出。

此外,我们还需要一个简单的延时函数,来控制LED灯的亮灭时间。

下面是一个基本的51单片机控制LED灯的程序:```assemblyORG0;程序的起始地址MOVP1,;初始化P1口为输出状态LOOP:;主循环MOVP1,;将P1的状态置为0,LED灯灭ACALLDELAY;调用延时函数,延时一段时间MOVP1,;将P1的状态置为1,LED灯亮ACALLDELAY;调用延时函数,延时一段时间JMPLOOP;无限循环DELAY:;延时函数MOVR3,;初始化循环计数器为250LOOP1:MOVR2,;初始化循环计数器为250LOOP2:MOVR1,;初始化循环计数器为250LOOP3:DJNZR1,LOOP3;内层循环DJNZR2,LOOP2;中层循环DJNZR3,LOOP1;外层循环RET;返回主程序```以上是一个简单的51单片机控制LED灯的汇编程序。

程序中通过不断切换P1口的状态来实现LED灯的亮灭。

同时,通过调用延时函数来实现亮灭的时间间隔。

在主循环中,LED灯会亮和灭各一段时间,然后无限循环。

为了将以上汇编程序烧录到单片机中,需要将其汇编为二进制文件。

通常可以使用Keil C等开发工具进行汇编和烧录操作。

单片机实验报告—— LED灯闪烁

单片机实验报告—— LED灯闪烁

XXXX学院实验报告Experimentation Report of Taiyuan Normal University系部计算机年级大三课程单片机原理与接口技术姓名同组者日期2019.10.31 学号项目 LED闪烁一、实验目的1、了解单片机顺序执行的特点;2、掌握51单片机开发板所需软件的安装过程;3、以LED灯闪烁为例子,掌握C语言的编写和keilc51的使用;二、实验仪器硬件资源:单片机开发板笔记本电脑;软件资源:软件 Keil uVision5、USB驱动程序;三、实验原理1、流程图2、连接图四、实验结果点击运行按钮,LED灯先全部熄灭,隔一段时间,LED灯亮,再隔一段时间,LED灯全部熄灭,LED灯亮灭循环,直到点击复位按钮才结束。

五、实验代码及分析#include <reg51.h> //此文件中定义了51的一些特殊功能寄存器//--定义全局函数--//void Delay10ms(unsigned int c); //延时10ms* 函数名 : main* 函数功能 : 主函数* 输入 : 无* 输出 : 无void main(){while(1){//--数字前面加0x表示该数是十六进制的数,0x00就是十六进制的00--////--P0口一共有8个IO口,即从P0.0到P0.7,而0x00二进制就是0000 0000--////--效果就是P0.0到P2.7都是0,即低电平。

而如果你想给P0.1口赋高电平时--////--二进制就是0000 0001,就是十六进制0x01.--//P0 = 0x00; //置P0口为低电平,LED灯先熄灭Delay10ms(50); //调用延时程序,修改括号里面的值可以调整延时时间P0 = 0xff; //置P0口为高电平,LED灯亮Delay10ms(50); // 调用延时程序}}* 函数名 : Delay10ms* 函数功能 : 延时函数,延时10ms* 输入 : 无* 输出 : 无void Delay10ms(unsigned int c) //误差 0us{unsigned char a, b//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//for (;c>0;c--){for (b=38;b>0;b--){for (a=130;a>0;a--);}}}六、心得体会通过此次试验我了解单片机顺序执行的特点,掌握51单片机开发板所需软件的安装过程,通过LED灯闪烁这个例程,我初步了解了Keilc51使用。

51单片机彩灯控制器的设计

51单片机彩灯控制器的设计

51单片机彩灯控制器的设计一、设计目的单片机彩灯控制器是一种能够通过控制程序实现RGBLED灯光颜色和亮度变化的设备。

其设计目的是实现LED的多彩灯光效果,丰富室内环境,提高生活品质。

二、硬件设计1.单片机选择在设计彩灯控制器时,我们选择了常用的8051单片机作为控制芯片。

8051单片机拥有丰富的外设资源,易于编程控制,并且具有较高的稳定性和可靠性。

2.RGBLEDRGBLED是一种由红、绿和蓝三个LED灯组成的组合灯,可以通过控制不同颜色的LED来实现丰富多彩的灯光效果。

在设计中,我们选用了高亮度的RGBLED,以确保灯光效果的良好。

3.驱动电路为了驱动RGBLED,我们设计了一套驱动电路,其中包括三个恒流驱动电路和三个PWM调光电路。

恒流驱动电路可以确保LED的电流稳定,而PWM调光电路可以实现LED的亮度调节。

4.控制电路控制电路主要由单片机、按键、显示屏等组成。

通过单片机控制按键输入,并根据用户需求调整LED的颜色和亮度。

同时,显示屏可以实时显示LED的参数信息,方便用户操作。

5.电源彩灯控制器的电源一般采用直流5V供电,可以通过USB接口或者外部电源适配器来供电,以满足不同环境下的使用需求。

三、软件设计1.系统架构我们将彩灯控制器的软件设计分为三个模块:按键输入模块、LED控制模块和显示模块。

按键输入模块负责接收用户的按键输入,LED控制模块根据用户输入控制LED的颜色和亮度,显示模块实时显示LED的参数信息。

2.按键输入模块按键输入模块主要负责检测用户按键的状态,并根据按键的状态进行相应的处理。

例如,当用户按下“颜色+/颜色-”按键时,按键输入模块会向LED控制模块发送指令,控制LED颜色的变化。

3.LED控制模块LED控制模块负责控制RGBLED的颜色和亮度。

当接收到按键输入模块发送的指令时,LED控制模块会根据指令调节LED的PWM值,实现LED 颜色的变化和亮度的调节。

4.显示模块显示模块通过显示屏实时显示LED的参数信息,包括LED的颜色、亮度等参数。

单片机应用技术项目2 闪烁灯

单片机应用技术项目2 闪烁灯
项目2 闪烁灯
知识目标:
1.掌握51单片机并行输入/输出(I/O)端口的结构和功能;
2.掌握P0、P1、P2、P3口的操作方法; 3.理解单片机的时钟和时序; 4.掌握C语言源程序结构; 5.掌握C语言基本语句; 6.重点掌握循环语句while、do…while、for的语法特点; 7.掌握延时程序设计和调试方法。
1. 表达式语句就是一个表达式加上一个分号。
其一般形式如下:
表达式; 执行表达式语句就是计算表达式的值 如:a++; x=1; 2. 空语句 用一个分号表示,其一般形式为:

程序执行空语句时需要占用一条指令的执行时间,但是什么也不做。 在C51程序中常常把空语句作为循环体,用于消耗CPU
时间等待事件发生的场合。
当f =6MHz时,时钟周期=1/ f =1/6µs,机器周期
=(1/6)×12µs=2µs 当f=12MHz时,时钟周期=1/f=1/12µs,机器周期 (1/12)×12µs=1µs
C基本语句
C语言的语句可分为以下五种:


表达式语句
空语句 复合语句


选择语句Biblioteka 循环语句表达式语句和空语句
复合语句(程序块) 示例
/*P1口8个LED灯依次点亮*/ main( ) {
图2- 4时钟周期、机器周期、指令周期之间的关系图
时钟周期、机器周期、指令周期的计算
【例2-1】MCS-51的时钟周期、机器周期、指令周期是如何分配的
?当晶振频率分别为6MHz和12MHz时,一个机器周期为多少µs?
解:MCS-51单片机每个状态周期包含2个时钟周期,1个机器周期有 6个状态周期,每条指令的执行时间(即指令周期)为1~4个机器周期。

51单片机闪灯

51单片机闪灯

51单⽚机闪灯上⼀篇写了点亮⼀个灯,这⼀篇写⼀下闪⼀个灯⾸先,流⽔灯实现起来就是⼀个⼀个点灯,中间加⼊⼀个延时就⾏了我们先实现闪⼀个灯,从上⼀个代码添加⼀些代码即可完成最重要的就是这个延时函数的实现,我们是通过不精准延时,单⽚机啥也不⼲在计数实现这⾥同时可以再讲讲while的⽤法unsigned int count = 0;while(count <= 50000){count = count + 1;}这样就是通过单⽚机不停计数来实现延时(具体延时多久,不⽤太在意)加⼊到代码实现闪灯#include "reg52.h"sbit D1 = P2^0;unsigned int count = 0;void main(void){while(1){D1 = 0;//灯亮while(count <= 50000){count = count + 1;}D1 = 1;//灯灭while(count <= 50000){count = count + 1;}}}这样就能实现闪灯了吗?想想应该可以,下载进去看下效果这⾥说道下载就要提⼀下,⽣成下载hex⽂件点击魔法棒点击选项卡output,勾选上,点击确定然后最重要的是要在编译⼀次,下⾯输出这个创建了hex⽂件到⼯程⽬录的\Objects\led.hex这个⽂件了,下载就不说了下载进去发现,咦,怎么不⾏,仔细看⼀下就能分析出来是变量没有清零了 = =!改⼀改#include "reg52.h"sbit D1 = P2^0;unsigned int count = 0;//unsigned int 范围0到65535void main(void){while(1){D1 = 0;//灯亮count = 0;while(count <= 50000){count = count + 1;}D1 = 1;//灯灭count = 0;while(count <= 50000){count = count + 1;}}}下载进去发现可以了,这⾥我们举⼀反三,如果要实现灭灯是亮灯时间的⼀半怎么写?只要稍微改改⼀个数就⾏了,主要是根据需求来,这个清零是根据需求决定的,并不⼀定就要清零(应该明⽩我的意思吧)#include "reg52.h"sbit D1 = P2^0;unsigned int count = 0;//unsigned int 范围为0到65535void main(void){while(1){D1 = 0;//灯亮count = 0;while(count <= 50000){count = count + 1;}D1 = 1;//灯灭count = 25000;while(count <= 50000)//这⾥因为初始值是从25000开始的所以时间是灯亮的⼀半时间{count = count + 1;}}}这⾥发现这个地⽅有重复的语句,重复的语句可以⽤函数写下来,直接调⽤,会更加简单上⼀章讲了函数是酱紫的,我们就来确定这些东西返回值函数名(参数){ 函数体}⾸先我们来确定最难的函数名,就叫delay吧,函数名和变量名尽量取得有意义⼀点,⼀看就明⽩是⼲嘛的返回值和参数都先为空就void咯然后把重复的东西复制到函数体⾥⾯void delay(void){count = 0;while(count <= 50000){count = count + 1;}}总体就是#include "reg52.h"sbit D1 = P2^0;unsigned int count = 0;void delay(void){count = 0;while(count <= 50000){count = count + 1;}}void main(void){while(1){D1 = 0;//灯亮delay();D1 = 1;//灯灭delay();}}这样就实现了延时,但是如果我要实现我后⾯那个功能呢(灭灯是亮灯时间的⼀半)这⾥有很多种⽅法,我就随便举例两种⼀种是修改delay函数的赋值语句,在主函数⾥⾯赋值⼀种是函数带参数逇形式,这种是最为简便的⾃⼰⽐较⼀下第⼀种:#include "reg52.h"sbit D1 = P2^0;unsigned int count = 0;void delay(void){while(count <= 50000){count = count + 1;}}void main(void){while(1){D1 = 0;//灯亮count = 0;delay();D1 = 1;//灯灭count = 25000;delay();}}第⼆种:#include "reg52.h"sbit D1 = P2^0;void delay(unsigned int count){unsigned int i = 0;while(i <= count){i = i + 1;}}void main(void){while(1){D1 = 0;//灯亮delay(50000);D1 = 1;//灯灭delay(25000);}}⼀⽐较就知道第⼆种代码更加简洁,⽽且想要计数多少都⾏这⾥牵扯到变量的作⽤域,⼀个是全局函数⼀个是局部函数,也讲⼀讲吧【喷⾎】局部变量定义在函数内部的变量称为局部变量(Local Variable),它的作⽤域仅限于函数内部,离开该函数后就是⽆效的全局变量在所有函数外部定义的变量称为全局变量(Global Variable),它的作⽤域默认是整个程序,也就是所有的源⽂件,包括 .c 和 .h ⽂件。

51单片机闪烁灯制作

51单片机闪烁灯制作

51单片机闪烁灯制作简介:51单片机闪烁灯制作:在单片机P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭形成闪烁灯状态,一亮一灭的时间间隔为0.2秒。

1.电路原理图图4.1.12.系统板上硬件连线把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

3.程序设计内容(1). 延时程序的设计方法作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微MOV R6,#20 2个 2D1: MOV R7,#248 2个22+2×248=49820×DJNZ R7,$ 2个2×248 (498DJNZ R6,D1 2个2×20=4010002因此,上面的延时程序时间为10.002ms。

由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:DELAY: MOV R5,#20D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RET(2). 输出控制如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETBP1.0指令使P1.0端口输出高电平,使用CLRP1.0指令使P1.0端口输出低电平。

4. 程序框图5. 汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒 D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND6. C语言源程序#includesbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i0;i)for(j=20;j0;j)for(k=248;k0;k);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}完毕!您现在会不会制作自己的闪烁灯了呢?。

51单片机彩灯控制器的设计

51单片机彩灯控制器的设计

51单片机彩灯控制器的设计原题要求如下:1. 用16盏以上的LED小灯,实现至少4种彩灯灯光效果(不含全部点亮,全部熄灭);2. 可以用输入按钮在几种灯光效果间切换;3. 可以通过按钮暂停彩灯效果,使小灯全亮,再次按下相同按钮后继续之前的效果;4. 增加自动在几种效果间切换的功能,并设置一个按钮可以在自动模式和手动模式间切换;5. 使用定时中断延时。

最终作品如下:一共有十钟灯光效果,分别是:顺时针流水灯、逆时针流水灯、交替闪烁、顺时针对角灯、逆时针对角灯、顺时针逐个点亮、顺时针逐个熄灭、逆时针逐个点亮、逆时针逐个熄灭、二进制加法。

程序代码如下:/**************************************************************************************************模块名称:51单片机彩灯控制器模块功能:实现十种循环彩灯控制编写日期:2016/12/18******************************************************************************* *******************/#include <reg51.h>#define false 0#define true 1#define uchar unsigned char#define uint unsigned intsbit pause_key = P3^0; //暂停按钮sbit auto_key = P3^1; //手动模式的效果切换sbit change_key = P3^2; //手动模式效果切换sbit pauseLed = P3^6; //暂停、启动指示灯sbit autoLed = P3^7; //自动、手动模式指示灯int ledCode[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //led段码(单个显示)int ledCode2[8]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00}; //led段码(半显示半灭)int disCode[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //数码管段码0~9void displayLed(void); //显示led的主函数void keyScan(void); //键盘扫描处理函数void Delay10ms(unsigned int n); //延时10msbit isPause = false; //是否暂停bit isAuto = true; //是否自动运行bit isChange = false; //是否要切换下一个效果uchar time; //计时满0.5suchar types; //第几种灯光显示方案uint counts; //灯光的第几个/****************************************************************************** ** 函数名: T0_INT* 函数功能: T0定时器中断函数* 输入: 无* 输出: 无******************************************************************************* /void T0_INT(void) interrupt 1{TL0= (65536-50000)/256;TH0= (65536-50000)%256;time ++;if(time >= 10) //定时时间:0.5s{time=0;if(isChange == true) //可以变换下一种显示效果了{counts = 0;types++; //显示下一种效果if(types > 9) types = 0;P0 = disCode[types]; //更新数码管显示isChange = false;}displayLed();counts++;}}/****************************************************************************** ** 函数名: main* 函数功能: 主函数* 输入: 无* 输出: 无******************************************************************************* /void main(void){TMOD=0x61; //0110 0001 //方式一TL0= (65536-50000)/256; //50msTH0= (65536-50000)%256;TR0=1; //开启T0ET0=1; //T0中断允许EA=1; //总中断开启time = 0; //定时器时间扩种(0.5s)counts = 0; //灯光的第几次types = 0; //灯光显示模式pauseLed = 0; //暂停指示灯灭P0 = disCode[types]; //更新数码管显示while(1){keyScan(); //键盘扫描及处理}}/****************************************************************************** ** 函数名: keyScan* 函数功能: 键盘扫描处理* 输入: 无* 输出: 无******************************************************************************* /void keyScan(void){if(pause_key == 0) //按下了暂停按钮{Delay10ms(1);if(pause_key == 0){isPause = ~isPause;pauseLed = isPause;if(isPause == true){ET0=0; //关闭T0中断P0 = 0xfd; //数码管显示“-”P1 = 0x00; //所有的灯都亮起来P2 = 0x00;}else{ET0=1; //T0中断允许P0 = disCode[types]; //更新数码管显示displayLed();}while(pause_key == 0); //防止按键重复检测}}if(auto_key == 0) //自动、手动切换按键按下{Delay10ms(1);if(auto_key == 0){isAuto = ~isAuto;autoLed = isAuto;}while(auto_key == 0); //防止按键重复检测}if(change_key == 0 && isAuto == false) //手动模式,并且效果切换按下{Delay10ms(1);if(change_key == 0){isChange = true;}while(change_key == 0); //防止按键重复检测}}/****************************************************************************** ** 函数名: displayLed* 函数功能: 显示led灯* 输入: (全局变量)types:显示效果;counts:当前效果下的第几次* 输出: 无******************************************************************************* /void displayLed(void){switch(types){case 0: //顺时针旋转led灯{if(counts >= 16) counts = 0;if(counts >=15){if(isAuto == true) isChange = true;}if(counts <8){P1 = 0xff;P2 = ledCode[7-counts];}else{P1 = ledCode[15-counts];P2 = 0xff;}break;}case 1: //逆时针旋转LED灯{if(counts >= 16) counts = 0;if(counts >=15){if(isAuto == true) isChange = true;}if(counts <8){P1 = ledCode[counts];P2 = 0xff;}else{P1 = 0xff;P2 = ledCode[counts-8];}break;}case 2: //交叉替换{if(counts >= 16) counts = 0;if(counts >=15){if(isAuto == true) isChange = true;}if(counts % 2 == 0) //偶数{P1=0xaa;P2=0xaa;else{P1=0x55;P2=0x55;}break;}case 3: //对角顺时针{if(counts >= 8) counts = 0;if(counts >=7){if(isAuto == true) isChange = true;}P1 = ledCode[7 - counts];P2 = ledCode[7 - counts];break;}case 4: //对角逆时针{if(counts >= 8) counts = 0;if(counts >=7){if(isAuto == true) isChange = true;}P1 = ledCode[counts];P2 = ledCode[counts];break;}case 5: //顺时针逐个点亮{if(counts >= 17) counts = 0;if(counts <8){P1 = ~ledCode2[7 - counts];P2 = 0xff;}else if(counts <16){P1 = 0x00;P2 = ~ledCode2[15 - counts];else //全亮{P1 = 0x00;P2 = 0x00;if(isAuto == true) isChange = true;}break;}case 6: //顺时针逐个又灭掉{if(counts >= 17) counts = 0;if(counts <8){P1 = ledCode2[7 - counts];P2 = 0x00;}else if(counts <16){P1 = 0xff;P2 = ledCode2[15 - counts];}else //全灭{P1 = 0xff;P2 = 0xff;if(isAuto == true) isChange = true;}break;}case 7: //逆时针逐个点亮{if(counts >= 17) counts = 0;if(counts <8){P1 = 0xff;P2 = ledCode2[counts];}else if(counts <16){P1 = ledCode2[counts - 7];P2 = 0x00;}else //全亮P1 = 0x00;P2 = 0x00;if(isAuto == true) isChange = true;}break;}case 8: //逆时针逐个灭掉{if(counts >= 17) counts = 0;if(counts <8){P1 = 0x00;P2 = ~ledCode2[counts];}else if(counts <16){P1 = ~ledCode2[counts - 7];P2 = 0xff;}else //全亮{P1 = 0xff;P2 = 0xff;if(isAuto == true) isChange = true;}break;}case 9: //二进制加法{if(counts >= 255) counts = 0;if(counts == 254 && isAuto == true) isChange = true;P1 = ~counts;P2 = ~counts;break;}default:types = 0;P0 = disCode[types]; //更新数码管显示}}/****************************************************************************** ** 函数名: Delay10ms (多个)* 函数功能: 延时函数,延时n*10ms* 输入: n-延时次数* 输出: 无******************************************************************************* /void Delay10ms(unsigned int n){unsigned char a, b;for (; n>0; n--){for (b=38; b>0; b--){for (a=130; a>0; a--);}}}完整proteus仿真图如下:。

51单片机点亮一盏LED灯的原理解析

51单片机点亮一盏LED灯的原理解析

51 单片机点亮一盏LED 灯的原理解析
首先应该了解51 单片机最小系统:51 最小系统也称为51 最小应用系
统,是指用最少的元件组成的51 单片机可以工作的系统。

如图2.1.1 所示,51 最小系统一般应该包括:单片机、晶振电路、复位电路。

晶振电路的原理及组成,作用:
在单片机系统里晶振的作用非常大,他结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振的提供的时钟频率越高,那单片机的运行速度也就越快。

简单地说,没有晶振,就没有时钟周期,没有时钟周期,就无法执行程序代码,单片机就无法工作。

单片机工作时,是一条一条地从RoM 中取指令,然后一步一步地执行。

单片机访问一次存储器的时间,称之为一个机器周期,这是一个时间基准。

个机器周期包括12 时钟周期。

如果一个单选择了12MHz 晶振,它的
时钟周期是1/12us,它的一个机器周期是12&TImes;(1/12)us,也就是
1us。

组成:晶振,负载电容,内部电路。

基于51单片机的PWM调光灯设计

基于51单片机的PWM调光灯设计

摘要目前市场上的LED台灯,作为LED的绿色护眼光源产品而进行开发和研究,还是作为我国的照明推广家用型产品。

随着时代的变迁,社会的发展,节能和环保这一主题已经是当今社会必要发展的目标了、健康与人们的日常生活变得密不可分,科技的进步,也使家电更加智能化和人性化。

台灯作为家电中基础的,也是必不可少的,所以,提出PWM调光灯设计。

本设计主要是将STC89C51RC单片机作为控制核心,这是将多种功能集于一体的智能LED台灯。

该台灯具有手动、自动两种调节亮度的方式;主要的产品功能有呼吸模式、红外遥控操作等等。

硬件的设计部分为单片机控制模块、按键控制模块、照明显示模块、光敏感应模块、LED灯指示报警模块、远程遥控模块等组成。

单片机主要控制芯片型号选用STC89C51RC,LED指示报警模块选择三种颜色不同的LED指示灯来显示三种不同的工作模式,通过按键控制模块进行调整和控制工作模式和LED亮度程度,照明模块选用草帽型12白光LED,光敏感应模块采用可以对光敏信号的采集芯片ADC0832,并利用PWM调光技术对LED进行光度的自动调节。

可以通过红外遥控远距离无线遥控,通过单片机C语言编程进行软件设计,将所需的设计要求全部可以进行功能的控制。

关键词LED台灯光度PWM调光自动调节AbstractLED lamp as LED green lighting products, as the country to promote the use of green lighting products. With the development of the times,energy saving and environmental protection, health and the peopledaily life are inseparable, the progress of science and technology,also makes home appliances more intelligent and humanized. The lamp as home appliances based, so is also essential,, put forward PWM dimming the lights design.The design is based on STC89C51RC SCM as control core and multi functions in one of the intelligent LED lamp. The table lamp realizes the brightness with manual, automatic two types of regulation;respiratory mode function, but also has the function of infrared remote control. The design of the hardware part consists of MCU controlmodule, keyboard module, lighting module, photosensitive module,LED module, remote control module instruction. The MCU main control chip STC89C51RC, LED indicating module with three kinds ofdifferent colors of small LED to indicate different working modes,brightness through the key module to adjust the working mode and the LED lighting module, using 12 straw hat type white LED,photosensitive module uses ADC0832 chip implementation of a signal acquisition, automatic regulation and luminosity of LED using PWM dimming technology. Through the infrared remote control, wireless remote control, software design of the MCU C language programming,integrated control functions are realized by.Key wordLED lamp dimming automatically adjust luminosity of PWM目录第1章绪论 (5)1.1 课题研究背景 (5)1.2 系统方案的提出 (5)1.2.1 LED优势 (5)1.2.2 方案简述 (6)第2章系统方案的选择 (7)2.1 控制芯片的选择方案 (7)2.1.1 STC89C51RC (7)2.1.2 A VR单片机 (7)2.1.3 FPGA (8)2.1.4 主控制芯片的确定 (8)2.2 照明模块的选择 (8)2.2.1 三极管驱动 (8)2.2.2 PWM芯片控制 (9)2.2.3 照明方案的确定 (10)第3章硬件设计 (10)3.1 单片机STC89C51芯片简介 (10)3.2 LED驱动电路 (14)3.3 按键控制电路 (17)3.4 LED指示电路 (18)3.5自动控制电路 (18)3.5.1 光敏电路 (18)3.5.2 ADC0832模数转换 (19)第4章软件设计 (20)4.1 Keil C51 (20)4.2 Protel99SE (21)4.3 程序流程图 (22)第5章调试 (24)5.1 硬件调试 (24)5.2 软件调试 (24)第6章总结 (25)参考文献 (26)附录一:protel99se 原理图 (27)附录二:源程序 (28)前言LED照明又称固态照明,作为继白炽灯、荧光灯后的第三代照明技术,具有节能、环保、安全可靠的特点,固态显示光源是照明领域里面比较看好的发展产业,在未来十年中将传统的照明工具替换,是代表照明技术的未来。

单片机控制LED灯闪烁原理[整理]

单片机控制LED灯闪烁原理[整理]

一、电路图二、原理对于较长时间的定时,应采用复合定时的方法。

这里使T/C0工作在定时器方式1,定时100ms,定时时间到后P1.0反相,即P1.0端输出周期200ms的方波脉冲。

另设T/C1共作的计数器方式2,对T1输出的脉冲计数,当计数满5次时,定时1时间到,将P1.7端反相,改变灯的状态!三、源程序#include <reg51.h> /*头文件的定义*/000000sbit P1_0=P1^0; /* 定义p1.0端口*/00000sbit P1_7=P1^7; 000000timer0() interrupt 1 using 1 { /* 定时器0的中断服务程序*/ 000000P1_0=!P1_0; /* P1.0取反*/00000TH0=(65536-50000)/256; /* 赋高八位初值*/ 00000TL0=(65536-50000)%256; /* 赋低八位初值*/ 000000} 000000timer1() interrupt 3 using 2 { /*定时器1中断服务程序*/ 000000P1_7=!P1_7; /*p1.7取反*/000000}000000main() { /*主函数*/000000P1_7=0; /* 置灯初始灭*/000000P1_0=1; /* 保证第一次反相便开始计数*/000000TMOD=0x61; /* 定时器定时和计数*/000000TH0=(65536-50000)/256; /* 赋初值*/00000TL0=(65536-50000)%256; /* */00000TH1=256-5; 00000TL1=256-5;000000IP=0x08; /* 设置寄存器优先级*/00000EA=1; /* CPU开中断*/000000ET0=1; /* 开T/C0中断*/000000ET1=1; /* 开T/C1中断*/000000TR0=1; /* 启动T/C0 */00000TR1=1; /* 启动T/C1 */00000for(;;)/* */000000{000000}000000}000000四、Keil调试程序过程与结果:1.新建一个项目2.将led程序添加进去3.调试程序。

用51控制8个LED灯的亮灭

用51控制8个LED灯的亮灭

用51控制8个LED灯的亮灭本来以为这个程序很简单的,没想到写了快三个小时。

哎学艺不精啊。

贴出来给你研究吧。

我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样,1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态程序中使用了P1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。

程序如下:#include#include/*变量声明:i、j、k都是记录计时器溢出次数的变量,stat是记录当前显示状态的变量,由按键key控制temp是状态2中保护P1口状态的变量*/unsigned char i=0,j=0,k=0,stat=0,temp;bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯sbit key=P3^7; //按键控制void init(); //初始化函数void delay(unsigned int N); //延时函数void keyscan(); //键盘扫描函数void main(){init();while (1){switch (stat){case 0: //0方案if(i==20&&flag){i=0;P1=P1<<1; //依次亮灯temp=P1;if(temp==0){flag=0;}}if(i==20&&!flag){i=0;if(P1==0xff){flag=1;P1=0xfe;}if(!flag){P1=P1<<1; //依次灭灯temp=P1;P1=temp+1;}}break;case 1: //2方案if(i==20){i=0;P1=~P1; //去反后亮灯状态为灭灯,P1初值取0x55或0xaa,奇偶交替亮灯}break;case 2: //3方案if(j==60){P1=temp;P1=_crol_(P1,1);temp=P1; //保护P1口亮灯状态k=0;j=0;}//闪烁部分,应该可以优化if(k<5){P1=0xff;}else if(k>=5&&k<10){P1=temp;}else if(k>=10&&k<15){P1=0xff;}else if(k>=15&&k<20){P1=temp;}else if(k>=20&&k<25){P1=0xff;}else if(k>=30&&k<35){P1=temp;}else if(k>=35&&k<40){P1=0xff;}//----------------------------------- break;}keyscan();}}void init(){TH0=0x3c; //定时器赋初值定时时间50ms TL0=0xB0;TMOD=0x01; //设置定时器工作方式为方式1 EA=1; //开总中断ET0=1; //开中断允许位TR0=1; //定时器计数P1=0xfe; //这里假设led灯与P1口相连并且//低电平有效}void delay(unsigned int N){int i,j;for (i=0;i<n;i++);for (j=0;j<110;j++);}void keyscan(){if(!key){delay(10); //消抖if(!key); //确认有键按下stat++;if(stat==3){stat=0;}//右键按下复位i=0;j=0;k=0;TH0=0x3c;TL0=0xB0;switch (stat){case 0:P1=0xfe;flag=1;stat=0;break;case 1:P1=0x55;break;case 2:P1=0xfe;temp=P1;break;}//-----------------------------------while(!key) //此循环中的函数和主函数中的显示函数是同一个//用于长按键的显示,可以去掉,去掉长按键不会正常显示,松开按键后正常{switch (stat){case 0:if(i==20&&flag){i=0;P1=P1<<1;temp=P1;if(temp==0){flag=0;}}if(i==20&&!flag){i=0;if(P1==0xff){flag=1;P1=0xfe;}if(!flag){P1=P1<<1;temp=P1;P1=temp+1;}break;case 1:if(i==20){i=0;P1=~P1;}break;case 2:if(j==60){P1=temp;P1=_crol_(P1,1); temp=P1;k=0;j=0;}if(k<5){P1=0xff;}else if(k>=5&&k<10) {P1=temp;}else if(k>=10&&k<15)P1=0xff;}else if(k>=15&&k<20){P1=temp;}else if(k>=20&&k<25){P1=0xff;}else if(k>=30&&k<35){P1=temp;}else if(k>=35&&k<40){P1=0xff;}break;}}}}void timer0() interrupt 1 {TH0=0x3c;TL0=0xB0; //溢出后重新赋初值//定时器中断时间为50msi++; //20次中断时间为1s j++; //40次中断时间为2s k++; //60次中断时间为3s }</n;i++);。

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秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。

51单片机简单程序实例

51单片机简单程序实例

51单片机简单程序实例
51单片机是一种常用的微控制器,下面我将给出一个简单的LED闪烁程序作为示例。

c.
#include <reg51.h>。

void delay() {。

int i, j;
for (i = 0; i < 500; i++)。

for (j = 0; j < 500; j++);
}。

void main() {。

while (1) {。

P1 = 0x00; // 关闭LED.
delay();
P1 = 0xFF; // 打开LED.
delay();
}。

}。

这是一个使用C语言编写的简单的51单片机程序。

程序的功能是让单片机控制开发板上的一个LED灯以一定的频率闪烁。

程序的主要部分是一个无限循环(`while(1)`),在循环中LED先被关闭然后延时一段时间,再被打开然后再延时一段时间,如此循环。

在这个示例中,我们使用了`P1`端口来控制LED的开关,
`0x00`表示关闭LED,`0xFF`表示打开LED。

`delay`函数用来产生时间延迟,以控制LED闪烁的频率。

这只是一个非常简单的示例,51单片机的功能远不止于此。

它可以用来控制各种外围设备,比如数码管、液晶显示屏、电机等,也可以用来实现各种功能,比如定时器、计数器、通信接口等。

希望这个简单的示例能够帮助你初步了解51单片机的编程。

51单片机按键控制数码管闪烁位置

51单片机按键控制数码管闪烁位置
display();
n--;
if (n > 3)
n = 3;}Βιβλιοθήκη }display();
}
}
void T0_INT() interrupt 1
{
TH0 = 0x3C;
TL0 = 0xB0;
n_50ms++;
n_50ms %= 6; //10对应1Hz
if(!n_50ms)
flag = ~flag;
}
while(1)
{
if (!k_a)
{
display();
if (!k_a)
{
while (!k_a)
display();
num[n]++;
if (num[n] > 9)
num[n] = 0;
}
}
if (!k_s)
{
display();
if (!k_s)
{
while (!k_s)
display();
#include <intrins.h>
sbit k_a = P3^1;
sbit k_s = P3^3;
sbit k_l = P3^5;
sbit k_r = P3^7;
unsignedchar code SEG7[] = { 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
for(i = 0; i < 8; i++)
{
P0 = SEG7[DISP_BUFF[i]];
P2 = w;
DelayMS(1);
P2 = 0;
w = _cror_(w, 1);

(完整版)51单片机流水灯程序

(完整版)51单片机流水灯程序

1.第一个发光管以间隔200ms 闪烁。

2.8个发光管由上至下间隔1s流动,其中每个管亮500ms,灭500ms。

3.8 个发光管来回流动,第个管亮100ms。

4.用8 个发光管演示出8 位二进制数累加过程。

5.8个发光管间隔200ms由上至下,再由下至上,再重复一次,然后全部熄灭再以300ms间隔全部闪烁 5 次。

重复此过程。

6.间隔300ms第一次一个管亮流动一次,第二次两个管亮流动,依次到8个管亮,然后重复整个过程。

7.间隔300ms 先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;8个全部闪烁3次;关闭发光管,程序停止。

1#include<reg52.h>#define uint unsigned intsbit led 仁P"0;void delay();void main(){while(1){led1=0;delay();led1=1;delay();}}void delay(){uint x,y;for(x=200;x>0;x--) for(y=100;y>0;y--);}2#include<reg52.h> #include<intrins.h> #define uint unsigned int #define uchar unsigned char sbit p 仁P1A0;uchar a;void delay(); void main() {a=0xfe;P1=a;while(1){ a=_crol_(a,1); delay();P1=a;delay();}}void delay(){uint b; for(b=55000;b>0;b--);}3#include<reg52.h>#include <intrins.h>#define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=100;x>0;x--) for(y=110;y>0;y--);}void main(){uchar a,i;while(1)a=0xfe;for(i=0;i<8;i++){P1=a; delay(100); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a; delay(100); a=_cror_(a,1);}}}4#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint a){uint x,y;for(x=a;x>0;x--) for(y=110;y>0;y--);}void main(){uchar b;while(1){b++;P1=~b; delay(200);5#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char void main(){uchar a,i,j;while(1){ for(j=0;j<2;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(200); a=_crol_(a,1);}a=0x7f;for(i=0;i<8;i++){P1=a;delay(200); a=_cror_(a,1);}}P1=0xff; for(j=0;j<10;j++) {delay(300);P1=~P1;}}}void delay(){uint x,y; for(x=200;x>0;x--) for(y=110;y>0;y--); 6 #include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(){uint x,y; for(x=300;x>0;x--) for(y=110;y>0;y--);} void main(){uchar a,i,j; while(1) {a=0xfe; for(j=0;j<8;j++) { for(i=0;i<8-j;i++) {P1=a; delay(200); a=_crol_(a,1);} a=_crol_(a,j); P1=0xff; a=a<<1;}} }7#include<reg52.h> #include <intrins.h> #define uint unsigned int #define uchar unsigned char void delay(uint z){uint x,y; for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){uchar a,i,j;for(j=0;j<3;j++){P1=0x55;delay(300);P1=0xaa;delay(300);}for(j=0;j<3;j++){a=0xfe;for(i=0;i<8;i++){P1=a;delay(300);a=_crol_(a,1);}}P1=0xff;for(j=0;j<3;j++){P1=0x7e;delay(300);P1=0xbd;delay(300);P1=0xdb;delay(300);P1=0xe7;delay(300);}P1=0xff;for(j=0;j<3;j++){P1=0xe7;delay(300);P1=0xdb;delay(300);P1=0xbd;delay(300);P1=0x7e;delay(300);}P1=0xff; for(j=0;j<6;j++) {P1=~P1; delay(300);}P1=0xff;while(1);}。

51单片机技术应用教程(C语言版)项目四 花样霓红灯的设计与制作

51单片机技术应用教程(C语言版)项目四 花样霓红灯的设计与制作

函数 atoi atol atof strtod strtol strtoul
rand srand calloc free init_mempool
malloc realloc
功能 将字符串sl转换成整型数值并返回这个值 将字符串sl转换成长整型数值并返回这个值 将字符串sl转换成浮点数值并返回这个值 将字符串s转换成浮点型数据并返回这个值 将字符串s转换成long型数值并返回这个值 将字符串s转换成unsigned long型数值并返回这个值
5.请写出二维数组的格式,并举例说明。
51单片机技术应用活页式教程(C语言版)
项目四 花样霓虹灯的设计与制作
4.1 C51库函数
知识 链接
4.2 用户自定义函数 4.3 C51数组
【知识点4.1】 C51库函数
• 函数有库函数和自定义函数两类。 • C51的库函数由C51的编译器提供,每个库函数的原型放
使单片机程序产生延时 对字节中的一位进行测试
【知识点4.2】用户自定义函数
• 1.用户自定义函数的形式
• (1)无参数函数。此种函数被调用时,既无参数输入,也不返回结果给调用函数,它 是为完成某种操作过程而编写的。
• (2)有参数函数。在定义此类函数时,必须定义与实际参数一一对应的形式参数,并 在函数结束时返回结果给调用该函数的程序使用,函数的返回值是通过函数中的return 语句获得的。调用时必须提供实际的输入参数。
如果P1口接了8个LED灯,该程序的功能是:
51单片机技术应用活页式教程(C语言版)
项目四 花样霓虹灯的设计与制作
【引导学习】
2. 请接合第1题程序,请写出有参与无参、形参与实参的含义。
3.请用字符型数组定义LED,存放流水灯8种显示状态,存放在程 序存储器中。 4.请用一维数组定义LED数码管的0-9的显示编码。

51单片机闪烁灯、流水灯查表法的实现

51单片机闪烁灯、流水灯查表法的实现

51单片机闪烁灯、流水灯查表法的实现闪烁灯1.实验任务如电路原理图所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2.电路原理图见附件3.系统板上硬件连线把“单片机最小系统”中的P1.0端口用导线连接到发光二极管L1端口上。

4.程序框图见附件5.汇编源程序ORG 0START: CLR P1.0LCALL DELAYSETB P1.0LCALL DELAYLJMP STARTDELAY: MOV R5,#20 ;延时子程序,延时0.2秒D1: MOV R6,#20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5,D1RETEND6. C语言源程序#include <REG52.H>sbit L1=P1^0;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=248;k>0;k--);}void main(void){while(1){L1=0;delay02s();L1=1;delay02s();}}广告灯(利用取表方式)1.实验任务利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)2.电路原理图见附件3.硬件实现把“单片机最小系统”P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。

4.汇编源程序ORG 0START: MOV DPTR,#TABLELOOP: CLR AMOVC A,@A+DPTRCJNE A,#01H,LOOP1JMP STARTLOOP1: MOV P1,AMOV R3,#20LCALL DELAYINC DPTRJMP LOOPDELAY: MOV R4,#20D1: MOV R5,#248DJNZ R5,$DJNZ R4,D1DJNZ R3,DELAYRETTABLE: DB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 0FEH,0FDH,0FBH,0F7HDB 0EFH,0DFH,0BFH,07FHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 07FH,0BFH,0DFH,0EFHDB 0F7H,0FBH,0FDH,0FEHDB 00H, 0FFH,00H, 0FFHDB 01HEND5.C语言源程序#include <AT89X51.H>unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0x00,0xff,0x00,0xff,0x01};unsigned char i;void delay(void){unsigned char m,n,s; for(m=20;m>0;m--) for(n=20;n>0;n--) for(s=248;s>0;s--);}void main(void){while(1){if(table!=0x01){P1=table;i++;delay();}else{i=0;}}}[ 本帖最后由冷月剑客于 2009-3-1 17:40 编辑 ]。

闪烁灯单片机实训报告

闪烁灯单片机实训报告

一、实验目的本次实训旨在通过实践操作,让学生掌握单片机的基本原理,了解单片机的I/O端口的使用方法,并学会编写简单的程序来控制LED灯的闪烁。

通过本次实训,使学生能够将理论知识与实际操作相结合,提高学生的动手能力和实际应用能力。

二、实验器材1. 单片机开发板:AT89C51单片机核心板2. LED灯:红色LED灯1个3. 电阻:220Ω电阻1个4. 连接线:杜邦线若干5. 计算机及编程软件:Keil uVision5三、实验原理单片机(Microcontroller Unit,MCU)是一种具有中央处理单元(CPU)、存储器(RAM、ROM)和I/O端口的集成电路。

在本实验中,我们使用AT89C51单片机作为实验平台,通过编写程序控制LED灯的闪烁。

实验原理如下:1. 当单片机的I/O端口输出高电平时,连接在该端口的LED灯会亮;当输出低电平时,LED灯会灭。

2. 通过在单片机程序中设置定时器,实现定时中断,使LED灯在亮和灭之间交替闪烁。

四、实验步骤1. 连接电路:将LED灯的正极连接到单片机的P1.0端口,负极通过220Ω电阻接地。

2. 编写程序:使用Keil uVision5软件编写程序,实现LED灯的闪烁。

3. 烧录程序:将编写好的程序烧录到单片机中。

4. 运行实验:上电后,观察LED灯的闪烁情况。

五、实验程序```c#include <reg51.h>// 定义定时器0的初值,用于产生1秒的定时中断#define TIMER0_INIT_VALUE 65536 - 50000void Timer0_Init() {TMOD &= 0xF0; // 设置定时器0为模式1TMOD |= 0x01; // 设置定时器0为16位定时器TH0 = (unsigned char)(TIMER0_INIT_VALUE >> 8); // 设置定时器0的初值高8位TL0 = (unsigned char)(TIMER0_INIT_VALUE & 0xFF); // 设置定时器0的初值低8位ET0 = 1; // 使能定时器0中断EA = 1; // 开启全局中断}// 定时器0中断服务程序void Timer0_ISR(void) interrupt 1 {TH0 = (unsigned char)(TIMER0_INIT_VALUE >> 8); // 重新加载定时器0的初值高8位TL0 = (unsigned char)(TIMER0_INIT_VALUE & 0xFF); // 重新加载定时器0的初值低8位P1 ^= 0x01; // 切换P1.0端口的电平,实现LED灯的闪烁}void main() {Timer0_Init(); // 初始化定时器0while (1) {// 主循环,等待定时器0中断}}```六、实验结果与分析1. 实验结果:按照实验步骤进行操作后,LED灯能够按照设定的频率闪烁。

51单片机输出不同频率的PWM控制LED灯以不同的频率闪烁

51单片机输出不同频率的PWM控制LED灯以不同的频率闪烁

51单片机输出不同频率的PWM控制LED灯以不同的频率闪

/*
此处利用定时/计数器T0从P1.0输出PWM为1hz的方波为例,让发光二极管以1HZ闪烁,要输出其他频率的PWM 改中断变程序中aa的值即可,设晶振频率为12MHz。

?
*/
/*********************************************************/
#include //52单片机头文件
#include //包含有左右循环移位子函数的库
#define uint unsigned int //宏定义
#define uchar unsigned char //宏定义
sbit P1_0=P1^0;
uchar tt;
void main() //主函数
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while(1);//等待中断产生
}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
if(tt==20) /*说明1s时间到输出1s一次(1HZ)的方波如果要输出其他频率的波形改变此处的值即可*/
{
tt=0;
P1_0=~P1_0;
}
}。

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

1.实验任务
如图4.1.1所示:在P1.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。

2.电路原理图
图4.1.1
3.系统板上硬件连线
把“单片机系统”区域中的P1.0端口用导线连接到“八路发光二极管指示模块”区域中的L1端口上。

4.程序设计内容
(1).延时程序的设计方法
作为单片机的指令的执行的时间是很短,数量大微秒级,因此,我们要求的闪烁时间间隔为0.2秒,相对于微秒来说,相差太大,所以我们在执行某一指令时,插入延时程序,来达到我们的要求,但这样的延时程序是如何设计呢?下面具体介绍其原理:
如图4.1.1所示的石英晶体为12MHz,因此,1个机器周期为1微秒=0.001毫秒(ms)
机器周期微秒
MOV R6,#20 2个 2 2
D1: MOV R7,#248 2个 2+2×248=498 20×(2+2×248)
DJNZ R7,$ 2个2×248=496
DJNZ R6,D1 2个2×20=40 10002
因此,上面的延时程序时间为10.002ms。

10002=2+(2+2*248)*20+40
由以上可知,当R6=10、R7=248时,延时5ms,R6=20、R7=248时,延时10ms,以此为基本的计时单位。

如本实验要求0.2秒=200ms,10ms×R5=200ms,则R5=20,延时子程序如下:
DELAY: MOV R5,#20
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
(2).输出控制
如图1所示,当P1.0端口输出高电平,即P1.0=1时,根据发光二极管的单向导电性可知,这时发光二极管L1熄灭;当P1.0端口输出低电平,即P1.0=0时,发光二极管L1亮;我们可以使用SETB P1.0指令使P1.0端口输出高电平,使用CLR P1.0指令使P1.0端口输出低电平。

5.程序框图
如图4.1.2所示
6.汇编源程序
ORG 0
; ORG 的意思是什么就是
值不同跟系统程序存贮器地址有关. 以上面的程序来讲ORG 0000H接下来写的程序都在
0000H后。

ORG 2000H也一样。

(如果ROM够大的话)
START: CLR P1.0
LCALL DELAY
;“调用”(ACALL或LCALL)一下,避免重复编写也节省程序存储空间,子程序的最后都
要放一条返回指令既“RET”。

SETB P1.0 ;使P1.0变为1。

灯亮。

LCALL DELAY
LJMP START ;转入主程序
DELAY: MOV R5,#20 ;延时子程序,延时0.2秒
D1: MOV R6,#20
D2: MOV R7,#248
DJNZ R7,$
DJNZ R6,D2
DJNZ R5,D1
RET
END
7.C语言源程序
#include <AT89X51.H>
sbit D1=P1^0; //定义一个变量D1,值是P1的第一个口
void delay02s(void) //延时0.2秒子程序 2*(20*20*248)/(1000*1000){
unsigned char i,j,k;
for(i=20;i>0;i--)
for(j=20;j>0;j--)
for(k=248;k>0;k--);
}
void main(void)
{
while(1)
{
D1=0; //灯亮
delay02s();
D1=1; //灯灭
delay02s();
}
}。

相关文档
最新文档