‘壹’ 单片机基础实验
1、
Loop:
mov a, #01h
mov r2, #8
Output:
mov P1, a
rl a
call Delay
djnz r2, Output
ljmp Loop
Delay:
mov r6, #0
mov r7, #0
DelayLoop:
djnz r6, DelayLoop
djnz r7, DelayLoop
ret
end
#include <reg51.h>
void delay()
{
unsigned int i;
for (i=0; i<20000; i++) {}
}
void main()
{
unsigned char index;
unsigned char LED;
while (1) {
LED = 1;
for (index=0; index < 8; index++) {
P1 = LED;
LED <<= 1;
delay();
}
}
}
2、
CS273 equ 8000h
mov dptr, #CS273
mov a,P1
movx @dptr, a
end
‘贰’ 急求:单片机实验
:
ORG 0030H
MOV 30H, #34H
MOV 31H, #56H
MOV 32H, #23H
MOV 33H, #90H
MOV 34H, #32H
MOV 35H, #68H
MOV 36H, #09H
MOV 37H, #75H
CALL SORT
SJMP $
;-----------------------------------------------------
SORT: ;最简短、高效的排序程序.
MOV B, #7 ;第一轮排序时,比较7次.
S1: MOV R0, #30H ;数据区的起始地址.
MOV R7, B
CLR PSW.5 ;清除"交换"标志位.
S2: MOV A, @R0 ;取前一个数.
INC R0
CLR C
SUBB A, @R0 ;减后一个数,前<后时,Cy=1
S3: JC S4 ;有借位时,不用交换,转移.
MOV A, @R0 ;取后一个数,准备交换.
DEC R0
XCH A, @R0 ;交换到前一个.
INC R0
XCH A, @R0 ;交换到后一个.
SETB PSW.5 ;设定"交换"标志位.
S4: DJNZ R7, S2 ;继续本轮比较.
JNB PSW.5, ENDS ;如本轮没有进行过交换,可提前结束.
DJNZ B, S1 ;下一轮,比较次数少一次.
ENDS:
RET
;-----------------------------------------------------
END
‘叁’ 单片机实验——数据传送实验
ORG 0000H
LJMP MAIN
ORG 0060H
MAIN:
MOV R0 ,#4800H
MOV R1 ,#5800H
LOOP:
MOVX A ,@R0
MOV R1 ,A
INC R0
INC R1
DJNZ #10H,LOOP
END
‘肆’ 单片机实验
你只要知道怎么控制IO就可以了。不知道你的LED是采用什么方式接入P1口的,如果是LED正极经过限流电阻接正电源,负极接P1口的话,那么就是当P1口某个引脚为低电平时,LED点亮。
这样的话,你这个1357,2468不知道是先亮1,然后1灭了换3,在3灭换5亮。。还是1357同时亮,然后2468同时亮,不过我告诉你思路你自己就编程了
先使P1=0XFF这样所有LED均熄灭。
然后因为1357实际对应的P1口IO是P1.0,P1.2,P1.4,P1.6, 那么如果需要他们点亮,因为上面我说的是P1的某个IO为低电平,LED点亮,那么给P1口我上面说的这几个IO变为低电平就可以了。
即二进制的P1.7->P1.0(高->低)10101010.换算为16进制就是0XAA(如果是要1亮,然后变成1灭3亮。。。。这样的话只需要P1.0先为低电平,即二进制的11111110 16进制的0xFE然后P1.0变为高电平P1.2为低电平,即二进制的11111011,16进制的0xFB,依次算出16进制对应的数,当7单独亮时就是01111111,16进制的0x7F,2,4,6,8一样,我就不在说了)
这样让P1口=0xAA就可以实现你所说的1,3,5,7亮了
同理,2,4,6,8就是P1.1,P1.3,P1.5,P1.7换算为二进制就是01010101即16进制的0x55.
让P1口=0x55就可以了
另外因为单片机执行程序的速度很快,所以你如果是
P1=0XAA
P1=0X55这样的话可以说你看来根本就是8个LED同时亮着。所以需要在每句下面加个延时函数使每个亮0.几秒钟,使眼睛可以看到他们的变化
所以要做个延时函数
void delay(unsigned char i)
{
unsigned char j,k;
for (j=i,j>0,j--)
{
for(k=255,k>0,k--);
}
}
调用时只需要给delay函数赋值就可以了
比如
P1=0XAA;
delay(200);
P1=0X55;
delay(200);
其他的就你自己写了。。
我靠。。刚看你写的是要汇编的。。
那么上面P1=0XAA这些就要改成
MOV P1,#AAH
MOV P1,#55H
延时就需要这样了
DELAY:
MOV R0,#200
DELAY1:
MOV R1,#255
DELAY:
DJNZ R1,DELAY
DJNZ R0,DELAY1
RET
这样你上面就是
MAIN:
MOV P1,#AAH
CALL DELAY
MOV P1,#55H
CALL DELAY
SJMP MAIN
‘伍’ 单片机实验
1、
MOV R0,#20H
MOVX A,@R0
MOV 20H,A
2、
MOV DPTR,#2000H
MOVX A,@DPTR
MOV 20H,A
3、
MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV 20H,A
4、
MOV DPTR,#2000H
CLR A
MOVC A,@A+DPTR
MOV B,A
MUL AB
MOV R7,A
MOV R6,B;(溢出部分送R6)
5、高八位?低八位?什么意思?
地址高八位DPH,地址第八位DPL
MOV DPH,#20H
MOV DPL,#00H
‘陆’ 51单片机实验,急
#include<reg52.h>
sbit Start = P3^0; //引脚声明
sbit Pause = P3^1;
sbit Clear = P3^2;
unsigned char code Ledchar[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//共阳极 0 - 9
unsigned char Ledbuf[8] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};//显示缓冲区
unsigned char hour = 0;
unsigned char min = 0;
unsigned int sec = 0;
unsigned char Bms = 0;
unsigned char XH = 12; //学号 后两位 , 你可以更改
unsigned char num = 18; //计数
char cnt = 0; //数码管点亮位置
unsigned char index = 0;
void ConfigTimer0()
{
TMOD = 0x01;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时重载值
ET0 = 1; //打开定时器0 中断允许
TR0 = 1; //启动定时器0
EA = 1; //打开总中断
}
void main()
{
ConfigTimer0();
while(1)
{
Ledbuf[0] = 0xFF; //转换成BCD码 放入显示缓冲区
Ledbuf[1] = Ledchar[num%10];
Ledbuf[2] = Ledchar[num/10%10];; // "-"
Ledbuf[3] = Ledchar[num/100];
Ledbuf[4] = 0xBF; // "-"
Ledbuf[5] = Ledchar[XH%10]; //学号
Ledbuf[6] = Ledchar[XH/10];
Ledbuf[7] = 0xFF;
}
}
void StartScan()
{
static unsigned char t = 0;
static bit Lock = 0;
if(Start == 1)
{
t = 0;
Lock = 0;
}
else if(Lock == 0)
{
t++;
if(t >= 10)
{
if(index == 0)
{
num += 2;
if(num >= 22)
{
num = 22;
}
}
else if(index == 2)
{
cnt++;
if(cnt >= 8)
{
cnt = 0;
}
}
Lock = 1;
}
}
}
void PauseScan()
{
static unsigned char t = 0;
static bit Lock = 0;
if(Pause == 1)
{
t = 0;
Lock = 0;
}
else if(Lock == 0)
{
t++;
if(t >= 10)
{
if(index == 0)
{
num -= 2;
if(num <= 14)
{
num = 14;
}
}
else if(index == 2)
{
cnt--;
if(cnt <= 0)
{
cnt = 7;
}
}
Lock = 1;
}
}
}
void ClearScan()
{
static unsigned char t = 0;
static bit Lock = 0;
if(Clear == 1)
{
t = 0;
Lock = 0;
}
else if(Lock == 0)
{
t++;
if(t >= 10)
{
index++;
if(index >= 3)
{
index = 0;
}
Lock = 1;
}
}
}
void KeyScan()
{
ClearScan();
PauseScan();
StartScan();
}
void LedScan()
{
static unsigned char i = 0;
P0 = 0xFF;
if(index == 0)
{
switch(i)
{
case 0: P2 = 0x01; P0 = Ledbuf[7]; i++; break;
case 1: P2 = 0x02; P0 = Ledbuf[6]; i++; break;
case 2: P2 = 0x04; P0 = Ledbuf[5]; i++; break;
case 3: P2 = 0x08; P0 = Ledbuf[4]; i++; break;
case 4: P2 = 0x10; P0 = Ledbuf[3]; i++; break;
case 5: P2 = 0x20; P0 = Ledbuf[2]; i++; break;
case 6: P2 = 0x40; P0 = Ledbuf[1]; i++; break;
case 7: P2 = 0x80; P0 = Ledbuf[0]; i=0; break;
default : break;
}
}
else
{
switch(cnt)
{
case 0: P2 = 0x01; P0 = Ledbuf[7]; break;
case 1: P2 = 0x02; P0 = Ledbuf[6]; break;
case 2: P2 = 0x04; P0 = Ledbuf[5]; break;
case 3: P2 = 0x08; P0 = Ledbuf[4]; break;
case 4: P2 = 0x10; P0 = Ledbuf[3]; break;
case 5: P2 = 0x20; P0 = Ledbuf[2]; break;
case 6: P2 = 0x40; P0 = Ledbuf[1]; break;
case 7: P2 = 0x80; P0 = Ledbuf[0]; break;
default : break;
}
}
}
void interruptTimer0() interrupt 1
{
static unsigned int tt = 0;
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时重载值
KeyScan();
LedScan();
if(index == 1)
{
tt++;
if(tt >= 500)
{
tt = 0;
cnt++;
if(cnt >= 8)
{
cnt = 0;
}
}
}
}
用的共阳极数码管,, 满足要求, 最下面的按键按一下 进行 数码管切换点亮, 再按一下, 可以通过上面两个按键选择显示那个数码管
再按最下面的 就会回到刚开始显示页面,就是学号什么的,全部显示, 此时 上面两个按键 就是对计数值进行加减2 ,