单片机实验程序
SETB TR1
;启动定时器
MOV P1, #00H
;置P1口初值
AA:
JBC TF0, TT0
;判定时器0溢出标志
BB:
JBC TF1, TT1
TT0: 值。
SJMP AA CPL P1.0 ; 定时溢出时TH0=TH1=00H,所以不用再预置初
SJMP BB
TT1:
CPL P1.1
SJMP AA
SJMP $
;数据起始地址 ;排序数据个数: 10个数,需要比较9次。
;取出一个数据 ;与第二个数进行比较 ;R0中的数小于R1中的数则跳转 ;R0中的数大于R1中的数, 交换数据
ORG 0000H LJMP MAIN
MAIN: LP1:
; LP2:
LP3:
ORG 0100H MOV R7, #09H CLR F0 MOV R0, #30H MOV R1, #31H MOV A, R7 MOV R6, A ;MOV A, R0 MOV R1, A ;INC R1 MOV A, @R0 CLR C SUBB A, @R1 JC LP3 MOV A, @R0 XCH A, @R1 MOV @R0, A SETB F0 INC R0 INC R1 DJNZ R6, LP2 JNB F0,NEXTT
;排序数据个数: 10个数 ;数据起始地址
;取出一个数据 ;与第二个数进行比较 ;R0中的数小于R1中的数则跳转 ;R0中的数大于R1中的数, 交换数据
数据输入输出I/O实验
1、 功能描述: 数字量由 P1口输入, P2口输出
数据输入输出I/O实验
1、 功能描述: 数字量由 P1口输入, P2口输出
;取表格首地址
MOV A, R7
;要计算的值
MOVC A, @A+DPTR ;查表
MOV R6, A
;结果保存
MOV P1, A
;在P1口接发光管显示
SJMP MAIN
;平方表
DB 00H, 01H, 04H, 09H, 16H
DB 25H, 36H, 49H, 64H, 81H
排序实验
实验内容: 在单片机片内 RAM 的 30H~39H 写入 10 个数, 编写实验程序,将这 10 个数按照 由小到大 的顺序排列,仍写入 RAM 的 30H~39H 单元中。
i = _crol_(i, 2);
for(x=0; x<0xFFFF; x++);
delay();
}
}
P1 = 0x00;
void int0_isr() interrupt 0
}
//INT0中断
void main()
{ unsigned char j;
{
P1 = 0x00;
for(j=0; j<4; j++)
ORG 0000H LJMP START
ORG 0100H
START: ORL P1, #0FFH
;P1口为输入
MOV A, P1
;读P1口的值
MOV P2, A SJMP STA
;输出到P2口
2、P1 口是 8 位准双向口,每一位均可独立定义为输入输出。编写实验程序, 将P1 口的低 4 位定义为输出,高 4 位定义为输入,数字量从 P1 口的高 4 位 输入,从 P1 口的低 4 位输出控制 发光二极管的亮灭。
END
/* 文件名: Timer.Asm
*/ void timer0_isr() interrupt 1
/* 功能描述: 使用定时器0及定时器1进行定时, {
*//*
在P1.0及P1.1上输出方波信号。
TH0 = 0x0F8;
*/ 中断法:
#include "SST89x5x4.h"
TL0 = 0x00;
ORG 0000H
LJMP START
START: MOV
ORG 0040H TMOD, #11H MOV TH0, #00H
;设置定时器工作方式为方式1 ;装入定时器0的计数初值
MOV TL0, #00H MOV TH1, #00H
;装入定时器1的计数初值
MOV TL1, #00H
SETB TR0
*/
/*
在P1.0及P1.1上输出方波信号。
*/
/**************************************/
#include "SST89x5x4.h" sbit Wave1 = P1^0; sbit Wave2 = P1^1;
//用查询法
while(1) { if(TF0 == 1) //定时器0溢出标志
ORG 0000H LJMP START
ORG 0100H
START:
ORL P1, #0F0H
;P1口高 4 位定义为输入
LOP:
MOV A, P1
;读P1口的值
SWAP A
; A的 (P1口)高低4位值交换
ORL A,#0F0H
; A(P1口)的高4位置1,高低4位不变
***跑马灯程序如下:***
TL1 = 0x00;
TR0 = 1;
//启动定时器0
{ TH1 = 0x0F8; TL1 = 0x00; Wave2 = ~Wave2;
TR1 = 1;
//启动定时器1
TF1 = 0;
}
}
}
功能描述: 使用定时器0及定时器1进行定时, */
/*
在P1.0及P1.1上输出方波信号。
参考例程如下:(查询法)
int n=2;
b=a << ( 8-n );
c=a >> n ;
a=c|b;
}
ORG 0000H LJMP START
ORG 0003H LJMP EINT0
ORG 0013H LJMP EINT1
START:
ORG 0040H MOV P1, #00H SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB EA SJMP $
;设置定时器工作方式为方式1 ;装入定时器0的计数初值
;装入定时器1的计数初值
;启动定时器
;置P1口初值
2、文件名: Count.C
*/
/* 功能描述: 将定时器/计数器1设定为计数器,计数器 */
/*
容量为10,每计数到10在P1.0上将取反一次。*/
/*****************************************/
;外部中断1中断服务程序
EINT1: MOV A, #03H MOV R7, #10H
ILP1: MOV P1, A RL A RL A ACALL DELAY DJNZ R7, ILP1 RETI
;延时子程序
DELAY: MOV R6, #0FFH DLP1: MOV R5, #0FFH DLP2: DJNZ R5, DLP2
#include <reg51.h>
void Delay() {
unsigned int i,j; for(i = 0; i < 1000; i++)
for(j = 0; j < 50; j++) ;
}
main() {
}
P1 = 1;
while(1)
{
P1 <<= 1;
//*P1=P1 << 1;
if(P1 == 0)P1 = 1;
Delay();
}
/* 文件名: Int2.Asm
*/
/* 功能描述: 手动控制外部中断INT0,INT1. INT0中断产生则
扩展P1口 */
/* 使LED闪烁4次, INT1中断产生则使LED流水显示4周.
*#/include "SST89x5x4.h"
void int2_isr() interrupt 2 //INT1中断
A, R7 A, #0F0H A A, @A+DPTR R6, A
;取待转换数的高 4 位 ;高 4 位与低 4 位交换 ;查表 ;高 4 位转换结果送 R2
ASCTAB:
SJMP
DB DB DB
MAIN
;设置断点观察结果
;ASCII 码表
30H, 31H, 32H, 33H, 34H
35H, 36H, 37H, 38H, 39H
/#*in*c*lu*d*e *"I*nt*ri*n*s.*h"**********{*fu*on*rs(*ijg=*n0e*;d*j<c*h1*a6r;*ij*=+0*+x*)0*3,*j*; *******
*v*oi*d *de*l*ay*(v/oid)
{ P1 = i;
//使LED流水显示
{ unsigned int x;
TR0 = 1;
//启动定时器0
TR1 = 1;
//启动定时器1
ET0=1;//开中断
ET1=1;
EA=1;
while(1);
}
//TF0 = 0; }
void timer1_isr() interrupt 3 {
TH1 = 0x0F8;
TL1 = 0x00;
Wave2 = ~Wave2;
//TF1 = 0; }
} }
功能描述: 使用定时器0及定时器1进行定时, 在P1.0及P1.1上输出方波信号。 (中断法:)
START: MOV TT0:
ORG 0000H LJMP START ORG 000BH LJMP TT0 ORG 001BH LJMP TT1 ORG 0040H TMOD, #11H MOV TH0, #00H MOV TL0, #00H MOV TH1, #00H MOV TL1, #00H SETB ET0 SETB ET1 SETB EA SETB TR0 SETB TR1 MOV P1, #00H SJMP $ CPL P1.0 RETI