用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-24 21:12:44)
标签:循环闪烁周期led灯按键杂谈
一、设计题目
二、程序功能:
开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以0.8S周期闪烁,按1键LEDPort以1S周期闪烁。
三、总体设计思想
用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。
在我编写的实验程序中我用到了定时器中断和外部中断。程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。
四、程序具体实现
实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。2S时间到后,所有灯熄灭。然后进入while循环,等待用户按键。用户按键后,通过使用switch语句,实验按0键,num1=20,按1键,num1=50,。而在主函数中,当按下0键或者1键时,num1就有了固定的值,通过if语句判断是否到达所要求的时间后,执行相应操作。在本实验中,要求实现LED7的周期闪烁,我先设定一个标志位b=0;默认LED7灭,;然后在主函数中在定时时间到达
后,通过判断和改变b的值来实现LED7的亮灭情况。然后使num=0;使定时器继续从新定时,不停循环实现LED7的周期闪烁。
程序附录:
#include
#include
#include"7279.h"
#define uchar unsigned char
#define uint unsigned int
sbit ad_busy = P3^2;
sbit key=P3^3;
uchar num;
uchar num1;
bit b;
uchar flag=0;
uchar keynumber;
#define LEDPort XBYTE[0x9000] //端口地址
void Init(void)
{
IE|=0x04;
TCON=0x01;
}
void Time0_Init(void)
{
TMOD|=0x01;
TH0=0xB8;
TL0=0x00;
ET0=1;
TR0=1;
}
void Time0(void) interrupt 1
{
TH0=0xB8;
TL0=0x00;
num++;
if(num==100)
flag=1;
}
void ISR_INT1(void) interrupt 2 { keynumber=Read7279();
while(!key);
switch(keynumber)
{
case 0:num1=20;break; case 1:num1=50;break; default:break;
}
}
void main(void)
{
b=0;
Init();
Time0_Init();
EA=1;
while(!flag)
{ LEDPort=0x00; }
LEDPort=0xff;
num=0;
while(1)
{
if(num==num1)
{ if(b)
{LEDPort=0x7f;b=0;}
else
{ LEDPort=0xff;b=1;}
}
} num=0;
}
LED和按键控制实验在我刚买ARM开发板时,曾经一共做过4次实验,写过4个程序(距今似乎快要一年了),具体为:
1、LED控制实验:使开发板上的LED3和LED4交替着亮灭
2、按键控制实验:用按键控制开发板上LED的亮灭
3、串口UART通信实验:用ARM的串口与PC机进行通信,包括发送和接收
4、LCD显示实验:在240×320的LCD上显示R,G,B三段color,以及在LCD上显示BMP格式的图片,后来又加了一段程序,使ARM能用UART0接收来自PC机的BMP图片,并在LCD上显示之。
以上这些程序都是用ADS1.2编译链接的,其实说穿了就是把ARM当成单片机在用!
现在公布其中一个实验:按键控制实验。
对于LED实验,就不再单独叙述了,因为实在太简单了,而且现在这个程序已经完全包含了LED实验所涉及到的一切东东!
实验说明:用按键S4控制LED3和LED4的亮灭:按下S4不动时,LED3和LED4同时闪烁点亮,放开S4后,LED3和LED4同时熄灭。
实验目的:熟悉ARM程序开发的一般流程,掌握编译器和链接器的选项设置,以及观察在编译链接后,程序中各种符号,子程序和段所在的ARM内存空间中的地址,最终使程序能够从起始的汇编代码跳到C程序的main()函数中去运行。
开发工具:ADS1.2
源代码:分两个文件,init.s和Main.c,具体在文后列出。
选项设置:在ARM Assembler和ARM C Complier中的Architecture or Processor选择ARM920T;在ARM Linker的Output选项卡,RO base设置成0x31000000,RW base可以为空(这个选项在仿真调试阶段可以空着,但若要烧入FLASH
中运行,则必须设置);另外为了观察程序中各种符号,子程序和段所链接的地址,又在ARM Linker的Listings选项卡中,勾上了Image Map和Symbols
出现的问题和解决办法:
1、刚开始编译不通过,后来发现在汇编语句中,delay标号没有顶格书写。
2、程序下载进RAM后大多数情况下无法正常运行(偶尔也能成功),总是跳进SWI异常处理中去,而且在Debug Log窗口中提示“Can't set more breakpoint”,刚开始以为真的是断点设多了,虽然我自己并没有设置断点,但以为是AXD自动设置的,于是在AXD的Configure Processor选项卡中,去掉了所有的勾勾,可问题依然存在;后来又以为是没有定义ARM中断跳转和其他模式下的堆栈的缘故,但加进了相关语句后还是没有解决问题!为了这个问题我抓掉了好几根头发,终于在崩溃之前找到了原因所在,原来是在开发板上把ARM设置成了从NAND FLASH启动!其实这本来也没什么错,但问题是我的开发板上已经预装了Win CE系统,于是乎,冲突就这样发生了!解决办法有两个,一是擦除Win CE系统,二是拨动板子上的一个开关,使ARM从NOR FLASH启动。我当然选择后者。
实验总结:为了上面所说的第二个问题,花了我不少时间,但也正是因为这个问题的出现,使得我对ADS的很多“冷门”的选项设置,也彻底研究了一遍,另外还迫使我去看了ADS1.2自带的文档Build Tools-Warning and Errors,为以后快速地定位和解决程序中的错误打下了基础。
程序代码如下:
init.s:
AREA Init,CODE,READONLY ;该伪指令定义了一个代码段,段名为Init,属性只读
ENTRY ;程序的入口点标识
EXPORT __ENTRY
__ENTRY
ResetEntry
mov sp,#0x0c700000 ;定义堆栈指针
IMPORT Main ;声明主函数Main
BL Main ;调用主函数
;下面是延迟子程序
EXPORT delay
delay
sub r0,r0,#1 ;r0=r0-1
cmp r0,#0x0 ;将r0的值与0相比较
bne delay ;比较的结果不为0(r0不为0),继续调用delay,否则执行下一条语句
mov pc,lr ;返回
END ;程序结束符
*****************************************************************
*******************
Main.c:
/*C语言函数
*/
/*PORT B寄存器预定义*/
#define rGPBCON (*(volatile unsigned *)0x56000010)
#define rGPBDAT (*(volatile unsigned *)0x56000014)
#define rGPBUP (*(volatile unsigned *)0x56000018)
/*PORT F寄存器预定义*/
#define rGPFCON (*(volatile unsigned *)0x56000050)
#define rGPFDAT (*(volatile unsigned *)0x56000054)
#define rGPFUP (*(volatile unsigned *)0x56000058)
extern int delay(int time); /*声明汇编函数*/
void Main()
{
rGPFCON=0x0; /*设置I/O口的GPF1为输入*/
rGPFUP=0xffff; /*禁止GPF端口的上拉*/
rGPBCON=0x0005; /*设置I/O口GPB0,GPB1为输出属性*/
rGPBUP=0xffff; /*禁止GPB端口的上拉*/
while(1) /*不断的循环*/
{
if((rGPFDAT&0x0002)==0) /*检测按键S4是否按下*/
{
rGPBDAT=0xfc; /*使GPB0输出高电平,GPB1输出低电平,LED3灯会灭,LED4灯会亮*/
delay(0xffff); /*调用汇编延迟函数*/
rGPBDAT=0x03; /*使GPB0输出低电平,GPB1输出高电平 LED3灯会亮,LED4灯会灭*/
delay(0xffff); /*调用汇编延迟函数*/
}
else
{
rGPBDAT=0xffff;
}
}
}
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
uint x,y; for(x=200;x>0;x--) for(y=100;y>0;y--); } #include
/************************************************************** 51单片机流水灯C语言源程序 文件说明:流水灯C程序 程序说明:MCU采用AT89S51,外接11.0592M晶振,P2口输出 *************************************************************/ #include
for(i=0;i<8;i++) //8个流水灯依次反向全部点亮 { P2=temp; delay(100); //调用延时函数 temp>>=1; } } } void delay(uint t) //定义延时函数 { register uint bt; for(;t;t--) for(bt=0;bt<255;bt++); }
实验一单灯闪烁实验 一、实验要求 发光二极管按照设定的时间间隔闪烁。 二、实验目的 1、了解单片机内部结构和最小系统。 2、掌握单片机与LED的硬件连接。 3、掌握单片机C51语言的程序框架。 4、了解Keil软件和Proteus软件的使用。 5、参考电路图一般最小系统 包括单片机、电源、时钟 电路、复位电路四部分。 根据编写的程序P1.0 口 接发光二极管。
三、实验说明 Proteus仿真时注意与LED连接的电阻阻值,若阻值过大LED 将没有反应。编写程序时,注意for语句于简单延时语句的运用。 四、实验框图 五、实验程序 ORG 0 START: CLR P1.0 LCALL DELAY
SETB P1.0 LCALL DELAY LJMP START DELAY: MOV R5,#20 D1: MOV R6,#20 D2: MOV R7,#248 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END
实验二LED流水灯实验 一、实验要求 编写一段流水灯控制程序,用P1 口作为输出控制端,实现八只发光二极管从左至右循环亮灭。 二、实验目的 1、进一步熟悉keil仿真软件、proteus仿真软件的使用。 2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。 3、掌握C51中单片机I/O口的编程方法和使用I/O口进行输入输出的注意事项。。
三、参考电路图复位电路、时钟电路的基础连线。P1端口分 别连接八只发光二极管。 四、实验说明编写程序时注意对延时子程序的使用,以及了解 _crol函数的使用。 unsigned char _crol_(unsigned char c,unsigned char b); 描述: 将字符c循环左移b位。_crol_函数有返回值,返回的是将c循环左移之后 的值。这是c51库自带函数,包含在intrins.h文件中。五、实验框图
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
#include
点亮P1口的多个LED灯闪烁 功能:点亮P1口的多个LED灯闪烁 该程序是单片机学习中最简单最基础的, 通过程序了解如何控制端口的高低电平 ------------------------------------------------*/ #include
用C语言编写程序实现通过按键使LED灯周期闪烁(2010-02-24 21:12:44)标签: 循环闪烁周期led灯按键杂谈 一、设计题目 二、程序功能: 开机复位后,LED0到LED7全部点亮,所有LEDPort持续2S后熄灭,然后等待按键,按0键LED7以 0.8S周期闪烁,按1键LEDPort以1S周期闪烁。 三、总体设计思想 用中断方式实现定时器的定时,然后通过键盘中断程序实现通过对按键的操作来实现相应的周期闪烁。 在我编写的实验程序中我用到了定时器中断和外部中断。程序共分为两个模块,一个为定时器模块,一个为键盘中断程序模块,在主函数中,首先实现所有LEDPort点亮,然后通过中断方式实现定时2S,在定时器num==20时,设定全局变量为标志位flag=1,然后再主函数中设定条件,通过标志位的变化实现所有LEDPort持续2S后熄灭。然后进入循环,等待按键,在按键中断服务程序中使用switch语句实现通过改变num1的值来实现LED7的闪烁周期。设定标志位b=0,在主函数中使用if语句通过判断b的值来改变LED7的亮灭情况,同时相应的b值会取反。 四、程序具体实现 实验要求开机复位后,LED0到LED7全部点亮2S后熄灭。在主函数中使用LEDPort=0x00;这条语句实现所有灯都亮,使用中断方式实现定时器定时2S,因为实验要求20ms溢出,所以设定num=100,在定时器中断服务程序中使用if语句判断条件,当num加到100,也就是说2S时间到时,执行flag=1;语句(先设定全局变量flag=0)。然后在主函数中使用while语句规定只有在flag=0时才执行所有LEDPort点亮的操作。2S时间到后,所有灯熄灭。然后进入while循环,
单片机控制-闪烁灯 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微秒机器周期微秒 MOV R6,#20 2个 2 D1: MOV R7,#248 2个 2 2+2×248=498 20× DJNZ R7,$ 2个2×248 (498 DJNZ R6,D1 2个2×20=40 10002 因此,上面的延时程序时间为10.002ms。 由以上可知,当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所示
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。那个单片机究竟有什么 功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^) 我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机 上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。 #include
基于单片机(c语言控制的)流水灯程序设计及proteus仿真图
89c51与8个发光二极管相连流水控制 一、不同花样的控制源程序代码: /*#include
delay(2000); } // 8~1号灯依次闪烁 } } */ /*#include
delay(300); P1=a; } P1=_crol_(P1,1); } } void delay(uint z) {uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } */ //依次闪烁10次后,循环点亮 /* #include
摘要 “微机原理与接口技术”是高等学校电子信息工程、通信工程、自动化、电气工程及其自动化等工科电气与电子信息类各专业的核心课程。该课程以INTER 8086微处理器和IBM PC系列微机为主要对象,系统。深入地介绍了微型计算机的基本组成、工作原理、接口技术及应用,把微机系统开发过程中用到的硬件技术和软件技术有机地结合起来。 本文详述了8个LED灯循环闪烁的课程设计。设置8个LED灯,首先是1、3、5、7号LED依次亮1秒钟,当7号LED亮后,这四个灯同时闪烁5下。然后是2、4、6、8号LED 依次亮1秒钟,当8号LED亮后,这四个灯同时闪烁5下。 本课程设计,由于自身能力和学习水平有限,可能存在一定的错误和不当之处,敬请批评和指正。 一、设计目的 1.巩固和加深课堂所学知识;熟悉各种指令的应用及条件; 2.学习掌握一般的软硬件的设计方法和查阅、运用资料的能力; 3.进一步了解8255A各引脚的功能, 8255A和系统总线之间的连接, 8255A和CPU 之间的数据交换,以及8255A的内部逻辑结构。深入掌握8255A显示电路的基本功能及编程方法,8255等芯片的工作方式、作用。 4.培养和锻炼在学习完本门课后综合应用所学理论知识,解决实际工程设计和应用问题的能力。通过课程设计,要求熟悉和掌握微机系统的软件、硬件设计的方法、设计步骤,得到微机开发应用方面的初步训练。同时并了解综合问题的程序设计掌握实时处理程序的编制和调试方法,掌握一般的设计步骤和流程,使我们以后搞设计时逻辑更加清晰。 二、设计内容 根据所学内容和对8255A的应用,整个系统硬件采用8086微处理器和8255A可编程并行接口芯片和8个LED等连成硬件电路。设计8个LED灯,实现如下要求:首先是1、3、5、7号LED依次亮1秒钟,当7号LED亮后,这四个灯同时闪烁5下。然后是2、4、6、8号LED依次亮1秒钟,当8号LED亮后,这四个灯同时闪烁5下。 三、设计要求 使用8255A可编程接口芯片实现8个LED灯以十种不同的方式显示。画出硬件电路图,能在PROTEUS中模拟实现。
基于51单片机心形流水灯C语言源程序
#include
P0=0x04; delayms(50); P0=0x08; delayms(50); P0=0x10; delayms(50); P0=0x20; delayms(50); P0=0x40; delayms(50); P0=0x80; delayms(50); P0=0x00; P2=0x01; delayms(50); P2=0x02; delayms(50); P2=0x04; delayms(50); P2=0x08; delayms(50); P2=0x10; delayms(50); P2=0x20; delayms(50); P2=0x40; delayms(50); P2=0x80; delayms(50); P2=0x00; P3=0x80; delayms(50); P3=0x40; delayms(50); P3=0x20; delayms(50); P3=0x10; delayms(50); P3=0x08; delayms(50); P3=0x04; delayms(50);
一、电路图 二、原理 对于较长时间的定时,应采用复合定时的方法。这里使T/C0工作在定时器方式1,定时100ms,定时时间到后P1.0反相,即P1.0端输出周期200ms的方波脉冲。另设T/C1共作的计数器方式2,对T1输出的脉冲计数,当计数满5次时,定时1时间到,将P1.7端反相,改变灯的状态! 三、源程序 #include
单片机流水灯C语言源程序 标题:51单片机流水灯C语言源程序2008-12-06 08:43:05 ************************************************************** 文件名称:flash_led.c 文件说明:流水灯C程序 编写日期:2006年10月5日 程序说明:MCU采用AT89S51,外接12M晶振,P1口输出 *************************************************************/ #include //51系列单片机定义文件 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void) { uint i; uchar temp; while(1) { temp=0x01; for(i=0;i<8;i++) //8个流水灯逐个闪动 { P1=~temp; delay(100); //调用延时函数 temp<<=1; } temp=0x80; for(i=0;i<8;i++) //8个流水灯反向逐个闪动 { P1=~temp; delay(100); //调用延时函数 temp>>=1; } temp=0xFE; for(i=0;i<8;i++) //8个流水灯依次全部点亮 { P1=temp; delay(100); //调用延时函数 temp<<=1; }
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秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。当亮灯移到左侧后,开始与上述反方向移动,即亮灯由左向右移动,重复循环。 程序:
C51单片机(32路流水灯C语言程序) #include 单片机小系统设计与制作实验报告 姓名:李文浩 学号:1423102 班级:14级电仪维 指导教师:陈雪莲 实验一八个LED灯闪烁 一、实验要求 仿照图1-1在Proteus中绘制一个基于AT89C51单片机控制八个LED灯进行闪烁。 现象: 八个LED灯闪烁,为黄灯; 图1-1 八个LED灯闪烁电路图 二、实验目的 (1)学会使用Proteus ISIS绘制硬件电路图,掌握加载程序和仿真运行等基本操作。 (2)掌握c语言里调用延时子程序的方法。 (3)掌握proteus的工程建立,仿真,调试。 (4)学会如何在Proteus ISIS上放置元件和连线。 (5)学会如何在Proteus ISIS加载目标代码。 三、实验步骤 1、在Proteus ISIS中设计硬件电路 (1)创建文件名“123”保存在对应的文件夹“E:\123"下。 (2)利用关键字或分类检索的方法将电路原理图中需要的元器件挑选至对象选择列表,主要元件可参照表1-1,然后依次选中在设计区单击,放入电路图。 (3)从模型选择工具栏的终端(Terminal)模型中将地线端子(Ground)和电源端子(Power)放置到电路中。 (4)连接电路原理图,可参考图1-1。 表1-1 (1)启动Keil uVision2软件,创建新工程:123,CPU选择Atmel 89C51。 (2)创建文件,以c为扩展名保存。 (3)执行“Source”菜单下的“Add”命令添加程序“123.c”。 (4)对工程的属性进行设置:目标属性中选择“生成HEX文件” (5)编写源程序,进行汇编/编译、调试。 3、仿真运行 启动Proteus ISIS,打开电路图“123.DSN”,单片机属性中选择目标文件123.HEX,然后进行仿真运行,操作电路中的开关,观察运行结果。 4、程序 #include 太原理工大学 单片机原理与应用技术课程实验报告 专业班级 学号 姓名 指导教师 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 六、实验步骤 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平台下创建源程序。需要在Keil C环境下编写源程序并成功编译生成hex文件,然后加载到Proteus 仿真电路的单片机上。 (5)工程创建向导结束,配置情况确认。 (6)点击“P”按钮在器件库中搜索并添加电路中所需要的器件。 (7)根据电路图将器件放置到绘图区并合理布局,右键单击器件弹出快捷菜单,可以进行旋转、镜像、修改参数(如电容、电阻大小、晶振频率)等操作,双击器件也可以打开参数设置对话框,例如电容C1的设置对话框,将电容参数设置为30pF。 #include } void main() { IT0=1; EX0=1; EA=1; flag=0; light=0x01; i=0; while(1) { switch(flag) { case 0:left();break; case 1:right();break; case 2:huayang();break; } } } void int0() interrupt 0 using 0 { delay10s(); if(INT0==0) { flag++; if(flag==3) flag=0; } } 1.功能说明:控制单片机P1端口输出,使位所接的LED点亮,其他7只灯熄灭。程序: 01: MOV A , #B ; 存入欲显示灯的位置数据 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, #B ;存入开始点亮灯位置 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,每次点亮一只,先把右边的第一只点亮,秒后点亮右数的第二只灯,第一只熄灭,再过秒点亮右数的第三只灯,第二只熄灭,…亮灯按此顺序由右向左移动。当亮灯移到左侧后,开始与上述反方向移动,即亮灯由左向右移动,重复循环。 程序: 01: START: MOV R0, #8 ;设左移8次 02: MOV A,#0FEH ;存入开始亮灯位置 03: LOOP: MOV P1, A ;传送到P1并输出 04: ACALL DELAY ;调延时子程序 05: RL A ;左移一位 06: DJNZ R0, LOOP ;判断移动次数 07: MOV R1, #8 ;设右移8次 08; LOOP1: RR A ;右移一位 09: MOV P1, A ;传送到P1并输出实验一LED灯闪烁
LED灯闪烁控制
单片机八个灯闪烁控制程序
51单片机:LED灯亮灯灭程序设计