Proteus仿真单片机实验Word格式文档下载.docx
《Proteus仿真单片机实验Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Proteus仿真单片机实验Word格式文档下载.docx(44页珍藏版)》请在冰豆网上搜索。
软件的编写是采用汇编语言,芯片的型号选择AT89C51,编写LED.ASM文件,利用Proteus本身的51汇编功能进行编译,编译成功后生成LED.hex文件。
2.2
绘制电路图
运行Proteus的ISIS,进入仿真软件的主界面,如图1所示。
主界面分为菜单栏,工具栏,模型显示窗口,模型选择区,元件列表区等。
图1
ISIS启动界面
通过左侧的工具栏区的P(从库中选择元件)命令,在Pick
devices窗口中选择系统所需元器件,还可以选择元件的类别,生产厂家等。
本例所需主要元器件有:
AT89C51芯片,电阻、电容、石英晶振和发光二极管,详见表1。
表1
元器件清单
选择元器件后连接图2所示电路。
图2
电路原理图
Microproccessor
ICs类的芯片的引脚与实际的芯片基本相同,
唯一的差别是隐去了GND和VCC引脚,系统默认的是把它们分别连接到地和+5V直流电源。
故在电路连线时可以不考虑电源和地的连接。
电路连接完成后,选中AT89C51单击鼠标左键,打开“Edit
Component”对话窗口如图3所示,可以直接在“Clock
Frequency”后进行频率设定,设定单片机的时钟频率为12MHz。
在“Add/removesourcefile”栏中选择已经编好的LED.asm文件,然后单击“OK”按钮保存设计。
至此,就可以进行单片机的仿真。
图
3
单片机属性的设定
2.3Proteus仿真结果
单片机的仿真结果图如图4,模拟信号经A/D转换后,结果送入单片机,再在数码管上显示;
通过调节可调电阻的阻值,可以得到不同的显示结果。
仿真结果表明,系统达到了预先的设计要求。
在仿真的过程中每个管脚旁边会出现一个小方块,红色的方快表示高电平,蓝色的表示低电平。
通过方快颜色的变化可以很方便地知道每个管脚电平的变化,从而能对系统的运行有更直观的了解,这对程序的调试有很大的帮助。
图4
仿真结果
3.总结
本文结合一个LED闪烁的单片机电路详细说明了Proteus在单片机开发中的应用。
可以看出,Proteus功能十分强大,能仿真各种数字模拟电路,且操作简单,使用方便。
能快速地进行单片机仿真,加快系统开发的过程,降低开发成本。
实验1PROTUES环境及LED闪烁综合实验
1.实验任务
做单一灯的左移右移,硬件电路如图所示,八个发光二极管L1-L8分别接在单片机的P1.0-P1.7接口上,输出“0”时,发光二极管亮,开始时P1.0→P1.1→P1.2→P1.3→┅→P1.7→P1.6→┅→P1.0亮,重复循环。
2.电路原理图
图1
3.程序设计内容
我们可以运用输出端口指令MOV P1,A或MOV P1,#DATA,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。
每次送出的数据是不同,具体的数据如下表1所示:
P1.7
P1.6
P1.5
P1.4
P1.3
P1.2
P1.1
P1.0
说明
L8
L7
L6
L5
L4
L3
L2
L1
1
L1亮
L2亮
L3亮
L4亮
L5亮
L6亮
L7亮
L8亮
4.程序框图
图2
5.汇编源程序
ORG0
START:
MOVR2,#8
MOVA,#0FEH
SETBC
LOOP:
MOVP1,A
LCALLDELAY
RLCA
DJNZR2,LOOP
MOVR2,#8
LOOP1:
MOVP1,A
RRCA
DJNZR2,LOOP1
LJMPSTART
DELAY:
MOVR5,#20;
D1:
MOVR6,#20
D2:
MOVR7,#248
DJNZR7,$
DJNZR6,D2
DJNZR5,D1
RET
END
实验2多路开关状态指示
如图1所示,AT89S51单片机的P1.0-P1.3接四个发光二极管L1-L4,P1.4-P1.7接了四个开关K1-K4,编程将开关的状态反映到发光二极管上。
(开关闭合,对应的灯亮,开关断开,对应的灯灭)。
3.1开关状态检测
对于开关状态检测,相对单片机来说,是输入关系,我们可轮流检测每个开关状态,根据每个开关的状态让相应的发光二极管指示,可以采用JB P1.X,REL或JNB P1.X,REL指令来完成;
也可以一次性检测四路开关状态,然后让其指示,可以采用MOV A,P1指令一次把P1端口的状态全部读入,然后取高4位的状态来指示。
3.2输出控制
根据开关的状态,由发光二极管L1-L4来指示,我们可以用SETB P1.X和CLR P1.X指令来完成,也可以采用MOV P1,#1111XXXXB方法一次指示。
4.程序框图
读P1口数据到ACC中
ACC内容右移4次
ACC内容与F0H相或
ACC内容送入P1口
图2
5.解决方案
方法一(汇编源程序)
ORG00H
MOVA,P1
ANLA,#0F0H
RRA
ORlA,#0F0H
MOVP1,A
SJMPSTART
方法二(汇编源程序)
JBP1.4,NEXT1
CLRP1.0
SJMPNEX1
NEXT1:
SETBP1.0
NEX1:
JBP1.5,NEXT2
CLRP1.1
SJMPNEX2
NEXT2:
SETBP1.1
NEX2:
JBP1.6,NEXT3
CLRP1.2
SJMPNEX3
NEXT3:
SETBP1.2
NEX3:
JBP1.7,NEXT4
CLRP1.3
SJMPNEX4
NEXT4:
SETBP1.3
NEX4:
SJMPSTART
实验3报警产生器
用P1.0输出1KHz和500Hz的音频信号驱动扬声器,作报警信号,要求1KHz信号响100ms,500Hz信号响200ms,交替进行,P1.7接一开关进行控制,当开关合上响报警信号,当开关断开告警信号停止,编出程序。
3.1信号产生的方法
500Hz信号周期为2ms,信号电平为每1ms变反1次,1KHz的信号周期为1ms,信号电平每500us变反1次;
FLAGBIT00H
JBP1.7,START
JNBFLAG,NEXT
MOVR2,#200
DV:
CPLP1.0
LCALLDELY500
DJNZR2,DV
CPLFLAG
NEXT:
MOVR2,#200
DV1:
DJNZR2,DV1
DELY500:
MOVR7,#250
NOP
DJNZR7,LOOP
实验4I/O并行口直接驱动LED显示
1.实验任务
如图1所示,利用AT89S51单片机的P0端口的P0.0-P0.7连接到一个共阴数码管的a-h的笔段上,数码管的公共端接地。
在数码管上循环显示0-9数字,时间间隔0.2秒。
2.电路原理图
3程序设计内容
(1)LED数码显示原理
七段LED显示器内部由七个条形发光二极管和一个小圆点发光二极管组成,根据各管的极管的接线形式,可分成共阴极型和共阳极型。
LED数码管的g~a七个发光二极管因加正电压而发亮,因加零电压而不以发亮,不同亮暗的组合就能形成不同的字形,这种组合称之为字形码,下面给出共阴极的字形码见表2
“0”
3FH
“8”
7FH
“1”
06H
“9”
6FH
“2”
5BH
“A”
77H
“3”
4FH
“b”
7CH
“4”
66H
“C”
39H
“5”
6DH
“d”
5EH
“6”
7DH
“E”
79H
“7”
07H
“F”
71H
(2)由于显示的数字0-9的字形码没有规律可循,只能采用查表的方式来完成我们所需的要求了。
这样我们按着数字0-9的顺序,把每个数字的笔段代码按顺序排好!
建立的表格如下所示:
TABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH。
4.程序框图
MOVR1,#00H
MOVA,R1
MOVDPTR,#TABLE
MOVCA,@A+DPTR
MOVP0,A
INCR1
CJNER1,#10,NEXT
MOVR5,#20
MOVR6,#20
MOVR7,#248
DJNZR6,D1
DJNZR5,D2
TABLE:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
实验5按键识别方法之一
每按下一次开关SP1,计数值加1,通过AT89S51单片机的P1端口的P1.0到P1.3显示出其的二进制计数值。
3程序设计方法
(1)其实,作为一个按键从没有按下到按下以及释放是一个完整的过程,也就是说,当我们按下一个按键时,总希望某个命令只执行一次,而在按键按下的过程中,不要有干扰进来,因为,在按下的过程中,一旦有干扰过来,可能造成误触发过程,这并不是我们所想要的。
因此在按键按下的时候,
要把我们手上的干扰信号以及按键的机械接触等干扰信号给滤除掉,一般情况下,我们可以采用电容来滤除掉这些干扰信号,但实际上,会增加硬件成本及硬件电路的体积,这是我们不希望,总得有个办法解决这个问题,因此我们可以采用软件滤波的方法去除这些干扰
信号,一般情况下,一个按键按下的时候,总是在按下的时刻存在着一定的干扰信号,按下之后就基本上进入了稳定的状态。
具体的一个按键从按下到释放的全过程的信号图如上图所示:
从图中可以看出,我们在程序设计时,从按键被识别按下之后,延时5ms以上,从而避开了干扰信号区域,我们再来检测一次,看按键是否真得已经按下,若真得已经按下,这时肯定输出为低电平,若这时检测到的是高电平,证明刚才是由于干扰信号引起的误触发,CPU就认为是误触发信号而舍弃这次的按键识别过程。
从而提高了系统的可靠性。
由于要求每按下一次,命令被执行一次,直到下一次再按下的时候,再执行一次命令,因此从按键被识别出来之后,我们就可以执行这次的命令,所以要有一个等待按键释放的过程,显然释放的过程,就是使其恢复成高电平状态。
(1)对于按键识别的指令,我们依然选择如下指令JB BIT,REL指令是用来检测BIT是否为高电平,若BIT=1,则程序转向REL处执行程序,否则就继续向下执行程序。
或者是 JNB BIT,REL指令是用来检测BIT是否为低电平,若BIT=0,则程序转向REL处执行程序,否则就继续向下执行程序。
(2)但对程序设计过程中按键识别过程的框图如右图所示:
图3
图4
6.汇编源程序
MOVR1,#00H;
初始化R1为0,表示从0开始计数
MOVA,R1;
CPLA;
取反指令
MOVP1,A;
送出P1端口由发光二极管显示
REL:
JNBP3.7,REL;
判断SP1是否按下
LCALLDELAY10MS;
若按下,则延时10ms左右
JNBP3.7,REL;
再判断SP1是否真得按下
INCR1;
若真得按下,则进行按键处理,使
计数内容加1,并送出P1端口由
发光二极管显示
JNBP3.7,$;
等待SP1释放
SJMPREL;
继续对K1按键扫描
DELAY10MS:
MOVR6,#20;
延时10ms子程序
L1:
DJNZR6,L1
实验6一键多功能按键识别技术
1.实验任务
如图1所示,开关SP1接在P3.7/RD管脚上,在AT89S51单片机的P1端口接有四个发光二极管,上电的时候,L1接在P1.0管脚上的发光二极管在闪烁,当每一次按下开关SP1的时候,L2接在P1.1管脚上的发光二极管在闪烁,再按下开关SP1的时候,L3接在P1.2管脚上的发光二极管在闪烁,再按下开关SP1的时候,L4接在P1.3管脚上的发光二极管在闪烁,再按下开关SP1的时候,又轮到L1在闪烁了,如此轮流下去。
2.电路原理图
3.程序设计方法
(1)设计思想由来
在我们生活中,我们很容易通过这个叫张三,那个叫李四,另外一个是王五;
那是因为每个人有不同的名子,我们就很快认出,同样,对于要通过一个按键来识别每种不同的功能,我们给每个不同的功能模块用不同的ID号标识,这样,每按下一次按键,ID的值是不相同的,所以单片机就很容易识别不同功能的身份了。
(2)设计方法
从上面的要求我们可以看出,L1到L4发光二极管在每个时刻的闪烁的时间是受开关SP1来控制,我们给L1到L4闪烁的时段定义出不同的ID号,当L1在闪烁时,ID=0;
当L2在闪烁时,ID=1;
当L3在闪烁时,ID=2;
当L4在闪烁时,ID=3;
很显然,只要每次按下开关K1时,分别给出不同的ID号我们就能够完成上面的任务了。
下面给出有关程序设计的框图。
4.程序框图
IDEQU30H
SP1BITP3.7
L1BITP1.0
L2BITP1.1
L3BITP1.2
L4BITP1.3
MOVID,#00H
JBK1,REL
LCALLDELAY10MS
JBK1,REL
INCID
MOVA,ID
CJNEA,#04,REL
JNBK1,$
CJNEA,#00H,IS0
CPLL1
IS0:
CJNEA,#01H,IS1
CPLL2
IS1:
CJNEA,#02H,IS2
CPLL3
IS2:
CJNEA,#03H,IS3
CPLL4
IS3:
LJMPSTART
DJNZR6,LOOP1
MOVR5,#20
LOOP2:
LCALLDELAY10MS
DJNZR5,LOOP2
实验7定时计数器T0作定时应用技术
用AT89S51单片机的定时/计数器T0产生一秒的定时时间,作为秒计数时间,当一秒产生时,秒计数加1,秒计数到60时,自动从0开始。
硬件电路如下图所示
3.程序设计内容
AT89S51单片机的内部16位定时/计数器是一个可编程定时/计数器,它既可以工作在13位定时方式,也可以工作在16位定时方式和8位定时方式。
只要通过设置特殊功能寄存器TMOD,即可完成。
定时/计数器何时工作也是通过软件来设定TCON特殊功能寄存器来完成的。
现在我们选择16位定时工作方式,对于T0来说,最大定时也只有65536us,即65.536ms,无法达到我们所需要的1秒的定时,因此,我们必须通过软件来处理这个问题,假设我们取T0的最大定时为50ms,即要定时1秒需要经过20次的50ms的定时。
对于这20次我们就可以采用软件的方法来统计了。
因此,我们设定TMOD=00000001B,即TMOD=01H
下面我们要给T0定时/计数器的TH0,TL0装入预置初值,通过下面的公式可以计算出
TH0=(216-50000) / 256
TL0=(216-50000) MOD 256
当T0在工作的时候,我们如何得知50ms的定时时间已到,这回我们通过检测TCON特殊功能寄存器中的TF0标志位,如果TF0=1表示定时时间已到。
5.程序框图
6.汇编源程序(查询法)
SECONDEQU30H
TCOUNTEQU31H
MOVSECOND,#00H
MOVTCOUNT,#00H
MOVTMOD,#01H
MOVTH0,#(65536-50000)/256
MOVTL0,#(65536-50000)MOD256
SETBTR0
DISP:
MOVA,SECOND
MOVB,#10
DIVAB
MOVA,B
MOVP2,A
WAIT:
JNBTF0,WAIT
CLRTF0
INCTCOUNT
MOVA,TCOUNT
CJNEA,#20,NEXT
INCSECOND
MOVA,SECOND
CJNEA,#60,NEX
MOVSECOND,#00H
NEX:
LJMPDISP
LJMPWAIT
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
实验8定时计数器T0作定时应用技术
用AT89S51的定时/计数器T0产生2秒钟的定时,每当2秒定时到来时,更换指示灯闪烁,每个指示闪烁的频率为0.2秒,也就是说,开始L1指示灯以0.2秒的速率闪烁,当2秒定时到来之后,L2开始以0.2秒的速率闪烁,如此循环下去。
0.2秒的闪烁速率也由定时/计数器T0来完成。
3.程序设计内容
(1)由于采用中断方式来完成,因此,对于中断源必须它的中断入口地址,对于定时/计数器T0来说,中断入口地址为000BH,因此在中断入口地方加入长跳转指令来执行中断服务程序。
书写汇编源程序格式如下所示:
ORG 00H
LJMP START
ORG 0BH
;
定时/计数器T0中断入口地址
LJMPINT_T0
NOP
主程序开始
.
INT_T0:
PUSHACC
定时/计数器T0中断服务程序
PUSHPSW
POPPSW
POPACC
RETI
中断服务程序返回
END
(2)定时2秒,采用16位定时50ms,共定时40次才可达到2秒,每50ms产生一中断,定时的40次数在中断服务程序中完成,同样0.2秒的定时,需要4次才可达到0.2秒。
对于中断程序,在主程序中要对中断开中断。
(3)由于每次2秒定时到时,L1-L4要交替闪烁。
采用ID来号来识别。
当ID=0时,L1在闪烁,当ID=1时,L2在闪烁;
当ID=2时,L3在闪烁;
当I