实验二
实验要求:
P3.2、P3.3、P3.4、P3.5作输入口接四个按钮开关SW1、SW2、SW3、SW4;P1.2、P1.3 、P1.2,P1.3作输出口接发光二极管,编写程序读取开关状态,将此状态在发光二极管上显示出来。编程时应注意P3.2、P3.3、P3.4、P3.5作为输入口时应先置1,才能正确读入值。
代码:
ORG 0000H ;复位开始
LCALL MAIN;转去主程序执行
ORG 0030H;主程序从0030H开始
MAIN:
MOV A, #0FFH ;预设初始化的值是为1111 1111
LJMP LOOP ;不断循环
LOOP:
MOV P3,A ; 初始化 p3作为输入口应为1
MOV P1,P3 ;开关按下,p3口就得到了当前的值,并赋值给p1,点亮相应的LED
RET ;返回
END
实验三:
实验要求:
用单次脉冲申请中断,在中断处理程序中对信号进行反转输出
代码:
ORG 0000H;
LJMP MAIN;
ORG 0003H ; INT0中断的入口程序地址
LJMP INT; 中断程序的标号
ORG 0400;
MAIN:
SETB P1.0; 置位p1.0,
MOV TCON,#01H; 选择外部中断0(INT0)触发方式控制位。
MOV IE,#81H; 开所有中断且中断源为INT0
LJMP $; 一直跳转到当前地址,也就是循环
ORG 0100; INT的起始地址
INT: CLR EX0; 关INT0中断
PUSH ACC; 然后保护现场
PUSH PSW;
CPL P1.0; 将p1.0取反
POP PSW; 恢复现场
POP ACC;
SETB EX0; 开中断
RETI; 中断返回
END
实验四
实验展示:
单片机内部定时器中断方式计时每隔一秒钟输出状态反转一次
X= 2M -(t/12*T osc)t的值是50ms, x值为15536就是3CB0。
代码:
ORG 0000H;
LJMP MAIN;
ORG 000BH;
LJMP INT;
MAIN:
MOV TMOD,#01H;选择定时器0 工作方式一
MOV TL0,#0B0H;设置时间常数3CB0
MOV TH0,#03CH;
SETB P1.0; 设置p1.0的初始状态
MOV R0,#014H;设置秒计数值 20. 20*50ms=1s
MOV IE,#82H; 开所有中断且选择中断源为定时器0
SETB TR0; 启动定时器工作
LJMP $; 死循环
INT:
CLR ET0; 关中断
PUSH ACC; 保护现场
PUSH PSW
MOV TL0,#0B0H;重新赋值
MOV TH0,#03CH;
CJNE R0,#00H,LOOP;如果R0==0,就继续执行下去 否则LooP
CLR EA;关中断
MOV R0,#014H;如果已经到1S了重新计时
CPL P1.0; 取反p1.0
LOOP:
DEC R0; 如果还木有到1s那么就将计数值自减
POP PSW; 恢复现场
POP ACC;
MOV IE,#82H; 开中断
RETI; 中断返回
END;
实验五
实验展示:
PC机串行口设置波特率4800,启始位1位,数据为8位,停止位1位,用交叉串行线连接单片机J232。 编程实现向PC机串行发送1-10十个数据,波特率4800,工作方式1。
通常采用T1的工作方式2,即自动重装载方式作为波特率发生器
代码
ORG 0000H;
LJMP MAIN;
ORG 0100H;
MAIN:
MOV TMOD,#20H; 定时器T1 工作方式2
MOV TL1,#0F3H; 通过公式去计算对应的初始值
MOV TH1,#0F3H;
MOV IE,#98H; 开全部中断且开串行中断,且中断源是T1
SETB TR1; 启动定时器1
MOV SCON,#50H; 设定串行口的工作方式为方式1
MOV PCON,#80H;比特率加倍
MOV R0,#00H; 发送数据计数器 从0开始
MOV A,#00H; 准备发送的数据 先初始化成0
WRITE:
CLR TI; 发送中断标志位发送完数据之后会变成1 发送数据之前要清零
INC A; 从1开始发送发送到10即可停止
MOV SBUF,A; 发送数据
WAUT:
JBC TI,CONT; 如果发送数据完毕那么就转去CONT执行 发送下一个数据
LJMP WAUT; 否则就一直等到该数据发送直到发送完毕
CONT:
CLR TI; 清零,该句可以省略
INC R0; 发送完一帧数据以后 计数值就加1
CJNE R0,#0AH,WRITE ; 还木有发送到10 那就继续发送 否则循序执行
END;
实验七
实验要求:
根据动态显示原理在四位LED上显示1234
代码:
ORG 0000H
LJMP MAIN
ORG 0100H
MAIN:
MOV P0,#00H; 初始化 哪一位都不选
MOV P2,#00H;
LOOP:
SETB P0.0选择第一位显示1
MOV P2,#06H 段的码数表示1
LCALL DELAY 显示延迟
MOV P0,#00H; 清空数码管
SETB P0.1选择第二位显示2
MOV P2,#5BH 段的码数表示2
LCALL DELAY
MOV P0,#00H;
SETB P0.2 选择第三位显示3
MOV P2,#4FH;
LCALL DELAY
MOV P0,#00H;
SETB P0.3选择第四位
MOV P2,#66H
LCALL DELAY
LJMP LOOP 不断的循环 动态的显示1 2 3 4
DELAY: MOV R7,#4
DELY1: MOV R6,#248
NOP
DELY2: DJNZ R6,DELY2
DJNZ R7,DELY1
RET
END
实验十三
实验要求:
开关3S2接通P1.7时工作,这时P1.7=1,继电器控制线圈通电吸合,P1.7=0,继电器断电释放。当3S2接到GND时,继电器始终断电释放。
ORG 0000H;
LJMP MAIN;
MAIN:
MOV P1 ,#7FH; 设置p1口的初值 使得p1.7为0
LOOP:
CPL P1.7; 取反操作
LCALL DELAY;延迟
LJMP LOOP; 一直执行取反-延迟操作
DELAY:
MOV R7,#200;
DELAY1:
MOV R6,#123
NOP
DELAY2:
DJNZ R6,DELAY2;
DJNZ R7,DELAY2;
RET
END
|