单片机知识总结
使用C语言编写单片机中断应【例7-1】设系统时钟频率为P20=!P20;//将P2.0取反用程序时,用中断号6MHz,利用T0定时,每隔1si=20;//重新给计数变区分每一个中断。例如,将P2.0的状态取反。量赋值voidX0_ISR(void)interrupt0{}解:所要求的定时时间1s超过}}//外部中断0中断函数了定时器的定时能力(时钟频
下面举例说明12T模式下,voidT0_ISR(void)interrupt1{}率为6MHz,12分频时,16位
//定时器T0中断函数STC12C5A60S2单片机串行通定时器的最长定时时间为voidX1_ISR(void)interrupt2{}131.072ms)信程序的编制方法。,所以无法采用定//外部中断1中断函数【例8-1】设有甲、乙两台单时器直接实现1s的定时。voidT1_ISR(void)interrupt3{}将定时器的定时时间设为片机,编写程序,使两台单片//定时器T1中断函数机间实现如下串行通信功能。50ms,在中断服务程序中对定voidUART1_ISR(void)(假设系统时钟为时器溢出中断请求进行计数,interrupt4{}//串行口1中断
11.0592MHz。)当计够20次时,将P2.0的状
函数
甲机(发送机):将首址为态取反,否则直接返回主程序,
voidADC_ISR(void)interruptADDRT的128字节外部RAM从而达到1s的定时。5{}//ADC中断函数
数据块顺序向乙机发送;选择T0为16位定时器方式,
【例5-1】编程实现通过延时函乙机(接收机):将接收的数据,方式字为01H。系统时钟频率数,P1.0输出方波信号,并通
顺序存放在以首址为ADDRR为6MHz,12分频时,计数单过示波器观察程序输出波形的
的外部RAM中。位时间间隔为2μs。T0的计数周期。
甲机(发送机)汇编语言程序:初值为:#include“stc12.h”
$INCLUDE(STC12.INC);包//STC12C5A60S2单片机寄存
含单片机寄存器定义文件$INCLUDE(STC12.INC);器定义头文件
包含STC12C5A60S2寄存器定ORG0000H
sbitP10=P1^0;//定义P1.0引
LJMPMAINT义文件
脚;主程序入口ORG0000Hvoiddelay(unsignedlongcnt);//ORG0023HLJMPMAIN;转延时函数声明
LJMPINTSE1;串口1主程序
voidmain(void){
中断服务程序入口ORG000BHP10=1;
ORG0100H;T0中断服务程序入口地址while(1)//主程序循环
MAINT:MOVSP,#60HLJMPT0_ISR{delay(60000);
;设置堆栈指针ORG0100HP10=~P10;}}
MOVSCON,#01000000B;置MAIN:MOVSP,#60Hvoiddelay(unsigned
;设置堆栈指针串行口工作方式1longcnt)//延时函数
MOVTMOD,#01H;T初始化MOVTMOD,#20H;定{while(cnt>0)cnt--;}
MOVTL0,#58H时器1为工作方式2
MOVTH0,#9EHMOVTH1,#0FDH;9600bps如图所示的中断线路可实现系
MOVA,#20;加器A置20的时间常数统的故障显示,当系统的各部
SETBT0;允外T0中断MOVTL1,#0FDH分工作正常时,4个故障源输
SETBEA;CPU开中断SETBTR1;启动定时器1
入端全为低电平,指示灯全熄
SETBTR0;启动T0计数SETBES;串行口开中断灭。若当某部分出现故障,则
SJMP$;等待SETBEA;开中断
对应的输入线由低电平变为高
T0_ISR:MOVTL0,#58HMOVDPTR,#ADDRT;ADDRT
电平,从而引起单片机中断,
MOVTH0,#9EH;重是首址,可以使用EQU定义
试设计判定故障源的程序,并
新装入时间常数MOVR0,#00H;字节数初值
进行相应的灯光显示。
DECA;累加器A内容减1MOVXA,@DPTR;取
解:通过或非门,将上升沿转
JNZEXIT第一个发送字节
换为下降沿,利用下降沿中断
CPLP2.0MOVSBUF,A;启动串行口发
方式实现。
MOVA,#20;送
汇编语言程序如下:累加器A重载20
SJMP$;等待中断
ORG0000HEXIT:RETI
LJMPMAIN;转主程序END;中断服务程序
ORG0003H程序中的符号“$”表示“本条
INTSE1:CLRTILJMPINT_X0;转中断服指令地址”,指令“SJMP$”
;将中断标志清零
务程序相当于:“HERE:LJMPCJNER0,#7FH,LOOPTORG0100HHERE”。;判断128B是否发送完,若没完,MAIN:MOVSP,#60H#include“stc12.h”//包则转MOVP2,#0FFH;指示灯全熄
含STC12C5A60S2的寄存器定CLRES;全部发送完毕,禁止灭
义文件串行口中断SETBIT0;为边沿触发中
sbitP20=P2^0;//声明P2.0LJMPENDT;转中断返回断方式
的引脚位变量LOOPT:INCR0SETBEX0;允许中断
unsignedchari;//声明计数;修改计数值
SETBEA;CPU开中断
变量。C语言程序中尽量不要INCDPTR;修改地址指针
SJMP$;等待中断
使用ACCMOVXA,@DPTR;取发送
INT_X0:MOVA,P1;对
voidmain(void)数据
应关系:LED0--P2.0--P1.0,其{MOVSBUF,A;启动串行口他类推//SP=0x60;//使用C语言设ENDT:RETI;中断返回CPLA计程序时,可以不设置堆栈指ENDANLA,#0FH
针MOVP2,ATMOD=0x01;乙机接收汇编语言程序:RETIEND
TL0=0x58;$INCLUDE(STC12.INC);包对应的C语言版程序:
TH0=0x9E;含单片机寄存器定义文件#include“stc12.h”i=20;//计数变量赋初值
ORG0000H//包含寄存器定义头文ET0=1;//允许T0中断LJMPMAINR;转主程序件EA=1;//开放总的中断
ORG0023HvoidX0_ISR(void)interrupt0TR0=1;//启动T0计数LJMPINTSE2//外部中断函数
while(1);//等待中断;串口1中断服务程序入口
{P2=~P1;}
}ORG0100Hvoidmain(void)
voidT0_ISR(void)interrupt1MAINR:MOVSP,#60H{unsignedchari;
//定时器T0中断函数;设置堆栈指针P2=0x0f;//熄灭所有的指示灯
{MOVSCON,#01010000B;置IT0=1;//外部中断0为边沿触
TL0=0x58;//重新装入时间串行口工作方式1,允许接收发方式
常数MOVTMOD,#20H;定时器1
EX0=1;//允许外部中断0
TH0=0x9E;为工作方式2
EA=1;//允许总的中断i--;//计数变量减1MOVTH1,#0FDH;产生while(1);//等待中断if(i==0){//若减到0,9600bps的时间常数}则将P2.0取反MOVTL1,#0FDH
SETBTR1;启动定时器1
SETBES;串行口开中断SETBEA;开中断
MOVDPTR,#ADDRR;数据缓冲区首址送DPTRMOVR0,#00H;置传送字节数初值
SJMP$;等待中断
;中断服务程序INTSE2:CLRRI;清接收中断标志
MOVA,SBUF;取接收的数据MOVX@DPTR,A;接收的数据送缓冲区CJNER0,#7FH,LOOPR;判接收完没有;若没有,转LOOPR继续接收
CLRES;若接收完,则关串行口中断LJMPENDRLOOPR:INCR0;修改计数值
INCDPTR;修改地址指针ENDR:RETI;中断返回END
【例8-2】设有甲、乙两台单片机,以工作方式2进行串行通信。每帧为11位,可程控的第9位数据为奇偶校验用的补偶位。编程实现如下所述的应答通信功能:
甲机取一数据,进行奇偶校验后发送。
乙机对收到的数据进行奇偶校验,若补偶正确则乙机向甲机发出应答信息“00H”,代表“数据发送正确”,甲机接收到此信息后再发送下一个字节。若奇偶校验错误,则乙机向甲机发出应答信息“0FFH”,代表“数据不正确”,要求甲机再次发送原数据,直至数据发送正确。甲机发送128字节数据后停止发送。乙机接收128字节数据。甲机汇编源程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADDRTEQU0000HORG0000H
LJMPMAINT;跳至主程序入口地址
ORG0023H;串口1中断服务程序入口LJMPINTSETORG0100HMAINT:MOVSP,#60HMOVPCON,#80H;波特率加倍
MOVSCON,#10010000B;置工作方式2,并允许接收
MOVDPTR,#ADDRT;设置数据块首址ADDRT的地址指针
MOVR0,#00H设置发送字节初值
SETBES;允许串行口中断SETBEA;CPU开中断MOVXA,@DPTR;取第一个发送数据MOVC,P;数据补偶MOVTB8,CMOVSBUF,A;启动串行口,发送数据SJMP$
;中断服务程序INTSET:
JBRI,LOOPT1;接收中断?若RI=1,则转接收乙机发送的应答信息
CLRTI;因RI=0,则必有TI=1,表明是甲机发送数据的中断请求
LJMPENDT;甲机发送一数据完毕跳至中断返回程序LOOPT1:CLRRI;清接收中断标志MOVA,SBUF;取乙机的应答数据
SUBBA,#01H;判断乙机应答信息是否为“00H”JCLOOPT2;数据传送正确,则转LOOPT2
MOVXA,@DPTR;数据传送不正确时,要求重新发送MOVC,PMOVTB8,CMOVSBUF,A;启动串行口,重发一次数据
LJMPENDT;跳中断返回程序LOOPT2:INCDPTR;修改地址指针,发送下一个数据INCR0;修改发送字节数计数值MOVXA,@DPTR;下一个数据补偶MOVC,P
MOVTB8,C;不能直接使用MOVTB8,PMOVSBUF,A;启动串行口,发送新的数据
CJNER0,#80H,ENDT;数据发送完?若没有发送完,则中断返回
CLRES;全部发送完毕,禁止串行口中断ENDT:RETI;中断返回END
乙机汇编语言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADDRREQU0000HORG0000H
LJMPMAINR主程序入口ORG0023H;串行中断入口LJMPINTSER;转至串行口中断服务程序ORG0100HMAINR:MOVSP,#60HMOVPCON,#80H;波特率加倍
MOVSCON,#10010000B;置串行口为工作方式2,允许接收
MOVDPTR,#ADDRR;数据指针首址
MOVR0,#00H;接收数据字节数初值
SETBES;串行口开中断SETBEA;CPU开中断SJMP$等待中断
;串行口中断服务程序
INTSER:JBRI,LOOPR1;若RI=1,则转接收程序入口CLRTI;若RI=0,必有TI=1,是发送中断,故应清零LJMPENDR;跳至中断返回程序
LOOPR1:CLRRI;清接收中断标志
MOVA,SBUF;读取接收的数据
MOVC,P;奇偶校验JCLOOPR2;如8位数为奇,则转LOOPR2再检测RB8位
ORLC,RB8
JCLOOPR3;奇偶校验错误时,转LOOPR3LJMPLOOPR4;补偶正确,转LOOPR4
LOOPR2:ANLC,RB8;8位数为奇,再检测RB8位JCLOOPR4;RB8=1,补偶正确,转LOOPR4
LOOPR3:MOVA,#0FFH;发出应答信息“0FFH”给甲机,表明数据不正确MOVSBUF,ALJMPENDR;跳至中断返回程序
LOOPR4:MOVX@DPTR,A;将接收的正确数据送数据缓冲区
MOVA,#00H;数据传送正确,发出应答信息“00H”给甲机
MOVSBUF,AINCR0;修改指针INCDPTR
CJNER0,#80H,ENDR;若数据没有接收完毕,则跳至中断返回
CLRES;接收完毕,关串行口中断ENDR:RETI;中断返回END
编程实现如下功能:
主机:先向从机发送一帧地址信息,然后再向从机发送10个数据信息。
从机:接收主机发来的地址帧信息,并与本机的地址号相比较,若不符合,仍保持SM2=1不变;若相等,则使SM2清零,准备接收后续的数据信息,直至接收完10个数据信息。
主机汇编语言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADDRTEQU0000HSLAVEEQU5;从机地址号ORG0000HLJMPMAINT;主程序入口地址
ORG0023HLJMPINTST;串口1中断入口地址ORG0100HMAINT:MOVSP,#60HMOVSCON,#0C0H;串行口方式3
MOVTMOD,#20H;置T1工作方式2
MOVTH1,#0FAH;置4800波特率
MOVTL1,#0FAH;相应的时间常数
MOVDPTR,#ADDRT;置数据地址指针MOVR0,#00H;发送数据字节计数清零
MOVR2,#SLAVE;从机地址号→R2
SETBTR1;启动T1SETBES串行口开中断SETBEA;CPU开中断SETBTB8;置位TB8,作为地址帧信息特征
MOVA,R2;发送地址帧信息MOVSBUF,ASJMP$;等待中断
;串行口中断服务程序:INTST:CLRTI;清发送中断标志CLRTB8;清TB8位,为发送数据帧信息做准备MOVXA,@DPTR;发送一个数据字节MOVSBUF,AINCDPTR;修改指针
INCR0
CJNER0,#0AH,LOOPT;判数据字节是否发送完CLRESLOOPT:RETIEND
从机汇编语言程序:
$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADDRREQU0000HSLAVEEQU5;从机地址号
ORG0000HLJMPMAINR;从机主程序入口地址ORG0023HLJMPINTSR;串口1中断入口地址ORG0100HMAINR:MOVSP,#60HMOVSCON,#0F0H;串行口方式3,SM2=1,REN=1,接收状态
MOVTMOD,#20H;置T1为工作方式2
MOVTH1,#0FAH;置4800波特率
MOVTL1,#0FAH;相应的时间常数
MOVDPTR,#ADDRR;置数据地址指针
MOVR0,#0AH;置接收数据字节数指针SETBTR1;启动T1SETBES;串行口开中断SETBEA;CPU开中断SJMP$;等待中断
INTSR:CLRRI;清接收中断标志MOVA,SBUF;取接收信息
MOVC,RB8;取RB8(信息特征位)→CJNCLOOPR1;RB8=0为数据帧信息,转LOOPR1XRLA,#SLAVE;RB8=1为地址帧信息,与本机地址号SLAVE比较JZLOOPR2;地址相等,则转LOOPR2LJMPENDR;地址不相等,则转中断返回ENDRLOOPR2:CLRSM2;清SM2,为后面接收数据帧信息做准备LJMPENDR;中断返回LOOPR1:MOVX@DPTR,A;接收的数据→数据缓冲区
INCDPTR;修改地址指针
DJNZR0,ENDR;数据字节没全部接收完,则转LOOPR2SETBSM2;全部接收完,置SM2=1ENDR:RETI;中断返回END
【例9-2】编程实现利用STC12C5A60S2单片机ADC通道2采集外部模拟电压信号,8位精度,采用查询方式循环进行转换,并将转换结果保存于30H单元中。假设时钟频率为18.432MHz。
解:取8位精度时,可设置ADRJ=0,直接使用转换结果寄存器ADC_RES的值。由于复位后,ADRJ=0,因此,按照ADC的编程要点进行初始化
后,直接判断ADC_FLAG标志是否为1,若为1,则读出ADC_RES寄存器的值,并存入30H即可;若为0,则继续等待。
汇编语言程序代码如下:$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADC_DATEQU30H;A/D转换结果
ORG0000HLJMPMAINORG0050HMAIN:
MOVSP,#70H;设置堆栈
ORLADC_CONTR,#80H;开A/D转换电源MOVA,#20HLCALL
DELAY;开电源后加适当延时,1ms以内即可MOVP1ASF,#04H;设置P1.2的模拟量功能MOV
ADC_CONTR,#11100010B;选择P1.2作为A/D转换通道
MOVA,#05HLCALL
DELAY;如果切换A/D转换通道,则需要加延时WAIT_AD:
ORLADC_CONTR,#00001000B;启动A/D转换
MOVA,#00010000B;判断A/D转换是否完成
ANLA,ADC_CONTRJZ
WAIT_AD;A/D转换尚未完成,继续等待
ANLADC_CONTR,#11100111B;将ADC_FLAG清零MOVA,ADC_RES;读取A/D转换结果
MOVADC_DAT,A;保存A/D转换结果LJMP
WAIT_AD;等待下一次转换完成DELAY:;延时子程序PUSH
02;将寄存器组0的R2入栈PUSH
03;将寄存器组0的R3入栈PUSH
04;将寄存器组0的R4入栈MOVR4,ADELAY_LOOP0:MOVR3,#200;2个时钟周期
Delay_LOOP1:MOVR2,#249;2个时钟周期
DELAY_LOOP:DJNZR2,DELAY_LOOP;4个时钟周期DJNZR3,DELAY_LOOP1;4个时钟周期DJNZR4,DELAY_LOOP0;4个时
钟周期
POP04POP03POP02RETEND
【例9-3】编程实现利用STC12C5A60S2单片机ADC通道2采集外部模拟电压信号,10位精度,采用中断方式进行转换,并将转换结果保存于30H和31H单元中。假设时钟频率为18.432MHz。
解:按照编程要点进行初始化时,可设置ADRJ=1。在中断服务程序中读出ADC_RES寄存器的值,屏蔽高6位后存入31H单元,读出ADC_RESL寄存器的值,存入30H单元。汇编语言程序代码如下:$INCLUDE(STC12.INC);包含STC12C5A60S2单片机寄存器定义文件
ADC_HIEQU31H;A/D转换结果高2位
ADC_LOWEQU30H;A/D转换结果低8位
ORG0000HLJMPMAINORG002BHLJMP
ADC_ISR;ADC中断服务程序入口
ORG0050HMAIN:
MOVSP,#70H;设置堆栈ORL
ADC_CONTR,#80H;开A/D转换电源
MOVA,#20HLCALL
DELAY;开电源后要加适当延时,1ms以内即可MOVP1ASF,#04H;设置P1.2的模拟量功能
MOV
ADC_CONTR,#11100010B;选择P1.2作为A/D转换通道MOVA,#05HLCALL
DELAY;如果切换A/D转换通道,则需要加延时ORLAUXR1,#04H;设置ADC转换结果存储格式(ADRJ=1)ORL
ADC_CONTR,#00001000B;启动A/D转换SETB
EADC;EADC=1,开放ADC的中断控制位
SETB
EA;开放CPU总中断SJMP
$;循环等待中断
ADC_ISR:;ADC中断服务程序入口
ANLADC_CONTR,#11100111B;将ADC_FLAG清零
MOVA,ADC_RES;读取A/D转换结果高2位ANL
A,#03H;屏蔽高6位
MOVADC_HI,
A;保存A/D转换结果高2位MOVA,ADC_RESL;读取A/D转换结果低8位MOVADC_LOW,A;保存A/D转换结果低8位ORLADC_CONTR,#00001000B;重新启动A/D转换RETI
DELAY:;延时子程序PUSH
02;将寄存器组0的R2入栈PUSH
03;将寄存器组0的R3入栈PUSH
04;将寄存器组0的R4入栈MOVR4,ADELAY_LOOP0:MOVR3,#200;2个时钟周期
Delay_LOOP1:MOVR2,#249;2个时钟周期
DELAY_LOOP:DJNZR2,DELAY_LOOP;4个时钟周期DJNZR3,DELAY_LOOP1;4个时钟周期DJNZR4,DELAY_LOOP0;4个时钟周期
POP04POP03POP02RETEND
扩展阅读:单片机知识点总结 考试大题
单片机考点总结及考试大题
1.2.3.4.
单片机由CPU、存储器及各种I/O接口三部分组成。
单片机即单片微型计算机,又可称为微控制器和嵌入式控制器。MCS-51系列单片机为8位单片机,共40个引脚,MCS-51基本类型有8031、8051和8751.MCS-51单片机共有16位地址总线,P2口作为高8位地址输出口,P0口可分时复用为低8位地址输出口和数据口。MCS-51单片机片外可扩展存储最大容量为216=64KB,地址范围为0000HFFFFH。(1.以P0口作为低8位地址/数据总线;2.以P2口作为高8位地址线)
5.MCS-51片内有128字节数据存储器(RAM),21个特殊功能寄存器(SFR)。(1)MCS-51片内有128字节数据存储器(RAM),字节地址为00H7FH;(2)21个特殊功能寄存器(SFR)(21页23页);
(3)当MCS-51上电复位后,片内各寄存器的状态,见34页表2-6。PC=0000H,SP=07H,P0~P3=FFH
6.程序计数器PC:存放着下一条要执行指令在程序存储器中的地址,即当前PC值或现行值。程序计数器PC是16位寄存器,没有地址,不是SFR.
7.PC与DPTR的区别:PC和DPTR都用于提供地址,其中PC为访问程序存储器提供地址,而DPTR为访问数据存储器提供地址。8.MCS-51内部有2个16位定时/计数器T0、T1,1个16位数据指针寄存器DPTR,其中MOVEDPTR,#data16是唯一的16位数据传送指令,用来设置地址指针DPTR。9.程序状态字寄存器PSW(16页)(2)PSW寄存器中各位的含义;Cy:进位标志位,也可以写为C。Ac:辅助进位标志位。
RS1、RS0:4组工作寄存区选择控制位。RS10011RS00101所选的4组寄存器0区(内部RAM地址00H~07H)1区(内部RAM地址08H~0FH)2区(内部RAM地址10H~17H)3区(内部RAM地址18H~1FH)P为奇偶标志位:该标志位用来表示累加器A中为1的位数的奇偶数P=1,A中1的个数为奇数;P=0,A中1的个数为偶数。
另:使用加法指令时,累加器A中的运算结果对各个标志位的影响:(1)如果位7有进位,则置1进位标志位Cy,否则清0Cy;(2)如果位3有进位,置1辅助进位标志位Ac,否则清0Ac;
(3)如果位6有进位,而位7没有进位,或者位7有进位,而位6没有,则溢出标志位OV置1,否则清0OV。即只要位7和位6中有一个进位,而另一个没进位,OV就置1.10.MCS-51指令系统的七种寻址方式,熟练掌握各寻址方式。(40页)。寻址方式寄存器寻址方式直接寻址方式使用的变量寻址空间R0~R7、A、B、C(位)4组通用工作寄存区、部分特殊功能寄存器DPTR、AB内部RAM128B、特殊功能寄存器寄存器间接寻址方式立即寻址方式基址寄存器加变址寄存器间接寻址方式位寻址方式相对寻址方式@R1,@R0,SP@R1,@R0,@DPTR#data@A+DPTR,@A+PCPC+偏移量片内RAM片外数据存储器程序存储器内部RAM20H~2FH单元的128个可寻址位、SFR中的可寻址位(85个)程序存储器12.MCS-51有5个中断源,2级中断优先级。5个中断源名称及其中断入口地址分别是什么?哪些中断源的中断请求标志位在响应中断时由硬件自动清除?那些中断源的中断请标志位必须使用软件清除?记住各个中断请求标志位,优先级标志位,触发方式标志位。(102页108页)中断源外部中断0定时器/计数器T0外部中断1定时器/计数器T1串行口中断入口地址0003H000BH0013H001BH0023H响应中断时中断请求标志位硬件自动清除IE0硬件自动清除TF0硬件自动清除IE1硬件自动清除TF1软件清除TI或RI前面4种都是硬件自动清0,串行中断必须使用软件清除,因为串行接收和发送共享串行中断,在中断处理中必须使用T1和R1判断串行接收还是发送中断。
13.MCS-51的串行口为全双工的异步串行通信口,串行口有几种工作方式?每种工作方式的帧格式和波特率是什么?串行口有4种工作方式:SM00011SM10101方式功能说明0123同步异位寄存器方式(用于扩展I/O口)波特率固定,为fosc/128位异步收发,波特率可变(有定时器控制)9位异步收发,波特率为fosc/64或fosc/329位异步收发,波特率可变(有定时器控制)SM0、SM1:串行口4中工作方式的选择位
TXDP3.1RXDP3.0REN允许串行接收设240字符每秒异步通讯240*10=2400bitSCON:串行口控制PCON波特率设置15.系统总线
按其功能通常把系统总线分为三组:(1)、地址总线(AddressBus,简写AB)地址总线用于传送单片机发出的地址信号,以便进行存储单元和I/O端口的选择。地址总线是单向的,只能由单片机向外送出。地址总线的数目决定着可直接访问的存储单元数目。MCS-51单片机最多可以扩展64KB,即65536个地址单元,因此,地址总线为16条。(2)、数据总线(DataBus,简写DB)
。MCS-51单片机是8位字长,所以,数据总线的位数也是8位的。数据总线是双向的,可以进行2个方向的传送。控制总线)
15.单片机外部扩展存储器地址分配的方法线选法和译码法。外部扩展存储器容量大小的确定方法(1)由该存储器芯片上的地址根数决定,如程序存储器芯片27128有A0A13共14根地址线,故27128的存储容量=214=16KB;(2)用存储器芯片型号后面的数字÷8即可得到该芯片的存储容量,如27128的存储容量=128÷8=16KB;
16.P0口作第八位的地址、数据总线,P2口作为高位地址线,PSEN:ALE作为P0口低八位所存控制,EA-ROM的选择控制16.存储器扩展的读写控制:
外扩的RAM芯片既能读出又能写入,所以通常都有读写控制引脚,记为OE和WE。外扩的RAM的读写控制引脚分别与MCS-51的RD和WR引脚相连。
外扩的EPROM在正常使用中只能读出,不能写入,故EPROM的芯片没有写入控制引脚,只有读出引脚,记为OE,该引脚与MCS-51的PSEN相连。
17.在MCS-51单片机系统中,外接程序存储器和数据存储器共用16位地址线和八8位数据线,为何不发生冲突?
外接程序存储器和数据存储器虽然共用16位地址线和8位数据线,但由于访问外扩程序存储器时是PSEN信号有效,而访问数据存储器时是RD或WR信号有效。而这些控制信号是由MCS-51执行访问外部外序存储器和或访问外部数据存储器的指令产生,任何时候只能执行1种指令,只产生1种控制信号,所以不会产生数据冲突的问题。
已知8051单片机的fosc=12MHZ,用T1定时,试编程P1.1周期为2ms的方波
MOVTMOD,#20H;T1方式2定时MOVTH1,#06H;定时250μsMOVTL1,#06HSETBTR1
L2:MOVR2,#04HL1:JNBTF1,$CLRTF1
DJNZR2,L1CPLP1.1SJMPL2
请回答:(共16分)
1.下图中外部扩展的程序存储器和数据存储器容量各是多少?(2分)2.两片存储器芯片的地址范围分别是多少?(地址线未用到的位填1)(6分,)3.请编写程序,要求:
(1)将内部RAM30H~3FH中的内容送入1#6264的前16个单元中;(4分)(2)将2#6264的前4个单元的内容送入40H~43中;(4分)
解:1.外扩程序存储器的容量是8K,外扩数据存储器的容量是16K
2.2764范围:
C000H~DFFFH
1#范围:A000H~BFFFH2#范围:6000H~7FFFH
3.请编写程序(1)
MOV
R1,#10H
MOVMOVLOOP:MOV
DPTR,@0A000HR0,#30HA,@R0
MOVX@DPTR,A
INCINC
DJNZ
RET
(2)
MOVMOVMOV
R1,#04HDPTR,#6000HR0,#40HDPTR
R0R1,LOOP
LOOP:MOVX
MOV
A,@DPTR
@R0,A
INCINCDJNZRET
DPTRR0R1,LOOP
将外部数据存储器中的5000H50FFH单元全部清零(10分)。答:ORG0100H(1分)MOVDPTR#5000H
MOVR0,#00H
CLRA(3分)
LOOP:MOVX@DPTR,A
INCDPTR(3分)DJNZR0,LOOP(2分)
HERE:SJMPHERE(RET或SJMP$等)(1分)
题9.9电路图可以参考图9-10,PA口每一位接二极管的正极,二极管的负极接地。PB口每1位接一开关和上拉电阻,开关另一端直接接地。这样只需要将读到的PB口的值送给PA口就可以满足题目要求了。
ORG
0100H
;设置PA口方式0输出,PB口方式0输入
MIAN:MOV
A,#10000010B
MOVDPTR,#0FF7FH;控制口地址送DPTR
;送方式控制字
MOVX@DPTR,AMOV
DPTR,#0FF7DH;PB口地址送DPTR
;读入开关信息
MOVXA,@DPTRMOV
DPTR,#0FF7CH;PA口地址送DPTR
;PA口的内容送PB口点亮相应的二极管
MOVX@DPTR,AEND
友情提示:本文中关于《单片机知识总结》给出的范例仅供您参考拓展思维使用,单片机知识总结:该篇文章建议您自主创作。
来源:网络整理 免责声明:本文仅限学习分享,如产生版权问题,请联系我们及时删除。