1、用Proteus软件画出电路原理图。要求在P1.0至P1.7口
线上分别接LED0至LED7八个发光二极管,在P3.0口线上
接一蜂鸣器。
2、编写程序:要求LED0至LED7以秒速率循环右移。
3、编写程序:要求LED0至LED7以秒速率循环左移。
4、编写程序:要求在灯移动的同时,蜂鸣器逐位报警。
查询方式右移
ORG 0000H
CLRO: MOV IE, #00H;关闭中断
MOV TMOD, #10H;方式1
MOV SP, #30H; 开辟栈底
MOV TH1, #3CH;采用定时器1定时50ms
MOV TL1, #0B0H;
SETB TR1;开启定时器
MOV P1, #07FH;起始状态LED7亮
MOV A, #7FH;
MOV P3, #0FFH;
MAIN: MOV R3,#14H;20次
LCALL TIME; 定时一秒
CLR P3.0;
RR A;右移
MOV P1, A;灯右移
LJMP MAIN;
定时一秒的子程序
TIME: JBC TF1, LOOP2;溢出标志位为1跳转
AJMP TIME;
LOOP2: MOV TH1, #3CH;
MOV TL1, #0B0H;
DJNZ R3, TIME;R3先自减再,判断R3是否为0,为0跳转RET;返回主程序
END
中断方式左移低电平有效
START: LJMP MAIN
ORG 000BH
LJMP TTCO
ORG 0100H
MAIN: MOV SP, #30H; 开辟栈底
SETB EA; 打开总中断
SETB ET0; 打开定时器中断
MOV R1, #00H;
MOV R2, #14H;
MOV A, #0FEH; 给A送值
MOV P1, A;初始状态LED0亮
LOOP: LCALL TIME;调用一秒的延时子程序
RL A;左移
MOV P1, A;灯左移
CLR P3.0;开启蜂鸣器
LJMP LOOP;
定时为1S,
TIME: MOV TMOD, #01H; 设置定时器为工作方式1
MOV TH0, #3CH; 初始化定时时间50us
MOV TL0, #0B0H;
SETB TR0;
LOOP2: CJNE R1, #14H, LOOP2; 出现R1=14H才往下执行,MOV R1, #00H;
RET
ORG 2000H
中断程序
TTCO: MOV TH0, #3CH
MOV TL0, #0B0H; 再次初始化定时时间
INC R1
LOOP1: RETI
END
双向流水灯循环
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TTC0
MAIN: MOV R0, #08H
MOV R1, #00H
MOV A, #0FEH
SETB EA
SETB ET0;
LOOP1: LCALL TIME
MOV P1, A
RL A
CPL P3.0;
DJNZ R0, LOOP1
MOV R0,#08H;
LOOP2: LCALL TIME
RR A ;
MOV P1,A;
CPL P3.0
DJNZ R0, LOOP2;
MOV R0,#08H;
LJMP LOOP1;
TIME: MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #0B0H
SETB TR0;
HERE: CJNE R1, #14H, HERE
MOV R1, #00H
RET
ORG 2000H
TTC0: INC R1;
MOV TH0, #3CH
MOV TL0, #0B0H
RETI
END
十六进制数,12MHZ,
ORG 0000H
CLRO: MOV IE, #00H;
MOV TMOD, #10H;方式1
MOV TH1, #3CH;定时器1定时50ms
MOV TL1, #0B0H;
SETB TR1;开始定时器
MOV R3, #00H;
MOV P1, #0FFH;led初始全灭
MOV A, #00H;
MOV P3, #0FFH;
MOV SP, #30H;开辟堆栈MAIN: LCALL TIME;
MOV R3, #00H;
ADDC A, #01H;高电平有效
MOV R2, A;保护A,
CPL A;对A取反
MOV P1, A;把A赋格P1
MOV A, R2;取出以前的A
CLR P3.0;开启蜂鸣器
CJNE A, #0FFH, MAIN;
MOV A, #00H;清零重新开始
LJMP MAIN;
延时1ms子程序
TIME: JBC TF1, LOOP2;溢出标志位
AJMP TIME;
LOOP2: INC R3;
MOV TH1, #3CH;
MOV TL1, #0B0H;
CJNE R3, #14H, TIME;执行20次
RET
END
LED0表示第七位--LED7表示第0位
ORG 0000H ; 十六进制计数规律翻转亮灯(由原来子程序——查询改写)
MAIN: MOV A, #01H
CLR EA
MOV R0, #14H;定20次
MOV P1, #80H
LOOP1: LCALL DELAY
MOV R0, #14H
INC A
MOV 20H, A; 将A的值存入20H位寻址区
JB 20H.0, FZ1; 判断20H.0是否为1
NEXT1: JB 20H.1, FZ2; 。。。
NEXT2: JB 20H.2, FZ3; 。。。
NEXT3: JB 20H.3, FZ4; 。。。
NEXT4: JB 20H.4, FZ5; 。。。
NEXT5: JB 20H.5, FZ6; 。。。
NEXT6: JB 20H.6, FZ7; 。。。
NEXT7: JB 20H.7, FZ8; 。。。
LJMP OUT
FZ1: SETB 0FH; 如果20H.0为1则将21H.7(0FH)置1
LJMP NEXT1; 跳转到上面继续判断下一位
FZ2: SETB 0EH; 。。。
LJMP NEXT2; 。。。
FZ3: SETB 0DH;
LJMP NEXT3;
FZ4: SETB 0CH;
LJMP NEXT4;
FZ5: SETB 0BH;
LJMP NEXT5;
FZ6: SETB 0AH;
LJMP NEXT6;
FZ7: SETB 09H;
LJMP NEXT7;
FZ8: SETB 08H;
OUT: MOV P1, 21H; 将翻过来的数输入到P1口
MOV 21H, #00H; 清零为重新输入新的值做准备
LJMP LOOP1
DELAY: MOV TMOD, #01H ;方式1
MOV TH0, #03CH; 定时50MS
MOV TL0, #0B0H
MOV IE, #00H
SETB TR0
LOOP2: JBC TF0, LOOP3
LJMP LOOP2
LOOP3: DJNZ R0, DELAY;R0自减判断循环
RET
END
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
#include
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。那个单片机究竟有什么 功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^) 我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机 上接上最少的外围电路元件让单片机工作。一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。 #include
51单片机的流水灯控制 班级:100712 姓名:全建冲 学号:10071047
一、设计要求 用51单片机设计一个流水灯的控制方案,要求采用定时器定时,利用中断法控制流水灯的亮灭,画出电路图和程序流程图,写出程序代码以及代码注释。 二、电路原理图 原理图分析: 本原理图采用STC89S52单片机控制8个LED灯,其中8个LED灯的负极接单片机的P1端口,正极通过1KΩ排阻连接到电源上。原理图中还给出了晶振与复位端,以保证控制器的稳定工作。
三、程序流程图
四、程序代码及注解 1.非中断定时器控制 #include
i++; if(i==10)//500毫秒定时 { i=0; P1=a;//P1端口赋值 a=_crol_(a,1);//循环左移 } TF=0;//清除定时器溢出标志 } } } 程序分析:本程序采用非中断定时器法控制流水灯,核心语句在于读取标志位TF位,TF为定时器溢出标志位,溢出时硬件自动置一,所以循环读取标志位以判断定时器是否溢出,而每次溢出需要手动清零,否则定时器无法再次溢出,利用标志i读取10次即可达到500毫秒的定时。另外需要注意的是单片机晶振为11.0592MHz,所以计时一个数的时间为12/11.0592=1.085us,故定时50毫秒的计数为50000/1.085=46080。 2.中断定时器控制 #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 单片机并口简单应用(流水灯) 实验目的 1、了解单片机C语言程序的基本结构 2、了解单片机C语言程序的设计和调试方法 3、掌握顺序控制程序的简单编程 4、熟悉51单片机的端口使用 实验仪器 单片机开发试验仪、稳压电源、计算机 实验原理 1、硬件电路 如图1所示,流水灯硬件电路由发光二极管、单片机并口(P0)、限流电阻等组成。发光二极管连接成共阳极结构。发光二极管点亮的条件是:阳极接高电平、各阴极接低电平。因此,二极管公共端阳极就接成高电平,然后再按一定规则从P0口输出数据,发光二极管就会点亮。 图1 流水灯电路图 2、程序流程图如下。
实验内容:1、开发板接线图 延时 P0口初态循环右移1位 P0口状重新赋值0XFE 开始 P0口输出0XFE P0是否等于0X00 Y N
2、开发环境设置 打开keil软件,版本μ Vision2 ,μvision3,μvision4 都一样,在这里用μvision4版本演示,打开之后如下图,有的时候会默认打开上次使用的工程,单击Project 菜单,选择 Close Project 关闭了默认打开的工程,显示下图界面: 我们要建立新的工程,选择Project→ newμ vision projiect… 选择工程要保存的路径,输入工程文件名,如图
点击保存后会弹出一个对话框,要求用户选择单片机型号,可以根据用户使用的单片机来选择,我们使用的STC90单片机是兼容51内核的,Keil C51 几乎支持所有的51内核单片机,51内核具有通用型,如果程序用的资源不是太复杂,我们可以选择任意一款51单片机内核就行。例程以添加Atmel 的AT89C51来说明。如图,然后,单击确定(OK)。 功能描述 如果出现下面的界面:单击是就可以,意思是将单片机的启动代码添加到工程,我们不用修改。 到目前我们还没建立一个完整的工程,只是有工程的名字,框架,工程中还没有任何文件代码,(除了启动代码,有的keil 版本不显示启动代码),接下来我们添加文件及代码。 单击菜单File→New 选项,或者单击界面上的快捷图标,新建文件串口如下。
单片机为89c52 晶振为11.0592, /***此程序为流水灯*** / #include
/*8个发光管间隔200ms由上至下,返回再由上至下,一个个往下亮,后全亮由下至上,返回再由下至上,一个个往下亮,后全亮 再重复2次, 然后全部熄灭再以500ms间隔 全部闪烁3次。重复此过程*/ #include
一、傻瓜式编程 #include<> #define uint unsigned int #define uchar unsigned char void delay(uint z); //延时子函数的声明main () { P0=0xfe;//第一个灯亮 delay(500); P0=0xfd;//第二个灯亮 delay(500); P0=0xfb; delay(500); P0=0xf7; delay(500); P0=0xef; delay(500); P0=0xdf; delay(500); P0=0xbf; delay(500); P0=0x7f; delay(500); } void delay(uint z) //延时子函数 { uint x,y; for(x=0;x 二、用移位符号“<<”或“>>” void main() //主函数 { a=0xfe; //给a赋值 while(1) { P0=a; //给P0口赋值,第一个等亮 a为1111 1110 a=~a; //求反 a为0000 0001 a=a<<1;//移位 a为0000 0010 a=~a; //求反还原a。第二个灯亮 a为1111 1101 delay(500); if(a==0x7f) { P0=0x7f;//第八个灯亮一次 delay(500); a=0xfe;//让第一个灯亮,然后无限循环 } } } 三、用移位函数_crol_( )和_cror_( ) main() { a=0xfe; while(1) { P0=a; delay(500); a=_crol_(a,1); //a每次左移一位 } } 四、使用数组 uchar code table[ ]={0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf,0x7f}; main() { whlie(1) { for(a=0;a<8;a++) { P0=table[a]; delay(500); } } } 单片机流水灯汇编程序设计 开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 程序A: ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 程序B: ;用移位方式实现流水灯 ajmp main ;跳转到主程序 org 0030h ;主程序起始地址 main: mov a,#0feh ;给A赋值成11111110 loop: mov p1,a ;将A送到P1口,发光二极管低电平点亮 lcall delay ;调用延时子程序 rl a ;累加器A循环左移一位 ajmp loop ;重新送P1显示 delay: mov r3,#20 ;最外层循环二十次 d1: mov r4,#80 ;次外层循环八十次 d2: mov r5,#250 ;最内层循环250次 djnz r5,$ ;总共延时2us*250*80*20=0.8S djnz r4,d2 djnz r3,d1 ret end 51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。 ORG 0 ;程序从0地址开始 START: MOV A,#0FEH ;让ACC的内容为11111110 LOOP: MOV P2,A ;让P2口输出ACC的内容 RR A ;让ACC的内容左移 CALL DELAY ;调用延时子程序 LJMP LOOP ;跳到LOOP处执行 ;0.1秒延时子程序(12MHz晶振)=================== DELAY: MOV R7,#200 ;R7寄存器加载200次数 D1: MOV R6,#250 ;R6寄存器加载250次数 DJNZ R6,$ ;本行执行R6次 DJNZ R7,D1 ;D1循环执行R7次 RET ;返回主程序 五种编程方式实现流水灯的单片机C程序 //功能:采用顺序结构实现的流水灯控制程序 /*此方式中采用的是字操作(也称为总线操作)*/ #include 单片机流水灯汇编程序设计 流水灯汇编程序 8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。 ;用最直接的方式实现流水灯 ORG 0000H START:MOV P1,#01111111B ;最下面的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#10111111B ;最下面第二个的LED点亮 LCALL DELAY ;延时1秒 MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: ;大约值:2us*256*256*2=260ms,也可以认为为250ms PUSH PSW ;现场保护指令(有时可以不加) MOV R4,#2 L3: MOV R2 ,#00H L1: MOV R3 ,#00H L2: DJNZ R3 ,L2 ;最内层循环:(256次)2个周期指令(R3减一,如果比1大,则转向L2) DJNZ R2 ,L1 ; 中层循环:256次 DJNZ R4 ,L3 ;外层循环:2次 POP PSW RET END 51单片机汇编程序集(二) 2008年12月12日星期五 10:27 辛普生积分程序 内部RAM数据排序程序(升序) 外部RAM数据排序程序(升序) 外部RAM浮点数排序程序(升序) BCD小数转换为二进制小数(2位) BCD小数转换为二进制小数(N位) BCD整数转换为二进制整数(1位) BCD整数转换为二进制整数(2位) BCD整数转换为二进制整数(3位) BCD整数转换为二进制整数(N位) 二进制小数(2位)转换为十进制小数(分离BCD码) 二进制小数(M位)转换为十进制小数(分离BCD码) 二进制整数(2位)转换为十进制整数(分离BCD码) 二进制整数(2位)转换为十进制整数(组合BCD码) 二进制整数(3位)转换为十进制整数(分离BCD码) 二进制整数(3位)转换为十进制整数(组合BCD码) 二进制整数(M位)转换为十进制整数(组合BCD码) 三字节无符号除法程序(R2R3R4/R7)=(R2)R3R4 余数R7 ;二进制整数(2位)转换为十进制整数(分离BCD码) ;入口: R3,R4 ;占用资源: ACC,R2,NDIV31 ;堆栈需求: 5字节 ;出口: R0,NCNT IBTD21 : MOV NCNT,#00H MOV R2,#00H IBD211 : MOV R7,#0AH LCALL NDIV31 MOV A,R7 MOV @R0,A INC R0 INC NCNT MOV A,R3 ORL A,R4 JNZ IBD211 MOV A,R0 CLR C SUBB A,NCNT MOV R0,A RET ;二进制整数(2位)转换为十进制整数(组合BCD码) ;入口: R3,R4 ;占用资源: ACC,B,R7 ;堆栈需求: 3字节 ;出口: R0 1.引言 当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。学习单片机的最有效方法就是理论与实践并重,本文笔者用AT89C51单片机自制了一款简易的流水灯,重点介绍了其软件编程方法,以期给单片机初学者以启发,更快地成为单片机领域的优秀人才。 2.硬件组成 按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATM EL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz 工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的软件组成的单个单片机。其具体硬件组成如图1所示。 图1 流水灯硬件原理图 从原理图中可以看出,如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要 51单片机流水灯试验 一、实验目的 1.了解51单片机的引脚结构。 2.根据所学汇编语言编写代码实现LED灯的流水功能。 3.利用开发板下载hex文件后验证功能。 二、实验器材 个人电脑,80c51单片机,开发板 三、实验原理 单片机流水的实质是单片机各引脚在规定的时间逐个上电,使LED灯能逐个亮起来但过了该引脚通电的时间后便灭灯的过程,实验中使用了单片机的P2端口,对8个LED灯进行控制,要实现逐个亮灯即将P2的各端口逐一置零,中间使用时间间隔隔开各灯的亮灭。使用rl或rr a实现位的转换。 A寄存器的位经过rr a之后转换如下所示: 然后将A寄存器转换一次便送给P2即MOV P2,A便将转换后的数送到了P2口,不断循环下去,便实现了逐位置一操作。 四、实验电路图 五、通过仿真实验正确性 代码如下:ORG 0 MOV A,#00000001B LOOP:MOV P2,A RL A ACALL DELAY SJMP LOOP DELAY:MOV R1,#255 DEL2:MOV R2,#250 DEL1:DJNZ R2,DEL1 DJNZ R1,DEL2 RET End 实验结果: 六、实验参考程序 #include sbit P00=P0^0; sbit P01=P0^1; void delay(uchar t) { uchar i,j; for(i=0;i 基于51单片机的各种花样的流水灯c51程序/*----------------------------------------------- 功能:流水灯对称移动闪烁(双闪烁) ------------------------------------------------*/ #include if(comp1==0x7f) { comp1=0xfe; comp2=0x80; P1=0x00; delay(30000); } 发现if语句没有被执行,自然继续左右移动: 1111 1111&1111 1111^0000 0000==11111 1111 所以看起来是执行了一次while中的代码。 具体为什么不行,还不清楚…… 更正下列代码后,能够实现功能。 if(P1==0x7e) { comp1=0xfe; comp2=0x80; } 或者: if(comp2==0x01) { comp1=0xfe; comp2=0x80; } --------------------------------------------------------------*/ ********************************************* /*----------------------------------------------- 功能:流水灯(单向单闪烁) ------------------------------------------------*/ #include 单片机流水灯所有程序 SANY GROUP system office room 【SANYUA16H-SANYHUASANYUA8Q8- #include 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 #include 花样流水灯C语言程序代码 Lesso2.1: 第一个发光管以间隔200ms闪烁(这是最原始的程序没有用延迟子函数)。 #include void delay(uint); uchar temp; sbit beep=P2^3; void main() { temp=0xfe; while(1) { P1=temp; beep=0; delay(500); P1=0xff; beep=1; delay(500); temp=_crol_(temp,1); } } void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } Lesson2.3:8个发光管来回流动,第个管亮100ms,流动时让蜂鸣器发出“滴滴”声。 #include 实验一单片机并口简单应用(流水灯) 实验目的 1、了解单片机汇编语言程序的基本结构 2、了解单片机汇编语言程序的设计和调试方法 3、掌握顺序控制程序的简单编程 实验仪器 单片机开发板、万利仿真机、稳压电源、计算机 实验原理 1、流水灯硬件电路 如图4-1所示,流水灯硬件电路由移位寄存器74LS164、功能选择开关J502、二极管、三极管、单片机并口(P0)、限流电阻等组成。发光二极管连接成共阳极结构。发光二极管点亮的条件是:阳极接高电平、各阴极接低电平。因此,通过程序控制74LS164的Q0端。Q0端输出0,公共端阳极就接成高电平,然后再按一定规则从P0口输出数据,发光二极管就会点亮。 图4-1 流水灯电路图 2、单片机流水灯程序设计 由上图可知,发光二极管要点亮,需要先把J502的2、3脚相连,三极管Q500导通,然后从P0口输出数据。 (1)控制三极管导通程序 控制三极管有两种方法,第一种:在74LS164的第8脚产生一个正脉冲,此时1脚为0,三极管就导通;为1,三极管就截止。 第二种:在单片机IO模拟74LS164时序,一次输出一个字节,只要Q0=0即可控制三极管开通。为1,三极管截止。 两种方法的程序流程如图4-2所示。 图4-2 流水灯位选信号控制 (2)产生流水灯效果程序 三极管导通后,就可以从P0口输出数据控制发光二极管。P0口输出数据既可以编写程序逐个输出,也可以将输出数据序列定义在存储器中,然后用读程序存储器指令逐个取出并输出到P0口。 程序流程图如图4-3所示。 图4-3 流水灯程序流程图 实验内容 1、直接输出法输出数据序列 2、查表法输出数据序列 实验步骤及调试信息 1、新建实验项目shiyan1 2、输入实验程序并补充完整 3、编译下载实验程序,并修改错误(按附录说明) 原因:缺少主程序 4、加入主程序重新产生代码并装入,出现以下错误。 **************************** 红外遥控实验 ****************************/#include"reg 52."h" #include"intrins.h" sbit int0=P3A2;// 外部中断0 #define uint unsigned int #define uchar unsigned char uint v; uchar temp,IrValue[6]; /******************************************************** void delay1ms(uint z)//1ms 延时{uint x,y; for(x=z;x>0;x--) for(y=120;y>0;y--);}void DelayMs(unsigned int x)// 0."14ms 误差0us{unsigned char i; while(x--){for (i = 0; i<13; i++) {}}} /******************************************************** void ma in (){IT0=1;〃下降沿触发 EX0=1;〃打开中断0允许 EA=1;〃打开总中断 int0=1;// 初始化端口 1/ 4 P1=0x03; while (1) {if(lrValue[2]==0x47)〃按下0( v? b x47 代表的键 始,按其他键停止{temp=P1; P仁_crol_(temp,3)流水灯开 delay1ms(v+200);}}}/**************************************************** ****/ void int00() interrupt 0{unsigned char j,k; unsigned int err,Time; Time=0; DelayMs (68); if(intO==O)〃确认是否真的接收到正确的信号{err=1000;//1000*10us=10ms,超过说明接收到错误的信号 /* 当两个条件都为真是循环,如果有一个条件为假的时候跳出循环,免得程序出错的时 侯,程序死在这里*/ while((int0==0)&&(err>0))// 等待前面9ms 的低电平过去{DelayMs (1); err--;}if(int0==1){err=500;〃如果正确等到9ms 低电平 while((int0==1)&&(err>0)){DelayMs err--;}for(k=0;k<4;k++){for(j=0;j<8;j++) (1); 2/ 4最经典的51单片机经典流水灯汇编程序
最新五种编程方式实现流水灯的单片机c程序讲课教案
51单片机经典流水灯汇编程序
用单片机控制的LED流水灯设计(电路、程序全部给出)
51单片机流水灯实验报告
基于51单片机的各种花样的流水灯c51程序
单片机流水灯所有程序
51单片机流水灯 程序
单片机花样流水灯源代码
单片机并口简单应用(流水灯)实验报告.doc
单片机红外遥控控制流水灯程序