单片机汇编语言跑马灯
- 格式:doc
- 大小:2.18 MB
- 文档页数:10
单片机汇编语言跑马灯实验一跑马灯-亮灯左移右移循环黄天佑 20132301155一、实验目的1、进一步熟悉keil C仿真软件及单片机实验板的使用。
2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。
3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。
4、了解单片机汇编语言程序的设计和调试方法。
二、实验原理1、实验板硬件电路图2、单片机流水灯程序设计(1)流水灯程序设计思路及程序流程。
实现流水灯的方法有很多,这里介绍一种。
开始灯向左移(2)产生流水灯效果程序(逐条程序加注释)start:mov R0,#8 ; 设置左移8次mov A,#0FEH; 存入开始亮灯的位置LOOP: mov P0,A; 传送P0并输出ACALL DELAY; 调用延时程序RL A; 左移1位DJNZ R0,LOOP; 判断移送次数mov R1,#8; 设置右移8次LOOP1:RR A; 右移1位mov P0,A; 传送到P0口并输出ACALL DELAY; 调用延时程序DJNZ R1,LOOP1; 判断右移次数JMP start; 重新设定显示DELAY: mov R5,#10; 延时0.1s子程序D1: mov R6,#100;D2: mov R7,#100;DJNZ R7,$;DJNZ R6,D2;DJNZ R5,D1;RET ; 子程序返回END ; 程序结束三、实验步骤及调试过程1、汇编语言程序的编写与调试(1)新建一个工程(2)保存文件,设一个文件名(3)找到对应单片机的芯片,这里我们选AT89C51即可接着我们新建一个文本写程序(1)(2)保存文件名,注意文件名的后缀应该为.asm (汇编语言程序的格式)接着把我们的文本导入到工程里面去:(1)(2)点击Add,再Close即可2.汇编语言程序编译及下载(1)这里要设置一个输出.hex文件(2)点击生成工程相应的文件同时可以观察下面的结果:0 Error(s),即可。
汇编语⾔实现led灯的跑马灯led实验1.看原理图看设备⼯作的原理(可能需要阅读芯⽚⼿册),看设备与cpu的连接关系GPIO具有输⼊输出功能。
输⼊:cpu想知道io引脚是⾼电平还是低电平那么就是输⼊⽅式输出:cpu想控制io引脚为⾼电平还是低电平那么就是输出⽅式跟电流的⽅向没有任何关系2. cpu的相关章节GPJ2CON control是配置这个引脚是什么功能GPJ2有8个引脚,每个引脚由con寄存器中的4个位进⾏配置GPJ2DAT 如果cpu要输出⾼电平或者低电平,就需要设置该寄存器,只有8位有效When the port is configured as input port, the correspondingbit is the pin state. When the port is configured as outputport, the pin state is the same as the corresponding bit.When the port is configured as functional pin, the undefinedvalue will be read.当配置为输⼊模式的时候,dat寄存器中的某⼀位的值由引脚设置,引脚是⾼电平是,对应的位为1,引脚为低电平时,对应的位为0当配置为输出模式的时候,dat寄存器中的某⼀位控制引脚的电平,对应的位为1时,对应的引脚输出⾼电平,对应的位为0时,对应的引脚输出为低电平其他功能模式时,读到的值是未定义的。
@gec210 light first led.globl _start_start:ldr r0,=0xe0200280mov r1,#1<<4str r1,[r0] @config pin0 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);arm-linux-gcc -c led.S -o led.o //编译不链接arm-linux-ld -Ttext 0x30008000 led.o -o led.elf //链接指定代码段起始位置arm-linux-objcopy -O binary led.elf led.bin //⽣成⼆进制执⾏⽂件arm-linux-objdump -D led.elf > led.dis //⽣成反汇编代码uboot的⼏个常⽤命令printenv 打印显⽰环境变量ipaddr=192.168.1.4 //开发板的ipserverip=192.168.1.2 //tftp服务器的ip设置为各⾃的ip,只是设置到内存,掉电就没有setenv ipaddr 192.168.1.xsetenv serverip 192.168.1.xsaveenv //保存到flash中,再次启动后为刚刚设置的值ping //单向的,只能从开发板ping电脑alive表⽰⽹络是通的,not alive表⽰⽹络不通tftp 30008000 led.bin //下载⼆进制⽂件到内存0x30008000地址go 30008000 //跳转到0x30008000运⾏程序@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output modemov r1,#0str r1,[r0,#4] @output low levelb . @same as while(1);简单的makefileAPP=led$(APP).bin:$(APP).oarm-linux-ld -Ttext 0x30008000 $^ -o $(APP).elf arm-linux-objcopy -O binary $(APP).elf $@ arm-linux-objdump -D $(APP).elf > $(APP).dis cp $@ /home/gec/tftp/%.o:%.sarm-linux-gcc $^ -c -o $@%.o:%.Sarm-linux-gcc $^ -c -o $@%.o:%.carm-linux-gcc $^ -c -o $@clean:@rm -f $(APP).bin $(APP).elf $(APP).dis *.o四个灯同时点亮或者同时熄灭循环闪烁@gec210 light first led.globl _start_start:ldr r0,=0xe0200280ldr r1,=(1<<0 | 1<<4 | 1<<8 | 1<<12)str r1,[r0] @config pin0-pin3 output mode loop:mov r1,#0str r1,[r0,#4] @output low levelbl delaymov r1,#0xfstr r1,[r0,#4]bl delayb loopb . @same as while(1);delay:mov r4,#0xff00000delay1:subs r4,r4,#1bne delay1mov pc,lr#define GPJ2CON (unsigned long *)0xe0200280unsigned long *p = (unsigned long *)0xe0200280;p练习:第1个灯到第4个灯依次点亮,第4个灯到第1个灯依次熄灭,循环。
【51单片机8个跑马灯程序汇编设计思路】1. 引言在嵌入式系统中,跑马灯程序是一个非常常见且基础的程序设计。
通过控制LED灯的亮灭顺序,实现灯光在一组灯中顺序轮流亮起的效果。
其中,51单片机是一种常用的嵌入式系统开发评台,本文将探讨如何通过汇编语言设计实现8个跑马灯程序的思路和方法。
2. 分析题目我们需要对题目进行细致的分析。
51单片机8个跑马灯程序要求我们设计并实现一个程序,能够控制8个LED灯依次轮流亮起的效果。
这意味着我们需要对LED灯进行控制,并且需要考虑如何实现循环、延时等功能。
3. LED灯控制在实现跑马灯程序时,首先需要考虑如何控制LED灯的亮灭。
一种常见的方法是通过I/O口控制LED灯的高低电平,从而实现灯的亮灭。
我们需要了解51单片机的I/O口控制方式,并结合LED灯的连接方式进行设计。
4. 循环控制跑马灯程序的核心在于实现LED灯的依次轮流亮起。
这就需要我们设计循环控制的程序结构。
在汇编语言中,可以通过跳转指令和计数器来实现循环效果,我们需要考虑如何设计循环的次数和顺序。
5. 延时控制为了让人眼能够观察到LED灯的亮灭效果,我们需要在程序中添加延时控制。
这需要我们了解51单片机的定时器控制和时钟频率,并根据LED灯的亮度要求设计合适的延时程序。
6. 汇编设计思路在进行汇编设计时,可以按照以下步骤进行:1)设置I/O口控制LED灯的引脚,确定LED的连接方式;2)设计循环控制结构,确定LED灯的顺序和次数;3)添加延时程序,控制LED灯亮灭的时间间隔;4)编写中断程序,处理定时器中断等事件;5)调试程序,验证跑马灯效果是否符合要求。
7. 个人观点和理解通过设计这个跑马灯程序,我深切体会到了汇编语言的精妙之处。
通过对硬件的直接控制和对程序结构的精心设计,我感受到了嵌入式系统开发中的乐趣和挑战。
而对于初学者来说,设计跑马灯程序也是一个很好的学习过程,可以加深对于51单片机结构和编程思想的理解。
一、前言随着科技的不断发展,单片机技术在各个领域得到了广泛的应用。
为了提高我们的实践能力,加强理论知识与实际操作的结合,我们进行了单片机跑马灯实训。
通过本次实训,我们深入了解了单片机的基本原理,掌握了单片机的编程方法,并能够运用所学知识解决实际问题。
二、实训目的1. 熟悉单片机的硬件结构和工作原理。
2. 掌握单片机的编程方法,包括汇编语言和C语言。
3. 学会使用单片机进行简单的外设控制。
4. 提高动手能力和团队合作能力。
三、实训内容1. 实训设备(1)8051单片机开发板(2)LED灯(3)电阻(4)电源2. 实训步骤(1)搭建电路首先,我们需要搭建跑马灯的电路。
将LED灯串联,然后连接到单片机的P1口。
在LED灯的正极和负极之间串联一个电阻,用于限流。
(2)编写程序接下来,我们需要编写跑马灯的程序。
以下是用C语言编写的跑马灯程序:```c#include <reg51.h>#define LED P1void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 1275; j++);}void main() {while (1) {LED = 0x01; // 第一个LED灯亮 delay(500); // 延时LED = 0x02; // 第二个LED灯亮 delay(500); // 延时LED = 0x04; // 第三个LED灯亮 delay(500); // 延时LED = 0x08; // 第四个LED灯亮 delay(500); // 延时LED = 0x10; // 第五个LED灯亮 delay(500); // 延时LED = 0x20; // 第六个LED灯亮 delay(500); // 延时LED = 0x40; // 第七个LED灯亮 delay(500); // 延时LED = 0x80; // 第八个LED灯亮 delay(500); // 延时LED = 0x00; // 所有LED灯熄灭delay(500); // 延时}}```(3)编译程序将编写的程序导入到单片机开发板中,并下载到单片机中。
花式跑马灯汇编语言一、引言花式跑马灯是一种以灯光为媒介,通过不同的变化方式展示出各种图案和文字的装饰性效果。
在汇编语言中,我们可以使用特定的指令和技巧来实现花式跑马灯效果,从而给人一种炫目的视觉体验。
二、实现思路为了实现花式跑马灯效果,我们需要控制灯光的亮灭和变化,以展示出不同的图案和文字。
在汇编语言中,我们可以通过操作特定的寄存器和端口来控制灯光的状态。
我们需要定义一个存储灯光状态的变量,用来保存当前灯光的亮灭情况。
然后,我们可以使用循环结构来不断改变灯光的状态,从而实现灯光的闪烁效果。
三、具体实现1. 定义变量我们可以使用汇编语言中的数据段来定义一个变量,用来保存灯光的状态。
例如,我们可以定义一个字节变量“light”,用来表示灯光的亮灭状态,其中1表示亮,0表示灭。
2. 控制灯光为了控制灯光的状态,我们可以使用汇编语言中的端口操作指令来向特定的端口发送信号。
例如,我们可以使用OUT指令将灯光状态写入到特定的端口,从而控制灯光的亮灭。
3. 循环控制为了实现花式跑马灯效果,我们需要使用循环结构来不断改变灯光的状态。
例如,我们可以使用汇编语言中的循环指令来控制灯光的闪烁次数和速度,从而实现不同的效果。
四、示例代码下面是一个简单的示例代码,用来实现一个基本的花式跑马灯效果:```assembly.datalight db 1.codemain:mov ah, 0x0E ; 设置光标位置mov al, 'A' ; 设置要显示的字符int 0x10 ; 调用BIOS中断显示字符mov al, lightout 0x80, al ; 控制灯光状态xor al, 1 ; 取反灯光状态mov light, aljmp main ; 循环控制end main```五、总结通过使用汇编语言的指令和技巧,我们可以实现各种花式跑马灯效果。
通过控制灯光的亮灭和变化,我们可以展示出不同的图案和文字,从而给人一种炫目的视觉体验。
可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
实验1 跑马灯实验一、实验目的●初步学会Proteus ISIS和uVision2单片机集成开发环境的使用;●初步掌握采用汇编语言与C语言开发单片机系统的程序结构;●掌握80C51单片机通用I/O口的使用;●掌握单片机内部定时/计数器的使用及编程方法以及中断处理程序的编写方法。
二、实验设备及器件●硬件:PC机,HNIST-1型单片机实验系统●软件:Proteus ISIS单片机仿真环境,uVision2单片机集成开发环境三、实验内容●编写一段程序,采用P1口作为控制端口,使与P1口相接的四个发光二极管(D1、D2、D3、D4)按照一定的方式点亮。
如点亮方式为:先点亮D1,延时一段时间,再顺序点亮D2……D4,然后又是D4……D1,同时只能有一个灯亮;然后每隔一段时间一次使相邻两个灯亮,三个灯亮,四个灯亮,最后闪烁三次,接着循环变化。
●基于Proteus ISIS仿真环境完成上述功能的仿真。
●基于uVision2单片机集成开发环境与硬件平台完成程序的脱机运行。
四、实验原理图图3.1 跑马灯实验电路原理图电路原理图如上图3.1所示,AT89S52的P1.0~P1.3控制4个发光二极管,发光二极管按照一定次序发光,相邻发光二极管的发光时间间隔可以通过定时器控制,还可以通过软件延时实现。
五、软件流程图与参考程序●主程序流程图如下:●参考程序#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar aa,num,speed,flag;uchar code table[]={0x0e,0x0d,0x0b,0x07};uchar code table1[]={0x0a,0x05,0x09,0x06};uchar codetable2[]={0x0c,0x09,0x03,0x08,0x01,0x0e,0x0c,0x08,0x00};void delay(uint z)//延时函数{uint x;uchar y;for(x=z;x>0;x--)for(y=200;y>0;y--);}void init()//条件初始化函数{ flag=0;speed=10;//控制跑马灯流水速度TMOD=0x01;//中断方式TH0=(65535-50000)/256;TL0=(65536-50000)%256;//初值EA=1;//打开总中断ET0=1;//打开外中断0TR0=1;}void main(){init();//调用初始化函数while(1){if(flag){delay(2000);//调用延时函数for(num=0;num<4;num++)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔一个依次闪烁{P1=table[num];delay(2000);}for(num=0;num<4;num++)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=3;num>0;num--)//从左至右间隔两个依次闪烁{P1=table1[num];delay(2000);}for(num=0;num<6;num++)//两个,三个,四个跑马灯依次闪烁{P1=table2[num];delay(2000);}for(num=0;num<5;num++)//闪烁5次{P1=0xff;//全暗delay(2000);P1=0X00;//全亮delay(2000);}speed=speed-3;//变速if(speed==4){speed=10;}}}}void timer0() interrupt 1//中断函数{TH0=(65535-50000)/256;TL0=(65536-50000)%256;aa++;if(aa==speed){aa=0;flag=1;}}六、实验思考题●请用汇编指令完成本实验内容,深刻理解汇编语言程序设计结构。
51单片机8个跑马灯程序汇编设计思路51单片机8个跑马灯程序汇编设计思路主题:51单片机8个跑马灯程序汇编设计思路引言:在微电子领域中,51单片机是应用最广泛的一种单片机。
它具有性能稳定、开发简单、存储容量大等特点,广泛应用于各种电子设备中。
其中,跑马灯程序是初学者最常接触的一个项目,通过实践该项目,我们可以提高对汇编语言的理解和应用能力。
本文将介绍51单片机8个跑马灯程序汇编设计的思路,以帮助读者更好地掌握该项目。
一、跑马灯程序的基本原理1.1 硬件设计51单片机跑马灯程序的实现需要使用LED灯和适当的电路连接。
我们可以选择使用8个LED灯,分别连接到IO口P0.0~P0.7上。
通过对IO口的控制,即可控制LED灯的亮灭。
1.2 软件设计在51单片机中,我们需要使用汇编语言来编写程序。
跑马灯程序的实现思路是通过对LED灯的逐个依次点亮和熄灭,实现灯光在各个LED之间不断左右滚动的效果。
通过不断循环该过程,即可实现跑马灯效果。
二、跑马灯程序的编写2.1 初始化设置在程序的开始部分,我们需要进行一些初始化设置。
需要设置IO口的工作模式,将所有IO口设置为输出模式。
需要设置定时器和中断相关的参数,以便后续的延迟操作。
2.2 跑马灯效果的实现跑马灯的实现思路可以分为两个部分:向左滚动和向右滚动。
2.2.1 向左滚动向左滚动的实现思路是依次点亮LED灯,然后通过适当的延迟时间熄灭LED灯,实现灯光的滚动效果。
在点亮一个LED灯之后,下一个LED灯便开始点亮。
通过循环该操作,即可实现向左滚动的效果。
2.2.2 向右滚动向右滚动的实现思路与向左滚动类似,只是点亮LED灯的顺序相反。
在点亮一个LED灯之后,上一个LED灯便开始点亮。
通过循环该操作,即可实现向右滚动的效果。
2.3 循环控制为了实现跑马灯的效果,我们需要将向左滚动和向右滚动两个操作循环执行。
通过添加一个计数器变量,当计数器达到一定的值时,切换滚动方向,实现跑马灯效果的循环。
实验一跑马灯-亮灯左移右移循环黄天佑 20132301155一、实验目的1、进一步熟悉keil C仿真软件及单片机实验板的使用。
2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。
3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。
4、了解单片机汇编语言程序的设计和调试方法。
二、实验原理1、实验板硬件电路图2、单片机流水灯程序设计(1)流水灯程序设计思路及程序流程。
实现流水灯的方法有很多,这里介绍一种。
(2)产生流水灯效果程序(逐条程序加注释)start:mov R0,#8 ; 设置左移8次mov A,#0FEH; 存入开始亮灯的位置LOOP: mov P0,A; 传送P0并输出ACALL DELAY; 调用延时程序RL A; 左移1位DJNZ R0,LOOP; 判断移送次数mov R1,#8; 设置右移8次LOOP1:RR A; 右移1位mov P0,A; 传送到P0口并输出ACALL DELAY; 调用延时程序DJNZ R1,LOOP1; 判断右移次数JMP start; 重新设定显示DELAY: mov R5,#10; 延时0.1s子程序D1: mov R6,#100;D2: mov R7,#100;DJNZ R7,$;DJNZ R6,D2;DJNZ R5,D1;RET ; 子程序返回END ; 程序结束三、实验步骤及调试过程1、汇编语言程序的编写与调试(1)新建一个工程(2)保存文件,设一个文件名(3)找到对应单片机的芯片,这里我们选AT89C51即可接着我们新建一个文本写程序(1)(2)保存文件名,注意文件名的后缀应该为.asm(汇编语言程序的格式)接着把我们的文本导入到工程里面去:(1)(2)点击Add,再Close即可2.汇编语言程序编译及下载(1)这里要设置一个输出.hex文件(2)点击生成工程相应的文件同时可以观察下面的结果:0 Error(s),即可。
iar编写stm8跑马灯STM8是意法半导体(STMicroelectronics)推出的一款8位微控制器,被广泛应用于各种嵌入式系统中。
本文将以STM8为基础,编写一个简单的跑马灯程序。
跑马灯是一种常见的灯光效果,通过控制多个LED灯的亮灭来模拟跑马灯的效果。
通过编写STM8跑马灯程序,我们可以学习到如何使用STM8的GPIO功能以及控制LED 的原理。
我们需要准备一块STM8开发板、若干个LED灯和适配器等硬件设备。
接下来,我们将通过iar集成开发环境来编写STM8跑马灯程序。
1. 初始化引脚:首先,我们需要将LED连接到STM8开发板上的相应引脚。
在STM8中,每个引脚都有一个对应的寄存器用于控制它的状态。
我们需要设置这些寄存器来初始化引脚,并使其工作在输出模式。
2. 编写跑马灯程序:在STM8中,我们可以通过修改引脚寄存器来控制LED的亮灭。
为了实现跑马灯效果,我们可以通过循环遍历每个LED,并依次点亮或熄灭它们。
具体实现的代码如下:```#include <stm8s.h>#define LED_PORT GPIOA#define LED_PIN_1 GPIO_PIN_1#define LED_PIN_2 GPIO_PIN_2#define LED_PIN_3 GPIO_PIN_3#define LED_PIN_4 GPIO_PIN_4void delay(uint32_t n){while(n--);}void main(){GPIO_Init(LED_PORT, LED_PIN_1 | LED_PIN_2 | LED_PIN_3 | LED_PIN_4, GPIO_MODE_OUT_PP_LOW_FAST);while(1){GPIO_WriteHigh(LED_PORT, LED_PIN_1);delay(100000);GPIO_WriteLow(LED_PORT, LED_PIN_1);GPIO_WriteHigh(LED_PORT, LED_PIN_2);delay(100000);GPIO_WriteLow(LED_PORT, LED_PIN_2);GPIO_WriteHigh(LED_PORT, LED_PIN_3);delay(100000);GPIO_WriteLow(LED_PORT, LED_PIN_3);GPIO_WriteHigh(LED_PORT, LED_PIN_4);delay(100000);GPIO_WriteLow(LED_PORT, LED_PIN_4);}}```在这段代码中,我们首先定义了LED连接到的引脚,然后在主函数中初始化这些引脚,并通过循环遍历的方式控制LED的亮灭。
单片机跑马灯程序*******************************************************************;此程序是用单片机的p1 口接八个led 灯作跑马灯试验,八个led 依次亮了又熄灭,形成漂亮;的跑马灯。
本人已经试验成功。
;单片机教程网51hei 原创;该8 路单片机跑马灯程序代码简单,电路也容易搭建,只需把led 接在p1 口上就可以了,希望大家能试验成功顺利的完成跑马灯报告;****************************************** *************************org 0000hajmp start;跳转到程序开始org 0030h;定义起始汇编地址start:mova,#0ffh ;clr c ;mov r2,#08h ;循环八次。
loop: rlc a ;带进位左移。
mov p1,a ;此时led 灯开始有反映了。
call delay ;延时djnz r2,loop ;循环(djnz 条件判断)movr2,#07h ;loop1: rrc a ;带进位右移mov p1,a ;此时led 灯开始有反映了。
call delay ;延时djnz r2,loop1 ;反复循环jmp start ;回到程序的开头delay: mov r3,#20 ;延时子程序d1: mov r4,#20d2: mov r5,#248djnz r5,$djnzr4,d2 单片机论坛51hei/bbs/ 有更多的跑马灯流水灯试验---------3 路单片机跑马灯程序---------------------------------------ORG 0000HLJMPMAINORG 030HMAIN: MOV P1,#0DBH ;化为2 进制为11011011--0 状态时led灯亮ACALL DELay MOV P1,#06DH ;化为2 进制为01101101ACALL DELay;MOV P1,#0B6H ;化为2 进制为10110110ACALL DELayAJMP MAINdelay: movr7,#255d1: mov r6,#255d2: djnz r6,d2djnz r7,d1retendtips:感谢大家的阅读,本文由我司收集整编。
单片机跑马灯实验程序led equ p1 ;可以增强程序的可移植性org 00hajmp head ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;org 0030hhead:mov sp ,#70hmov dptr,#led_on_tabclr amov r2,#0begin:call add_oncall dec_offsjmp begin;;;;;;;;;;;;;;;;;;;;;;;;;;; 按点亮led灯;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;led_on:mov a,r2movc a,@a+dptrmov led,alcall delay_200msret;;;;;;;;;;;;;;;;;;;;;;;;;;;实现小灯逐个点亮的移位逻辑;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;add_on:acall led_oninc r2cjne r2,#9,add_onmov r2,#7ret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;实现小灯逐个熄灭的移位逻辑;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;dec_off:acall led_ondec r2cjne r2,#0,dec_offret;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;led_on_tab: DB 255,254,252,248,240,224,192,128,0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_200ms:mov r5,#20signed_200ms_:acall delay_10msdjnz r5,signed_200ms_ret;mytime.s;;;;;;;;;;;;;;;; 非中断精确1MS定时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_1ms:MOV R7 ,#249signed: ;循环部分4机器周期nopnopdjnz R7 ,signedret ;返回指令2机器周期;2+249*4+2=1000us 可以精确定时1MS,假设外部晶振是12M;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 非中断精确10MS定时程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; delay_10ms:mov r6,#9 ;2个机器周期用2usdelay_10ms_sined: ;9次循环共用9(1ms+4us)=9036usacall delay_1msdjnz r6,delay_10ms_sinedMOV r6 ,#240 ;2个机器中期用2ussigned_10ms : ;循环部分4机器周期共240次nopnopdjnz r6 ,signed_10msret ;返回指令要2us;2us+9036us+240*4us+2us = 10ms 即可精确定时10ms ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 非中断精确定时1s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;delay_1s:mov r5,#99 ;两个机器周期2usdelay_1s_signed: ;循环指令周期为4us,加上延时10ms;(10ms+4us)*99 = 990.396msacall delay_10msdjnz r5,delay_1s_signedmov r5 ,#9 ;两个机器周期2ussigned_1s: ;循环指令周期为4us,加上延时1ms;(1ms+4us)*9 = 9ms+36usacall delay_1msdjnz r5 ,signed_1smov r5 ,# 140 ;机器周期2ussigned_1s_: ;一次循环4us共有140次。
51单片机P1口跑马灯的汇编语言编程和protues仿真;跑马灯程序1;用软件技术器实现1秒间隔LED循环点亮;三层循环计数实现1秒延时,250*250*8=0.5秒;由于软件延时需要计算代码执行的时间,所以近似1秒ORG 0000HLJMP MAINORG 0030HMAIN: MOV P1,#0FFHMOV A,#0FEHLOOP: MOV P1,ALCALL TIMEERRL ASJMP LOOPTIMEER: MOV R5,#08HLOOP1: MOV R6,#0FAHLOOP2: MOV R7,#0FAHLOOP3: DJNZ R7,LOOP3DJNZ R6,LOOP2DJNZ R5,LOOP1RETEND;跑马灯程序2;定时/计数器1控制1秒间隔LED循环点亮ORG 0000HLJMP MAINORG 001BHLJMP T1_INTORG 0100HMAIN: MOV R0,#20 ;软计数器MOV TMOD,#10H ;定时器1方式1MOV P1,#0FFH ;熄灭所有LEDMOV A,#0FEH ;点亮第一个LEDMOV TH1,#3CHMOV TL1,#0B0H ;赋初值SETB ET1SETB EA ;开中断SETB TR1 ;启动定时器SJMP $ ;等待中断T1_INT: MOV TH1,#3CHMOV TL1,#0B0H ;赋初值DEC R0 ;软计数CJNE R0,#00H,LPRL A ;灯移位MOV P1,A ;灯改变MOV R0,#20 ;软计数器初值LP: RETI;跑马灯程序3;定时/计数器1控制1秒间隔LED循环点亮;外部中断1控制按键按下跑马灯启动或者停止ORG 0000HLJMP MAINORG 0013HLJMP INT1_INT ;外部中断服务程序,按键触发ORG 001BHLJMP T1_INT ;定时器中断,1秒中断一次ORG 0100HMAIN: MOV R0,#20 ;软计数器计数次数MOV TMOD,#10H ;定时器1方式1MOV P1,#0FFH ;熄灭所有LEDMOV A,#0FEH ;点亮第一个LEDMOV TH1,#3CHMOV TL1,#0B0H ;定时器赋初值SETB I T1 ;外中断1采用下降沿触发SETB E X1 ;允许外部中断1SETB ET1 ;允许定时器中断SETB EA ;开中断SETB TR1 ;启动定时器1SJMP $ ;等待中断T1_INT: MOV TH1,#3CHMOV TL1,#0B0H ;定时器赋初值DEC R0 ;软计数CJNE R0,#00H,LP ;判断计数次数是否达到,是则跳转RL A ;灯移位MOV P1,A ;灯改变MOV R0,#20 ;软计数器初值LP: RETIINT1_INT: MOV A,#0FFH ;按键按下,LED熄灭MOV P1,A ;灯改变CPL TR1 ;定时器改变开关状态MOV A,#0FEH ;点亮第一个LEDRETI ;中断返回Protues仿真电路图欢迎访问艾依河里的鱼的博客。
实验一跑马灯-亮灯左移右移循环
黄天佑 155
一、实验目的
1、进一步熟悉keil C仿真软件及单片机实验板的使用。
2、了解并熟悉单片机I/O口和LED灯的电路结构,学会构建简单的流水灯电路。
3、掌握应用KEIL软件编辑、编译源汇编程序的操作方法。
4、了解单片机汇编语言程序的设计和调试方法。
二、实验原理
1、实验板硬件电路图
2、单片机流水灯程序设计
(1)流水灯程序设计思路及程序流程。
实现流水灯的方法有很多,这里介绍一种。
(2)产生流水灯效果程序(逐条程序加注释)
start:mov R0,#8 ; 设置左移8次
mov A,#0FEH; 存入开始亮灯的位置
LOOP: mov P0,A; 传送P0并输出
ACALL DELAY; 调用延时程序
RL A; 左移1位
DJNZ R0,LOOP; 判断移送次数
mov R1,#8; 设置右移8次
LOOP1:RR A; 右移1位
mov P0,A; 传送到P0口并输出
ACALL DELAY; 调用延时程序
DJNZ R1,LOOP1; 判断右移次数
JMP start; 重新设定显示
DELAY: mov R5,#10; 延时子程序
D1: mov R6,#100;
D2: mov R7,#100;
DJNZ R7,$;
DJNZ R6,D2;
DJNZ R5,D1;
RET ; 子程序返回
END ; 程序结束
三、实验步骤及调试过程
1、汇编语言程序的编写与调试
(1)新建一个工程
(2)保存文件,设一个文件名
(3)找到对应单片机的芯片,这里我们选AT89C51即可
接着我们新建一个文本写程序
(1)
(2)保存文件名,注意文件名的后缀应该为.asm(汇编语言程序的格式)
接着把我们的文本导
入到工程里面去:
(1)
(2)点击Add,再Close即可
2.汇编语言程序编译及下载
(1)这里要设置一个输出.hex文件
(2)点击生成工程相应的文件
同时可以观察下面的结果:
0 Error(s),即可。
3.程序下载考入单片机
(1)打开STC-ISP软件,选择对应的单片机型号,
(2)点击打开程序,选择写好的.hex文件,
(3)选择对应的端口COM3,再点击“Download下载”,同时按下单片机开关,即可。