网上的这种程序比较多,也不是很难,自己学学可以编的。
下面是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
蜂鸣器一直响很容易实现,无源蜂鸣器给电平就可以控制发声了,程序如下:
FMQ EQU P32ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
CLR FMQ
LOOP:
MOV P1,A
RL A
LCALL DELAY
SJMP LOOP
DELAY:
MOV R2,#200
DLY:
MOV R3,#250
DJNZ R3,$
DJNZ R2,DLY
RET
END
#include "reg52h"
#include "intrinsh"
int INTcount,flag;
sbit P1^1=CLK;
sbit P1^2=DAT;
void main()
{
EA=1;
ET0=1;
TR0=1;
DAT=1;
while(1)
{
CLK=0;
if(flag/7==0)DAT=1;
else DAT=0;
}
}
void timer() interrupt 1
{
TH0=(65536-50000)/256;
TH0=(65536-50000)%256;
INTcount;
if(INTcount==20){CLK=1;INTcount=0;};
flag++;
}
74HC164就是个移位寄存器,假设你使用的单片机是12M晶振,使用定时器1,并且LED是高电平点亮。那么程序如上,很简单,就是设置两个标志位再使用定时器中断,你每隔一秒发送一个数据给74HC164就可以了。
开关,接在 P27 与地之间。
#include <AT89X51H> //预处理命令
void w(unsigned char k)
{
unsigned int a; //定义变量a 为int 类型
if (k) {
while(P2_7); //没有按就循环,等待按下
for (a = 0; a < 600; a++); //延时消抖
while(P2_7); //没有按就循环
}
else while(!P2_7); //按下就循环,等待松开
}
void main(void) //主函数名
{
while(1) {
w(1); P1_0 = 0; w(0); P1_0 = 1;
w(1); P1_1 = 0; w(0); P1_1 = 1;
w(1); P1_2 = 0; w(0); P1_2 = 1;
w(1); P1_3 = 0; w(0); P1_3 = 1;
w(1); P1_4 = 0; w(0); P1_4 = 1;
w(1); P1_5 = 0; w(0); P1_5 = 1;
w(1); P1_6 = 0; w(0); P1_6 = 1;
w(1); P1_7 = 0; w(0); P1_7 = 1;
}
}
这个非常简单啊
#include <reg51h>
unsigned int code dat[16]={0xfffe,0xfffd,0xfffb,0xfff7,0xffef,0xffdf,0xffbf,0xff7f,0xfeff,0xfdff,0xfbff,0xf7ff,0xefff,0xdfff,0xbfff,0x7fff};//要什么花样取决于这里的数据,这里是单个流水灯
//
void delay(unsigned int ms)
{
unsigned char j;
for(;ms>0;ms--)
{
for(j=0;j<150;j++);
}
}
//
void main(void)
{
unsigned char i;
while(1)
{
for(i=0;i<16;i++)
{
P1=dat[i];
P2=dat[i]>>8;
delay(300);
}
}
}//简单吧
//AT89C52 的引脚 和STC89C51的 引脚一样的,不一样的是RAM大小
;其实很简单,都不用判断键值,有键按下暂停2S程序如下:
ORG 0000H
LJMP STA
ORG 000BH
LJMP T0ISR
ORG 0030H
STA:
MOV TMOD,#01H
MOV TH0,#3CH
MOV TL0,#0B0H
SETB ET0
SETB EA
MOV 30,#0FEH
MOV R2,#0
CLR 00H
LOOP:
MOV P1,#0F0H
MOV A,P1
CJNE A,#0F0H,LOOP1
SJMP LOOP
LOOP1:
LCALL DELAY
MOV A,P1
CJNE A,#0F0H,LOOP2
SJMP LOOP
LOOP2:
SETB 00H
SJMP LOOP
T0ISR:
CLR TR0
MOV TH0,#3CH
MOV TL0,0B0H
SETB TR0
JNB 00H,T0ISR1
INC R2
MOV A,R2
CJNE A,#40,T0ISRE
MOV R2,#0
CLR 00H
SJMP T0ISRE
T0ISR1:
MOV A,30H
RL A
MOV 30H,A
MOV P0,A
T0ISRE:
RETI
DELAY:
MOV R0,#20
DELAY1:
MOV R1,#250
DJNZ R1,$
DJNZ R0,DELAY1
RET
END
很酷的流水灯
#include <reg51h>
typedef unsigned char uchar;
#define Ton 40
#define LED P0
sbit leds=P1^4;
sbit LED0 = P0^0;
sbit LED1 = P0^1;
sbit LED2 = P0^2;
sbit LED3 = P0^3;
sbit LED4 = P0^4;
sbit LED5 = P0^5;
sbit LED6 = P0^6;
sbit LED7 = P0^7;
unsigned char Maikuan=0;
static unsigned char ledon[8] = {0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
uchar Occupy_led; //占空比越大,灯越亮
bit light;
uchar m;
void Inittime()
{
TMOD = 0x02; //定时器0,工作方式2,自动重装
TH0 = 256-Ton;
TL0 = 256-Ton;
ET0 = 1;
EA = 1;
TR0 = 1;
}
//定时器0中断
void time0() interrupt 1 using 0
{
Maikuan++;
}
void main()
{
unsigned char i = 0,j = 0; //初始化i,j
leds=0;
Inittime();
while (1)
{
//第1,3,5,7个灯半亮,其余的全亮。
for(i=254; i>0; i--)
{
while ( Maikuan!=20)
{
LED = 0x00;
}
while ( Maikuan!=200)
{
LED = 0x55;
}
Maikuan = 0;
}
//最难的:8个灯从第一个开始依次渐亮,直到最后一个。再从最后一个起渐暗,直到第一个。如此循环往复。
for(j = 0;j<=7;j++)
{
i = 0;
while(i!=255) // 由暗变亮
{
if( Maikuan == 0) // 点亮
{
LED = ledon[j];
}
if(Maikuan == i) // 熄灭
{
LED = 0xff;
}
if( Maikuan== 255)
{
i++;
}
}
}
for(j=7;j>=0;j--)
{
i = 0;
while(i!=255) // 由亮变暗
{
if(Maikuan == 0) // 熄灭
{
LED = 0xff;
}
if( Maikuan == i) // 点亮
{
LED = ledon[j];
}
if( Maikuan == 255)
{
i++;
}
}
}
//所有的灯逐渐从暗到全亮,再由全亮到暗。
for (m=254; m>0; m--)
{
while (Maikuan!=Occupy_led)
{
LED = 0x00;
}
while (Maikuan!=127)
{
LED = 0xff;
}
Maikuan = 0;
if (light)
{
Occupy_led++;
}
else
{
Occupy_led--;
}
if (Occupy_led==128)
{
Occupy_led = 127;
light = !light;
}
if (Occupy_led>128)
{
Occupy_led = 0;
light = !light;
}
}
}
}
以上就是关于用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写全部的内容,包括:用汇编程序实现3个数码管循环闪亮(显示为8),相当于3个LED流水灯,用89c51怎么写、求AT89C51单片机无源蜂鸣器加流水灯程序、51单片机:at89c51接74hc164写流水灯等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)