我刚学单片机,想让LED上的第一个小灯间隔200MS闪烁,我编的程序是这样的

我刚学单片机,想让LED上的第一个小灯间隔200MS闪烁,我编的程序是这样的,第1张

// 定义 LED 的数码管编号

int led = 1;

// 定义 LED 闪烁的间隔时间,单位为毫秒

int interval = 200;

void setup() {

// 初始化数字输出为输出模式

pinMode(led, OUTPUT);

}

void loop() {

// 让 LED 亮起来

digitalWrite(led, HIGH);

// 延迟一段时间

delay(interval);

// 让 LED 熄灭

digitalWrite(led, LOW);

// 延迟一段时间

delay(interval);

}

开关控制指示灯显示

MY8255_A EQU 0A860H;8255A口地址

MY8255_B EQU 0A861H;8255B口地址

MY8255_C EQU 0A862H;8255C口地址

MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT

ASSUME CS:CODE

START: MOV DX,MY8255_MODE

MOV AL,82H

OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B

IN AL,DX ;读8255 B口内容

MOV DX,MY8255_A

OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容

CALL BREAK ;调用程序BREAK

JMP A1;跳转到A1

BREAK PROC NEAR ;BREAK子程序

MOV AH,1

INT 16H

JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符

MOV AX,4C00H

INT 21H ;返回DOS 

RETURN:RET

BREAK ENDP

CODE ENDS 

END START

;流水灯显示

MY8255_A EQU 0b860H;8255A口地址

MY8255_B EQU 0b861H;8255B口地址

MY8255_C EQU 0b862H;8255C口地址

MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT

LA DB ;留出1个字节

LB DB ;留出1个字节

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA

MOV DS,AX

MOV DX,MY8255_MODE

MOV AL,80H

OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。

MOV DX,MY8255_A

MOV AL,7FH

OUT DX,AL ;将7FH送入A口

MOV LA,AL ;将7FH送入LA存储单元

MOV DX,MY8255_B

MOV AL,0FEH

OUT DX,AL ;将FEH送入B口

MOV LB,AL ;将FEH送入LB存储单元

CALL DALLY

A1: MOV AL,LA

ROR AL,1 ;LA内容循环右移1次

MOV LA,AL

MOV DX,MY8255_A

OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮

MOV AL,LB

ROL AL,1 ;LB内容循环左移1次

MOV LB,AL

MOV DX,MY8255_B

OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮

CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个

CALL BREAK ;调用BREAK子程序,看是否有键按下

JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序

D1: MOV AX,0FFFFH

D2: DEC AX

JNZ D2

LOOP D1

RET

BREAK PROC NEAR ;是否有键按下

MOV AH,06H

MOV DL,0FFH

INT 21H

JE RETURN ;若无,则转RETURN

MOV AX,4C00H

INT 21H ;返回DOS

RETURN:RET

BREAK ENDP

CODE ENDS

END START

#include<reg51h>

unsigned char code table[]={

0xc0,0xf9,0xa4,0xb0,

0x99,0x92,0x82,0xf8,

0x80,0x90};// 数码管段选

unsigned char aa,second;

sbit LED=P1^0;// 小灯

void init(); //初始化

void keypress(); //按键识别

void delay(unsigned int z);//延时

void main()

{

init();

LED = 1;

while(1)

{

if(aa==20)

{

aa=0;

second++;

LED=~LED;

if(second==21)

{

second=0;

}

}

keypress();

P0=table[second%10];

P2=table[second/10];

}

}

void init()

{

TMOD=0x01;//定时器T0的方式1

TH0=(65536-50000)/256; //高8位

TL0=(65536-50000)%256; //低8位

EA=1; //中断总允许打开

ET0=1; //定时器T0允许打开

TR0=1; //启动定时器T0

aa=0;

second=0;

}

void delay(unsigned int z)

{

unsigned int x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void timer0() interrupt 1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

aa++;

}

网上的这种程序比较多,也不是很难,自己学学可以编的。

下面是1~8数字循环显示

;仿照例77

ORG 0000H

LJMP MAIN

ORG 0030H

MAIN:

;CLR P25

;CLR P27

MOV A,#03H            ;控制字

MOV DPTR,#6100H;8155的命令状态口地址

MOVX @DPTR,A

DISPLY:MOV R0,#8

MOV R3,#0FEH

MOV A,R3                       ;字位

LD:MOV DPTR,#6102H;B口地址

MOVX @DPTR,A          ;B口

MOV DPTR,#DTAB

MOV A,R0

MOVC A,@A+DPTR    ;查表

MOV DPTR,#6101H

MOVX @DPTR,A        ;A口

ACALL DELAY           ;延时

MOV A,R3

RL A

MOV R3,A                  ; 下一位

DJNZ R0,LD              ;下一位循环

SJMP DISPLY            ;显示了一遍循环

RET

DTAB:DB 6FH,7FH,07H,7DH,6DH

DB 66H,4FH,5BH,06H,3FH                ;数字9~0

DELAY: MOV R7,#250

DELAY1: MOV R6,#250

DELAY2:MOV R5,#4

DELAY3: DJNZ R5,DELAY3

DJNZ R6,DELAY2

DJNZ R7,DELAY1

RET                                                  ;延时大约2u4255255=05s

END

以上就是关于我刚学单片机,想让LED上的第一个小灯间隔200MS闪烁,我编的程序是这样的全部的内容,包括:我刚学单片机,想让LED上的第一个小灯间隔200MS闪烁,我编的程序是这样的、汇编语言 编写 程序 LED 灯显示、AT89C51,编写C语言程序,实现LED灯间隔1s亮一次 ,显示器开始计时从00~20等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/10131565.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-05
下一篇2023-05-05

发表评论

登录后才能评论

评论列表(0条)

    保存