51单片机led闪烁程序及仿真图
单片机控制LED灯的闪烁变化
单片机控制 LED灯的闪烁变化李同学摘要:介绍了一种新型的LED彩灯控制系统的设计方法,以AT90S51单片机作为主控核心,与按键、显示器等较少的辅助硬件电路相结合,利用软件实现对LED彩灯进行控制。
本系统具有体积小、硬件少、电路结构简单及容易操作等优点。
关键词:LED彩灯 AT90s51 单片机随着人们生活环境的不断改善和美化,在许多场合可以看到彩色霓虹灯。
LED彩灯由于其丰富的灯光色彩,低廉的造价以及控制简单等特点而得到了广泛的应用,用彩灯来装饰街道和城市建筑物已经成为一种时尚。
但目前市场上各式样的LED彩灯控制器大多数用全硬件电路实现,电路结构复杂、功能单一,这样一旦制作成品只能按照固定的模式闪亮,不能根据不同场合、不同时间段的需要来调节亮灯时间、模式、闪烁频率等动态参数。
这种彩灯控制器结构往往有芯片过多、电路复杂、功率损耗大等缺点。
此外从功能效果上看,亮灯模式少而且样式单调,缺乏用户可操作性,影响亮灯效果。
因此有必要对现有的彩灯控制器进行改进。
一、设计思想LED发光灯可以分为单色发光灯、双色发光灯、三色发光灯、面发光灯、闪烁发光灯、电压型发光灯等多种类型。
按照发光灯强度又可以分为普通亮度发光灯、高亮度发光灯、超高亮度发光灯等。
这种单个的发光灯适宜用做指示灯,如电源指示、电路状态指示灯,进而对能够转变成电信号的各种物理量进行指示。
也可以用多个LED 发光灯组成固定的字符或图形进行显示,如大型剧场会堂的出入口及洗手间的显示。
和很多应用术语一样,LED图文显示屏并没有一个公认的严格的定义,一般把显示图形和/或文字的LED显示屏称为图文屏。
这里所说的图形,是指由单一亮度线条组成的任意图形,以便于不同亮度(灰度)点阵组成的图像相区别。
图文显示屏的主要特征是只控制LED点阵中各发光器件的通断(发光或熄灭),而不控制LED的发光强弱。
LED图文显示屏的外观可以做成条形,叫做条形图文显示屏(简称条屏),也可以按一定高度比例做成矩形的平面图文显示屏。
51单片机设计交通灯仿真图
}
void init1()//第一个状态:主干道、支干道均亮红灯5S
{
uint temp;
temp=6;//变量赋初值
TMOD=0x01;//定时器0工作于方式1
TH0=0x4c;
TL0=0x00;//定时器赋初值
EA=1;//开外部中断
ET0=1;//开定时中断
TR0=1;//开定时器0
while(1)
#define uchar unsigned char//宏定义
#define uint unsigned int//宏定义
sbit RED_ZHU = P1^0;
sbit YELLOW_ZHU = P1^1;
sbit GREEN_ZHU = P1^2;
sbit RED_ZHI = P1^3;
sbit YELLOW_ZHI = P1^4;
delay0(5);
}
void xint0() interrupt 0 //外部中断0,这里用2是INT1的优先级为0
{
LED_ON();
}
void LED_ON()//外部中断0显示子程序
{
RED_ZHI=0;
RED_ZHU=0;
GREEN_ZHI=1;
GREEN_ZHU=1;
YELLOW_ZHI=1;
}
/*********************************************************
500ms延时函数
晶振:11.0592MHz
*********************************************************/
void delay(unsigned char j)
单片机应用技术项目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单片机8个发光二极管闪烁设计方案
51单片机8个发光二极管闪烁设计方案1. 方案目标本方案旨在设计一个基于51单片机的电路和程序,实现8个发光二极管的闪烁效果。
具体目标如下:1.实现8个发光二极管的交替闪烁。
2.控制每个发光二极管的亮灭时间和频率。
3.确保方案具有可行性和高效性。
2. 实施步骤2.1 硬件设计根据目标需求,我们需要以下硬件组件:1.51单片机(如STC89C52):作为主控芯片,负责控制8个发光二极管的亮灭状态。
2.8个发光二极管:用于显示亮灭状态。
3.8个电流限流电阻:用于限制发光二极管的工作电流,防止过流损坏。
4.连接线:用于连接主控芯片、发光二极管和电流限流电阻。
硬件连接步骤如下:1.将主控芯片与发光二极管之间通过连接线连接起来。
2.将每个发光二极管与对应的电流限流电阻连接起来,确保电流在安全范围内。
2.2 软件设计软件设计包括编写主控芯片的程序代码,实现对8个发光二极管的控制。
以下是一个基本的软件设计思路:1.定义8个IO口用于连接发光二极管,并设置为输出模式。
2.定义一个变量ledState表示当前发光二极管的亮灭状态,初始值为0。
3.在主循环中,通过改变ledState的值来控制发光二极管的亮灭状态。
4.使用延时函数或定时器来控制每个发光二极管的亮灭时间和频率。
具体步骤如下:1.初始化IO口:将8个IO口设置为输出模式。
2.定义变量:定义一个整型变量ledState用于记录当前发光二极管的亮灭状态,默认为0。
3.进入主循环:–设置第一个发光二极管为亮,其他7个发光二极管为灭。
–延时一段时间(如200ms)。
–设置第一个发光二极管为灭,第二个发光二极管为亮,其他6个发光二极管为灭。
–延时一段时间(如200ms)。
–重复以上步骤,依次控制每个发光二极管的亮灭状态。
4.返回主循环。
2.3 预期结果通过上述硬件和软件设计,我们可以实现8个发光二极管的交替闪烁效果。
具体预期结果如下:1.8个发光二极管按照顺序交替亮灭。
51单片机仿真100实例
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){{P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮,红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。
led闪烁实验报告
竭诚为您提供优质文档/双击可除led闪烁实验报告篇一:单片机实验--LeD灯闪烁实验实验报告课程名称实验项目20XX年3月13日【实验目的】1.掌握51单片机开发板的使用步骤;2.掌握51单片机开发板所需软件的安装过程;3.以LeD灯闪烁为例子,掌握软件KeIL3的使用方法。
熟悉51单片机开发板的使用【实验环境】1.实验仪器、设备计算机、51单片机开发板2.软件usb驱动程序、KeLL开发软件3.实验过程51单片机开发板的使用步骤1)安装usb驱动程序;2)安装KeIL开发软件3)在KeIL环境中编写和调试程序4)用程序烧录软件,将单片机程序烧录到单片机51单片机开发板所需软件的安装过程1)安装usb驱动程序2)设置串口LeD灯闪烁的程序的编写、调试和烧录。
【实验内容】1.内容一1.1操作过程(1)将单片机开发板的电源与pc的usb口相连;(2)在pc机上安装usb_Driver驱动程序的安装,具体安装步骤,请参见《文件驱动程序安装说明.pdf》;设置串口,请参见《设置串口.pdf》;(3)在pc机上安装KeILV3软件,具体安装步骤,请参见《安装说明.TxT》;(4)运行KeIL3软件,软件的具体使用方法,请参见请参见《keil入门.pDF》文件;(5)在KeIL软件中,创建内容如下的c程序,文件名为学生自己的学号:(6)编译和调试,修改程序错误;(7)使用软件《pZIsp自动下载软件.exe》将程序烧录到单片机中,观察现象是否与正常;(8)再在原来程序的基础上,修改程序,实现功能较复杂的程序。
(9)编写内容如下的汇编程序,文件名为学生学号.asm:1.2操作结果程序下载成功后,则单片机开发板上的8个LeD灯将闪烁。
下图为LeD灯电路图。
1.3结果分析主程序中有:(1)p2=0x00;(2)delay(600);(3)p2=0xff;(4)delay(600);第一条程序为置p0口为低电平,点亮p2口8个LeD;,第二条程序为调用延时程序,等待一段时间熄灭,第三条程序为置p0口为高电平,熄灭p2口8个LeD灯;最后一条程序为调用延时程序。
LED灯闪烁控制
太原理工大学单片机原理与应用技术课程实验报告专业班级学号姓名指导教师LED 灯闪烁控制一、实验目的(1)掌握C语言、汇编语言编写单片机控制程序的方法;(2)掌握使用Keil C软件编写、编译、调试程序的方法;(3)掌握使用Proteus软件绘制电路原理图、硬件仿真和程序调试;(4)理解LED灯控制电路原理和延时程序的编写。
二、实验硬件和软件计算机1台,并安装Proteus软件和Keil C51软件。
三、实验任务在单片机I/O口上外接一个发光二极管LED,通过程序实现LED闪烁显示,即不停地一亮一灭,亮、灭持续时间均为0.2秒。
四、实验电路及分析实验电路如图所示,在P1.7口(也可选择其它端口)外接一个发光二极管D1,分析可知P1.7输出“0”时,D1点亮,P1.7输出“1”时D1熄灭。
LED 灯闪烁控制电路图五、实验程序编写1.程序编写(1)C语言程序#include <reg51.H>sbit D1=P1^7;void Delayms(unsigned int n){ unsigned int i, j;for(j=n; j>0;j--)for(i=112; i>0; i--);}int main( ){ while(1){ D1=0;Delayms(200);D1=1;Delayms(200);}}(2)程序流程图六、实验步骤1.利用Proteus软件绘制仿真电路图(1)打开Proteus软件,File→New Project进入工程创建向导,选择项目文件存放路径,项目文件名为“实验1.pdsprj”。
(2)创建原理图(schematic),默认模板为default,可根据电路规模选择合适的图纸大小。
(3)选择“Do not create a PCB layout”,即不绘制PCB图。
(4)选择第一项“No Firmware Project”,即不在Proteus平台下创建源程序。
单片机仿真器和仿真环境
单片机基本原理,如何使用DX516 仿真器,如何编程点亮和灭掉一个LED 灯,如何进入KEILC51uV调试环境,如何使用单步,断点,全速,停止的调试方法单片机现在是越来越普及了,学习单片机的热潮也一阵阵赶来,许多人因为工作需要或者个人兴趣需要学习单片机。
可以说,掌握了单片机开发,就多了一个饭碗。
51 单片机已经有30 多年的历史了,在中国,高校的单片机课程大多数都是51,而51 经过这么多年的发展,也增长了许多的系列,功能上有了许多改进,也扩展出了不少分支。
而国内书店的单片机专架上,也大多数都是51 系列。
可以预见,51 单片机在市场上只会越来越多,功能只会越来越丰富,在可以预见的数十年内是不可能会消失的。
作为一个初学者,如何单片机入门?需要那些知识和设备呢?知识上,其实不需要多少东西,会简单的C 语言,知道51 单片机的基本结构就可以了。
一般的大学毕业生都可以快速入门,自学过这2 门课程的高中生也够条件。
就算你没有学过单片机课程,只掌握了C 语言的皮毛,通过本系列的教程,您也会逐渐的进入单片机的大门。
当然在学习的过程中,您还是必须多去研读单片机书籍,了解他们的基本结构及工作方式。
下面以51 为例来了解一下单片机是什么东西,控制原理又是什么?在数字电路中,电压信号只有两种情况,高电平和低电平,用数字来记录就是1 和0。
单片机内部的CPU,寄存器,总线等等结构都是通过1 和0 两种信号来运作的,数据也是以1 或者0 来保存的。
单片机的输入输出管脚,也就是IO 口,也是只输出或识别1 和0 两种信号,也就是高电平和低电平。
当单片机输出一个或一组电平信号到IO 口后,外部的设备就可以读到这些信号,并进行相应操作,这就是单片机对外部的控制。
当外部一个或一组电平信号送到单片机的IO 口时,单片机也可以读到这些信号,并进行分析操作,这就是单片机对外部设备信号的读取。
当然实际的操作中,这些信号可能十分复杂,必须严格地按照规定的时间顺序(时序)输入输出。
3.3 任务2 8位led闪流水灯
预留一定的安全系数。一般对LED发光二极管驱动采用的限流
电阻都要比采用10 mA计算出的大,常用的典型值为470 Ω。 硬件连接上,每个LED发光二极管对应单片机的一个唯一
的输出引脚,即单片机的一个输出端口(P0、P1、P2或P3)就能
够控制8个LED发光二极管。当相应引脚输出为低时,电流从 VCC流入单片机,LED发光二极管开始发光,发光亮度由匹配
模块3 并行I/O口应用与C语言基础
模块3 并行I/O口应用 与C语言基础
任务3 控制8个LED发光二极管闪烁
任务4 流水灯 习题3
模块3 并行I/O口应用与C语言基础
51系列单片机有4个I/O端口,每个端口都是8位双向口, 共有32根引脚。每个端口都包括一个锁存器(即专用寄存器 P0~P3)、一个输出驱动器和输入缓冲器。这4个端口称为 P0~P3,通常情况下,这4个端口的每一位都可以作为双向 通用I/O端口使用。如果要在片外扩展存储器,则P2口作为 高8位地址线,P0口作为低8位地址线和双向数据总线分时复 用,也就是P0、P2口的第二功能。P3口除了作为双向通用 I/O接口使用外,每一根线还具有第二种功能。而P1口只能 作为双向通用I/O接口使用。 本模块从开发控制8个LED发光二极管闪烁的应用程序 入手,介绍4个I/O端口的内部结构及其使用方法。开发单片 机应用程序时可以使用汇编语言,但更多的时候使用的是C 语言,因为C语言开发程序高效且可维护性好。
模块3 并行I/O口应用与C语言基础
此外,如果没有限流电阻,LED发光二极管在工作时也会迅
速发热。为了防止LED发光二极管过热损害,也必须采用限 流串联电阻对LED发光二极管的功耗进行限制。表3.1所示为
闪烁LED灯的设计---单片机课程设计
闪烁LED灯的设计本设计的闪烁小灯控制器,可使小灯轮流点亮、逐个点亮、间隔闪亮。
如果要控制交流彩灯,可在P1端口加接继电器或可控硅接口电路。
本设计可应用在广告彩灯控制器和舞台灯光控制器等领域。
一、系统硬件电路的设计图1为闪烁小灯控制器的电路原理图,其中:单片机采用AT89C2051,P1口作LED发光管输出控制用,P3.0-P3.2口为闪烁方式控制开关K1、K2、K3按键接口,P3.3口的按键作备用,限流电阻为510Ω,发光管工作电流约10mA,采用12MHz晶振。
图1 闪烁小灯电路原理图二、系统主要程序的设计1、主程序通过扫描P3.0-P3.2口,判断是否有按键按下,然后在20H内存单元的低3位的对应位置1标志,确定应执行的闪烁功能。
当20H.0为1时,发光管轮流点亮;当20H.1为1时,发光管逐点点亮;当20H.2为1时,发光管间隔闪亮。
在主程序对20H的低3位进行位值判定后,转入相应的闪烁控制程序。
上电初始化时,对20H的最低位置1,系统进入轮流点亮方式。
主程序流程图如图2所示。
2、键扫描子程序因按键较少,采用直接端口扫描键开关,用软件延时消抖确认后,对20H 内存单元相应的位置1,并把其余位清0。
图2 主程序流程图3、闪烁控制程序闪烁控制程序用来控制P1口的发光管发光变化方式,其中:执行功能程序0(FUN0)时的P1口输出值变化为11111110→延时→11111101→延时→11111011→延时→11110111→延时→11101111→延时→11011111→延时→10111111→延时→01111111→延时→结束转主程序。
执行功能程序1(FUN1)时的P1口输出变化为11111110→延时→11111100→延时→11111000→延时→11110000→延时→11100000→延时→11000000→延时→10000000→延时→00000000→延时→结束转主程序。
执行功能程序2(FUN2)时的P1口输出变化为10101010→延时→01010101→延时→结束转主程序。
PROTEUS仿真100实例
《单片机C语言程序设计实训100例—基于8051+Proteus仿真》案例第 01 篇基础程序设计01 闪烁的LED/* 名称:闪烁的LED说明:LED按设定的时间间隔闪烁*/#include<reg51.h>#define uchar unsigned char#define uint unsigned intsbit LED=P1^0;//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){while(1){LED=~LED;DelayMS(150);}}02 从左到右的流水灯/* 名称:从左到右的流水灯说明:接在P0口的8个LED从左到右循环依次点亮.产生走马灯效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intvoid DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){P0=0xfe;while(1){P0=_crol_(P0,1); //P0的值向左循环移动DelayMS(150);}}03 8只LED左右来回点亮/* 名称:8只LED左右来回点亮说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果*/#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;P2=0x01;while(1){{P2=_crol_(P2,1); //P2的值向左循环移动DelayMS(150);}for(i=0;i<7;i++){P2=_cror_(P2,1); //P2的值向右循环移动DelayMS(150);}}}04 花样流水灯/* 名称:花样流水灯说明:16只LED分两组按预设的多种花样变换显示*/#include<reg51.h>#define uchar unsignedchar#define uint unsigned intuchar code Pattern_P0[]={0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff};uchar code Pattern_P2[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff//延时void DelayMS(uint x){uchar i;while(x--){for(i=0;i<120;i++);}}//主程序void main(){uchar i;while(1){ //从数组中读取数据送至P0和P2口显示for(i=0;i<136;i++){P0=Pattern_P0[i];P2=Pattern_P2[i];DelayMS(100);}}}05 LED模拟交通灯/* 名称:LED模拟交通灯说明:东西向绿灯亮若干秒.黄灯闪烁5次后红灯亮. 红灯亮后.南北向由红灯变为绿灯.若干秒后南北向黄灯闪烁5此后变红灯.东西向变绿灯.如此重复。
51单片机程序及仿真
目录1、交叉流水灯---------------------------------------------12、倒序流水灯---------------------------------------------33、正序流水灯---------------------------------------------74、交替流水灯--------------------------------------------115、2 0个LED显示--------------------------------------146、单个数码管显示0~ F ---------------------------------167、两个数码管显示00~ 99 ------------------------------208、4个数码管显示固定数值-------------------------------249、6个数码管同步显示----------------------------------2610、6个数码管依次显示数字1~6 -------------------------2911、一个按键控制LED灯---------------------------------3312、矩阵按键控制LED灯---------------------------------3613、矩阵键盘控制数码管依次显示0~F --------------------3914、中断控制LED灯的依次亮灭--------------------------4615、中断按键显示0~F ------------------------------------4816、1秒闪烁灯-------------------------------------------5017、1秒闪烁灯(中断)-----------------------------------5418、2秒闪烁灯--------------------------------------------5819、59秒循环计时----------------------------------------6020、串口---------------------------------------------------63交叉流水灯仿真图:程序:#include<reg51.h>#include<intrins.h>void DelayTime (unsigned int DelayValue) {unsigned int a,b;for (a=0;a<DelayValue;a++)for (b=0;b<1827;b++);}void main(){char b;b=0xfe;while(1){b= _crol_(b,7);DelayTime(50);P0=b;}}程序实现的功能:本程序实现的是先让上面的4个灯一起亮灭,再让下面4个灯亮灭,然后让奇数位的灯亮灭,最后让偶数位的灯亮灭。
51单片机发光二极管程序
#include<reg52.h>
sbit led1=P1^0;
void main()
{
led1=0;
}
#include<reg52.h>(总线操作法)
void main()
{
P1=0xfe; // 1111 1110
while(1);
}
2.发光二极管1357亮,2468灭
e;//赋初值111111100x7f0111 1111从最高位开始亮
while(1)//大循环
{
P1=aa;//点亮第一个发光二极管
delayms(500);//延时500毫秒
aa=_crol_(aa,1);//将aa循环左移一位后再赋给aa_cror_为循环右移
#include<reg52.h>
void main()
{
P1=0xaa;//1010 1010
}
3.发光二极管间隔1S亮灭闪烁
#include<reg52.h>
#define uint unsigned int//宏定义
sbit led1=P1^0;//声明单片机P1口的第一位
uint i,j;
void main()
{
while(1)//大循环
{
led1=0;/*点亮第一个放光二极管*/
for(i=1000;i>0;i--)//延时
for(j=110;j>0;j--);
led1=1;/*关闭第一个发光二极管*/
for(i=1000;i>0;i--)//延时
for(j=110;j>0;j--);
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单片机的编程。
旋转LED灯程序(51单片机)
飘飞在空中的文字(详情咨询QQ:278540660)一、实物图(夜晚可以观测到飘在空中的文字,美!!!)二、部分代码/***************************************************************main. c***************************************************/#include<display.h>void main(){EX0init();TIM0init();Init_DS1302();while(1){time_set(IRcord[2]);IRcord[2]=0;if(time_love==0){if(time_onoff==0){ds1302_read_time();Dig_time();}else{Dig_time();}}else{Display_love();}while(!flag);flag=0;}}/***************************************************************redco n.h**************************************************/#define uchar unsigned char#define uint unsigned intsbit IR=P3^2;uchar irtime; //中断次数uchar IRcord[4]; //记录接收到的四个字节数据uchar irdata[33]; //接收到的32个二进制bituint flag=0;uchar nums=0;uint timelate=0;void TIM0init(void) //定时器0初始化{TMOD=0x02; //定时器0工作方式2,TH0是重装值,TL0是初值TH0=0x00; //重载值TL0=0x00; //初始化值(0.255ms一次中断)--晶振频率的十二分之一ET0=1; //开中断TR0=1;}void EX0init(void){IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)EX0 = 1; //使能外部中断0IT1=1; //指定外部中断1下降沿触发,INT0 (P3.3)EX1=1; //使能外部中断1EA = 1; //开总中断}void Ircordpro(void) //红外码值处理函数{uchar i, j, k;uchar cord,value;k=1;for(i=0;i<4;i++) //处理4个字节{for(j=1;j<=8;j++) //处理1个字节8位{cord=irdata[k];if(cord>7) //1.125ms为0 2.25ms为1 0.255*7作为稳定判断值value|=0x80;if(j<8){value>>=1;}k++;}IRcord[i]=value;value=0;}}void EX1_ISR (void) interrupt 2 //外部中断0服务函数{static uchar i; //接收红外信号处理static bit startflag; //是否开始处理标志位if(startflag){if(irtime<60&&irtime>=35) //连续发送两个32位数据间隔不可预知性) 尤为重要{i=0;}irdata[i]=irtime; //存储每个电平的持续时间irtime=0;i++;if(i==33){i=0;startflag=0;Ircordpro();}}else{startflag=1;irtime=0;}}void tim0_isr (void) interrupt 1 using 1{irtime++;}void EX0_ISR (void) interrupt 0{flag=1;nums++;if(nums>=20){nums=0;timelate++;if(timelate>=4){timelate=0;}}}/***************************************************************DS130 2.h**************************************************/#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned charuchar time_buf[7]={0x13,0x01,0x01,0x00,0x00,0x00,0x02};sbit SCLK=P0^0;sbit SDA=P0^1;sbit RST=P0^4;void delayus(uint t){uint i;for(i=0;i<t;i++)_nop_();}void delayms(uint t){uint x,y;for(x=t;x>0;x--)for(y=95;y>0;y--);}void change_dats(){uchar i;uchar temp;for(i=0;i<6;i++){temp=time_buf[i]/16;time_buf[i]=time_buf[i]%16+temp*10;}}void DS1302WriteByte(uchar dat){uchar i;SCLK=0; //初始时钟线置为0delayus(2);for(i=0;i<8;i++)//传输的8个字节的数据{SDA=dat&0x01; //取最低位delayus(2);SCLK=1; //上升沿,SDA的数据被传输delayus(2);SCLK=0; //时钟线拉低,为下一个上升沿做准备dat>>=1; //数据右移一位,准备传输下一位数据}}uchar DS1302ReadByte(){uchar i,dat;delayus(2);for(i=0;i<8;i++){dat>>=1; //要返回的数据左移一位if(SDA==1) //当数据线为高时,证明该位数据为 1 dat|=0x80;SCLK=1; //拉高时钟线delayus(2);SCLK=0; //制造下降沿delayus(2);}return dat; //返回读取出的数据}void DS1302Write(uchar cmd, uchar dat){RST=0; //初始 CE线置为 0SCLK=0; //初始时钟线置为0RST=1; //初始 CE置为 1,传输开始DS1302WriteByte(cmd); //传输命令字,要写入的时间/日历地址DS1302WriteByte(dat); //写入要修改的时间/日期SCLK=1; //时钟线拉高RST=0; //读取结束,CE置为0,结束数据的传输}uchar DS1302Read(uchar cmd){uchar dat;RST=0; //初始 CE线置为0SCLK=0; //初始时钟线置为0RST=1; //初始 CE置为 1,传输开始DS1302WriteByte(cmd); //传输命令字,要读取的时间/日历地址dat=DS1302ReadByte(); //读取要得到的时间/日期SCLK=1; //时钟线拉高RST=0; //读取结束,CE置为 0,结束数据的传输return dat; //返回得到的时间/日期}void Init_DS1302(void){DS1302Write(0x8e,0x00); //写保护关DS1302Write(0x80,time_buf[5]); //初始秒值为0DS1302Write(0x82,time_buf[4]); //初始分钟值为 0DS1302Write(0x84,time_buf[3]); //初始为 24小时模式初始时间为0点DS1302Write(0x86,time_buf[2]); //设置日DS1302Write(0x88,time_buf[1]); //设置月DS1302Write(0x8c,time_buf[0]); //设置年DS1302Write(0x8a,time_buf[6]); //设置星期数DS1302Write(0x8e,0x80); //禁止写入change_dats();}void ds1302_read_time(){uchar i,temp;time_buf[0]=DS1302Read(0x8D); //年time_buf[1]=DS1302Read(0X89); //月time_buf[2]=DS1302Read(0X87); //日time_buf[3]=DS1302Read(0X85); //时time_buf[4]=DS1302Read(0X83); //分time_buf[5]=(DS1302Read(0X81))&0x7F;//秒time_buf[6]=DS1302Read(0X8B); //星期for(i=0;i<7;i++) //BCD 处理{temp=time_buf[i]/16;time_buf[i]=time_buf[i]%16;time_buf[i]+=temp*10;}}/***************************************************************DISPL AY.h**************************************************/#include<ds1302.h>#include<redcon.H>#define uint unsigned int#define uchar unsigned charuchar code W[]={0x81,0xfb,0xf7,0xfb,0x81};uchar code N[]={0xe1,0xdf,0xdf,0xe1};uchar code R[]={0x81,0xa7,0xab,0xdd};uchar code I[]={0xbd,0x81,0xbd};uchar code L[]={0x81,0xfd,0xfd};uchar code o[]={0xe3,0xdd,0xe3};uchar code v[]={0xc7,0xfb,0xfd,0xfb,0xc7};uchar code E[]={0xe3,0xd5,0xd5,0xe5};uchar code Y[]={0x9f,0xef,0xf1,0xef,0x9f};uchar code U[]={0xc3,0xfd,0xfd,0xc3};uchar code num[10][5]={{0x83,0x75,0x6d,0x5d,0x83},{0xff,0xbd,0x01,0xfd,0xff},{0xbd,0x79,0x75,0x6d,0x9d},{0x7b,0x7d,0x5d,0x2d,0x73},{0xe7,0xd7,0xb7,0x01,0xf7},{0x1b,0x5d,0x5d,0x5d,0x63},{0x83,0x6d,0x6d,0x6d,0x73},{0xbf,0x7f,0x7d,0x41,0x3d},{0x93,0x6d,0x6d,0x6d,0x93},{0x9b,0x6d,0x6d,0x6d,0x83}};uchar code wen[]={0xdf,0xcd,0xd5,0x9b,0xd5,0xcd,0xdf};uchar code er[]={0xfd,0x83,0xff,0x83,0xfb,0xfd,0xfd};uchar code xin[]={0xcf,0xb7,0xdb,0xb7,0xcf};uchar set_num=0;uchar time_onoff=0;uchar time_love=0;void change_dath(){uchar i;uchar temp;for(i=0;i<6;i++){temp=time_buf[i]/10;time_buf[i]=time_buf[i]%10+temp*16; }}void time_set(uchar dat){switch(dat){case 0x46:{if(set_num==0) //按下设置键第一次{set_num=1;time_onoff=1;DS1302Write(0x8e,0x00); //写保护关DS1302Write(0x80,0X80); //时钟停止}else if(set_num==1){set_num=2;}else if(set_num==2){P2=0XFB;set_num=3;}else if(set_num==3){set_num=4;P2=0Xf7;}else if( set_num==4){set_num=5;}else if(set_num==5){set_num=6;}else if(set_num==6){set_num=0;time_onoff=0;change_dath();Init_DS1302();DS1302Write(0x80,0X00); //时钟运行}break;}case 0x47:{if(set_num!=0){if(set_num==1){time_buf[0]++;}else if(set_num==2){time_buf[1]++;if(time_buf[1]>12)time_buf[1]=1;}else if(set_num==3){time_buf[2]++;if(time_buf[2]>=32)time_buf[2]=1;}else if(set_num==4){time_buf[3]++;if(time_buf[3]>=24)time_buf[3]=0;}else if(set_num==5){time_buf[4]++;if(time_buf[4]>=60)time_buf[4]=0;}else if(set_num==6){time_buf[5]++;if(time_buf[5]>=60)time_buf[5]=0;}}break;}case 0x45:{if(set_num!=0){if(set_num==1){if(time_buf[0]<=0)time_buf[0]=20;else{time_buf[0]=time_buf[0]-1; }}else if(set_num==2){time_buf[1]=time_buf[1]-1; if(time_buf[1]<=0)time_buf[1]=12;}else if(set_num==3){if(time_buf[2]<=1)time_buf[2]=31;elsetime_buf[2]=time_buf[2]-1; }else if(set_num==4){if(time_buf[3]<=0)time_buf[3]=23;elsetime_buf[3]=time_buf[3]-1; }else if(set_num==5){if(time_buf[4]<=0)time_buf[4]=59;elsetime_buf[4]=time_buf[4]-1;}else if(set_num==6){if(time_buf[5]<=0)time_buf[5]=59;elsetime_buf[5]=time_buf[5]-1;}}break;}case 0x07:{time_love=1;break;}case 0x15:{time_love=0;break;}}}/******************时钟显示***************/ void Dig_time(){char m;for(m=0;m<=4;m++) //显示时十位{P2=num[time_buf[3]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示时个位{P2=num[time_buf[3]%10][m];delayms(1);}P2=0xff;delayms(1);P2=0xd7;delayms(1);P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示分十位{P2=num[time_buf[4]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示分个位{P2=num[time_buf[4]%10][m];delayms(1);}P2=0xff;delayms(1);P2=0xd7;delayms(1);P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示秒十位{P2=num[time_buf[5]/10][m];delayms(1);}P2=0xff;delayms(1);for(m=0;m<=4;m++) //显示秒个位{P2=num[time_buf[5]%10][m];delayms(1);}P2=0xff;}/***************i love you*****************/ void Display_love(){char i,j;if(timelate==0){for(i=0;i<=6;i++) //显示W{P2=wen[i];delayms(1);}P2=0xff;delayms(1);for(i=0;i<=6;i++) //显示r {P2=er[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=1){for(i=2;i>=0;i--) //显示I {P2=I[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=2){for(i=0;i<3;i++) //显示L {P2=L[i];delayms(1);}P2=0xff;delayms(1);for(i=2;i>=0;i--) //显示o {P2=o[i];delayms(1);}P2=0xff;delayms(1);for(i=4;i>=0;i--) //显示v {P2=v[i];delayms(1);}P2=0xff;delayms(1);for(i=0;i<=3;i++) //显示e {P2=E[i];delayms(1);}P2=0xff;delayms(2);}if(timelate<=3){for(i=4;i>=0;i--) //显示Y {P2=Y[i];delayms(1);}P2=0xff;delayms(1);for(i=2;i>=0;i--) //显示o {P2=o[i];delayms(1);}P2=0xff;delayms(1);for(i=3;i>=0;i--) //显示u {P2=U[i];delayms(1);}P2=0xff;delayms(2);}if(timelate>0){for(j=0;j<timelate;j++) {for(i=0;i<=4;i++){P2=xin[i];delayms(1);}P2=0xff; delayms(2); }}}。
项目一 闪烁的发光二极管(C语言编程)
unsigned int _irol_(unsigned int val,unsigned char n); unsigned int _lrol_(unsigned int val,unsigned char n);
case 3:
RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type = 4; break;
case 4: RED_B=1;GREEN_B=1; DelayMS(200); YELLOW_B=~YELLOW_B; if(++Flash_Count !=10) return; Flash_Count=0; Operation_Type = 1; break; }
switch语句的执行流程是: 首先计算switch后面圆括号中表达式的值, 然后用此值依次与各个case的常量表达式 比较,若圆括号中表达式的值与某个case后 面的常量表达式的值相等,就执行此case后 面的语句,执行后遇break语句就退出switch 语句;若圆括号中表达式的值与所有case后 面的常量表达式都不等,则执行default后面 的语句n+1,然后退出switch语句,程序流程 转向开关语句的下一个语句。
C2
22pf
R1
10k
9
RST
C3
10uF 29 30 31 PSEN ALE EA
R2
220
D1
1 2 3 4 5 6 7 8 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 AT89C51