单片机硬件设计报告.docx
《单片机硬件设计报告.docx》由会员分享,可在线阅读,更多相关《单片机硬件设计报告.docx(25页珍藏版)》请在冰点文库上搜索。
单片机硬件设计报告
单片机硬件实验
实验2P1口实验2
思考题:
2
实验3简单I/O口扩展实验一——交通灯控制实验5
思考题:
5
实验5中断实验———有急救车的交通灯控制实验9
思考题:
9
实验6定时器实验———循环彩灯实验14
思考题:
14
实验118279键盘显示接口实验17
思考题:
17
实验15A/D转换实验20
思考题:
20
实验2P1口实验
一、实验目的:
1.学习P1口既做输入又做为输出的使用方法。
2.学习数据输入、输出程序的设计方法。
二、实验原理图:
三、实验步骤:
平推开关的输出K1接P1.0;K2接P1.1;
发光二极管的输入L1接P1.2;L2接P1.3;L5接P1.4;L6接P1.5。
运行实验程序,K1做为左转弯开关,K2做为右转弯开关。
L5、L6做为左转弯灯,L7、L8做为右转弯灯。
结果显示:
1:
K1接高电平K2接低电平时,左转弯灯(L1、L2)以一定频率闪烁,右转弯灯(L5、L6)灭;
2:
K2接高电平K1接低电平时,左转弯灯(L1、L2)灭,右转弯灯(L5、L6)以一定频率闪烁;
3:
K1、K2同时接低电平时,发光二极管全灭;
4:
K1、K2同时接高电平时,发光二极管全亮。
思考题:
修改程序,使K1,K2接高电平时,所有发光二极管闪烁。
四、参考程序:
T2.ASM
NAMET2
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
SETBP1.0
SETBP1.1;用于输入时先置位口内锁存器
MOVA,P1
ANLA,#03H;从P1口读入开关状态,取低两位
MOVDPTR,#TAB;转移表首地址送DPTR
MOVCA,@A+DPTR
JMP@A+DPTR
TAB:
DBPRG0-TAB
DBPRG1-TAB
DBPRG2-TAB
DBPRG3-TAB
PRG0:
MOVP1,#0FFH;向P1口输出#0FFH,发光二极管全灭
;此时K1=0,K2=0
JMPSTART
PRG1:
MOVP1,#0F3H;只点亮L5、L6,表示左转弯
ACALLDELAY;此时K1=1,K2=0
MOVP1,#0FFH;再熄灭0.5秒
ACALLDELAY;延时0.5秒
JMPSTART
PRG2:
MOVP1,#0CFH;只点亮L7、L8,表示右转弯
ACALLDELAY;此时K1=0,K2=1
MOVP1,#0FFH;再熄灭0.5秒
ACALLDELAY
JMPSTART
PRG3:
MOVP1,#00H;发光二极管全亮,此时K1=1,K2=1
ACALLDELAY;延时0.5秒
MOVP1,#0FFH;再熄灭0.5秒
ACALLDELAY
JMPSTART
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DELAY:
MOVR1,#5;延时0.5秒
DEL1:
MOVR2,#200
DEL2:
MOVR3,#126
DEL3:
DJNZR3,DEL3
DJNZR2,DEL2
DJNZR1,DEL1
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
END
实验3简单I/O口扩展实验一——交通灯控制实验
一、实验目的:
1.学习在单片机系统中扩展简单I/O接口的方法。
2.学习数据输出程序的设计方法。
3.学习模拟交通灯控制的实现方法。
二、实验内容:
扩展实验箱上的74LS273做为输出口,控制八个发光二极管亮灭,模拟交通灯管理。
三、实验原理:
本实验需要用到实验箱上八个发光二极管中的六个。
不妨将L1(红)、L2(绿)、L3(黄)做为东西方向的指示灯,将L5(红)、L6(绿)、L7(黄)做为南北方向的指示灯。
四、实验原理图
五、实验步骤:
74LS273的输出O0~O7接发光二极管L1~L8,74LS273的片选CS273接片选信号CSO.
运行实验程序,观察LED显示情况是否与实验内容相符。
思考题:
修改程序,要求将红绿灯控制循环中,红绿灯转换时,黄灯闪烁5次后的“红灯亮,
黄、绿灯全灭”状态,改为“红绿灯全灭,东西、南北方向黄灯闪烁10次”。
程序:
T3.ASM
;74LS273的输出O0~O7接发光二极管L1~L8
;?
4LS273的片选CS273接片选信号CSO
NAMET3;I/O口扩展实验一
PORTEQU0CFA0H;片选地址CS0
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
MOVA,#11H;两个红灯亮,黄灯、绿灯灭
ACALLDISP;调用273显示单元(以下雷同)
ACALLDE3S;延时3秒
LLL:
MOVA,#12H;东西路口绿灯亮;南北路口红灯亮
ACALLDISP
ACALLDE10S;延时10秒
MOVA,#10H;东西路口绿灯灭;南北路口红灯亮
ACALLDISP
MOVR2,#05H;R2中的值为黄灯闪烁次数
TTT:
MOVA,#14H;东西路口黄灯亮;南北路口红灯亮
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#10H;东西路口黄灯灭;南北路口红灯亮
ACALLDISP
ACALLDE02S;延时0.2秒
DJNZR2,TTT;返回TTT,使东西路口;黄灯闪烁五次
MOVR2,#0AH;黄灯闪烁10次
ACALLGGG1
MOVA,#21H;东西路口红灯亮;南北路口绿灯亮
ACALLDISP
ACALLDE10S;延时10秒
MOVA,#01H;东西路口红灯亮;南北路口绿灯灭
ACALLDISP
MOVR2,#05H;黄灯闪烁五次
GGG:
MOVA,#41H;东西路口红灯亮;南北路口黄灯亮
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#01H;东西路口红灯亮;南北路口黄灯灭
ACALLDISP
ACALLDE02S;延时0.2秒
DJNZR2,GGG;返回GGG,使南北路口;黄灯闪烁五次
MOVR2,#0AH;黄灯闪烁10次
ACALLGGG1
JMPLLL;转LLL循环
GGG1:
MOVA,#44H;黄灯亮
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#00H;黄灯灭
ACALLDISP
ACALLDE02S;延时0.2秒
DJNZR2,GGG1
RET
DE10S:
MOVR5,#100;延时10秒
JMPDE1
DE3S:
MOVR5,#30;延时3秒
JMPDE1
DE02S:
MOVR5,#02;延时0.2秒
DE1:
MOVR6,#200
DE2:
MOVR7,#126
DE3:
DJNZR7,DE3
DJNZR6,DE2
DJNZR5,DE1
RET
DISP:
MOVDPTR,#PORT;273显示单元
CPLA
MOVX@DPTR,A
RET
END
实验5中断实验———有急救车的交通灯控制实验
一、实验目的:
1.学习外部中断技术的基本使用方法。
2.学习中断处理程序的编程方法。
二、实验内容:
在实验三的内容的基础上增加允许急救车优先通过的要求。
当有急救车到达时,两个方向上的红灯亮,以便让急救车通过,假定急救车通过路口的时间为10秒,急救车通过后,交通灯恢复中断前的状态。
本实验以单脉冲为中断申请,表示有急救车通过。
3、
实验原理图:
四、实验步骤:
74LS273的输出O0~O7接发光二极管L1~L8,74LS273的片选CS273\接片选信号CS2,此时74LS273的片选地址为CFB0H~CFB7H之间任选。
单脉冲输出端P-接CPU板上的INT0。
思考题:
修改程序,要求按下单脉冲按钮Pulse后,红灯状态由常亮方式改为闪烁方式,时间10秒,然后恢复原状态。
五、程序:
T5.ASM
;74LS273的输出O0~O7接发光二极管L1~L8
;74LS273的片选CS273\接片选信号CS2,
;单脉冲输出端P-接CPU板上的INT0。
NAMET5;中断控制实验
OUTPORTEQU0CFB0H;端口地址
SAVEEQU55H;保存从端口CFB0输出的数据
CSEGAT0000H
LJMPSTART
CSEGAT0003H;中断向量为0003H
LJMPINT
CSEGAT4100H
START:
SETBIT0
SETBEX0
SETBEA
MOVA,#11H;置首显示码
MOVSAVE,A;保存
ACALLDISP;显示输出
ACALLDE3S;延时3秒
LLL:
MOVA,#12H;东西路口绿灯亮,南北路口红灯亮
MOVSAVE,A
ACALLDISP
ACALLDE10S;延时10秒
MOVA,#10H;东西路口绿灯灭
MOVSAVE,A
ACALLDISP
MOVR2,#05H;东西路口黄灯闪烁5次
TTT:
MOVA,#14H
MOVSAVE,A
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#10H
MOVSAVE,A
ACALLDISP
ACALLDE02S;延时0.2秒
DJNZR2,TTT
MOVA,#11H;红灯全亮
MOVSAVE,A
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#21H;东西路口红灯亮,南北路口绿灯亮
MOVSAVE,A
ACALLDISP
ACALLDE10S;延时10秒
MOVA,#01H;南北路口绿灯灭
MOVSAVE,A
ACALLDISP
MOVR2,#05H;南北路口黄灯闪烁5次
GGG:
MOVA,#41H
MOVSAVE,A
ACALLDISP
ACALLDE02S
MOVA,#01H
MOVSAVE,A
ACALLDISP
ACALLDE02S
DJNZR2,GGG
MOVA,#11H;红灯全亮
MOVSAVE,A
ACALLDISP
ACALLDE02S;延时0.2秒
JMPLLL;转LLL循环
DE10S:
MOVR5,#100;延时10秒
JMPDE1
DE3S:
MOVR5,#30;延时3秒
JMPDE1
DE02S:
MOVR5,#02;延时0.2秒
DE1:
MOVR6,#200
DE2:
MOVR7,#126
DE3:
DJNZR7,DE3
DJNZR6,DE2
DJNZR5,DE1
RET
INT:
CLREA
PUSHACC;中断处理
PUSHPSW
MOVA,R5
PUSHACC
MOVA,R2
PUSHACC
MOVR2,#19H
DAME:
MOVA,#11H;红灯亮
ACALLDISP
ACALLDE02S;延时0.2秒
MOVA,#00H;红灯灭
ACALLDISP
ACALLDE02S;延时0.2秒
DJNZR2,DAME
MOVA,SAVE;取SAVE中保存数据输出到cfa0端口
ACALLDISP
POPACC;出栈
MOVR2,A
POPACC
MOVR5,A
POPPSW
POPACC
SETBEA;允许外部中断
RETI
DISP:
MOVDPTR,#OUTPORT
CPLA
MOVX@DPTR,A
RET
END
实验6定时器实验———循环彩灯实验
一、实验目的:
1.学习8031内部计数器的使用和编程方法。
2.进一步掌握中断处理程序的编写方法。
二、实验设备:
CPU挂箱,8031CPU模块
三、实验原理:
1.定时常数的确定
定时器/计数器的输入脉冲周期与机器周期一样,为振荡频率的1/12。
本实验中时钟频率为6.0MHZ,现要采用中断方法来实现0.5秒延时,要在定时器1中设置一个时间常数,使其每隔0.1秒产生一次中断,CPU响应中断后将R0中计数值减一,令R0=05H,即可实现0.5秒延时。
时间常数可按下述方法确定:
机器周期=12÷晶振频率=12/(6×10⁶)=2us
设计数初值为X,则(2e+16-X)×2×
=0.1,可求得X=15535
化为十六进制则X=3CAFH,故初始值为TH1=3CH,TL1=AFH
2.初始化程序
包括定时器初始化和中断系统初始化,主要是对IP、IE、TCON、TMOD的相应位进行
正确的设置,并将时间常数送入定时器中。
由于只有定时器中断,IP便不必设置。
3.设计中断服务程序和主程序
中断服务程序除了要完成计数减一工作外,还要将时间常数重新送入定时器中,为下一次中断做准备。
主程序则用来控制发光二极管按要求顺序燃灭。
四、实验电路:
思考题:
修改程序,使彩灯变化花样为:
①L1、L2、…L8依次点亮;②L1、L2、…L8依次熄灭;③以双灯方式L1L2、L3L4、…依次点亮;④以双灯方式L8L7、L6L5、…依次熄灭。
程序:
T6.ASM
NAMET6;定时器实验
CSEGAT0000H
LJMPSTART
CSEGAT001BH;定时器/计数器1中断程序入口地址
LJMPINT
CSEGAT4100H
START:
MOVA,#01H;首显示码
CPLA
MOVR1,#03H;03是偏移量,即从基址寄存器到表首的距离
MOVR0,#05H;05是计数值
MOVTMOD,#10H;计数器置为方式1
MOVTL1,#0AFH;装入时间常数
MOVTH1,#03CH
ORLIE,#88H;CPU中断开放标志位和定时器
;1溢出中断允许位均置位
SETBTR1;开始计数
LOOP1:
CJNER0,#00,DISP
MOVR0,#05H;R0计数计完一个周期,重置初值
INCR1;表地址偏移量加1
CJNER1,#1BH,LOOP2
MOVR1,#03H;如到表尾,则重置偏移量初值
LOOP2:
MOVA,R1;从表中取显示码入累加器
MOVCA,@A+PC
CPLA
JMPDISP
DB01H,03H,07H,0FH,1FH,3FH,7FH,0FFH,0FEH,0FCH
DB0F8H,0F0H,0E0H,0C0H,80H,00H,03H,0FH,3FH,0FFH,3FH,0FH,03H,00H
DISP:
MOVP1,A;将取得的显示码从P1口输出显示
JMPLOOP1
INT:
CLRTR1;停止计数
DECR0;计数值减一
MOVTL1,#0AFH;重置时间常数初值
MOVTH1,#03CH
SETBTR1;开始计数
RETI;中断返回
END
实验118279键盘显示接口实验
一、实验目的:
1.进一步了解8279键盘、显示电路的编程方法。
2.进一步了解键盘电路工作原理及编程方法。
二、实验设备:
CPU挂箱,8031CPU模块
三、实验原理:
本实验用到了8279的键盘输入部分。
键盘部分提供的扫描方式最多可和64个按键或传感器阵列相连,能自动消除开关抖动以及对多键同时按下采取保护。
由于键盘扫描由8279自动实现,简化了键盘处理程序的设计,因而编程的主要任务是实现对扫描值进行适当处理,以两位十六进制数将扫描码显示在数码管上。
可省略对8279进行初始化,因为监控程序对8279已经进行了初始化,详见第三章键盘操作说明的4.5节。
四、实验题目
利用实验箱上提供的8279,键盘电路,数码显示电路,组成一个键盘分析电路,编写程序,要求在键盘上按动一个键,就将8279对此键扫描的扫描码显示在数码管上。
五、实验接线:
将键盘的KA10~KA12接8279的KA0~KA2;RL10~RL17接8279的RL0~RL7;
思考题:
键盘的扫描电路共分为3行8列,现要求修改源程序,使得按数字键0~9时,可在最左侧的LED数码管上直接显示对应数字。
程序名:
T11.ASM
;将键盘的KA10~KA12接8279的KA0~KA2
;RL10~RL17接8279的RL0~RL7;
NAMET11;8279键盘实验二
CSEGAT0000H
LJMPSTART
CSEGAT4100H
START:
MOVDPTR,#0CFE9H;8279命令字
MOVA,#0D1H;清显示
MOVX@DPTR,A
LOOP1:
MOVXA,@DPTR
ANLA,#0FH
JZLOOP1;有键按下?
没有则循环等待
MOVA,#0A0H;显示\消隐命令
MOVX@DPTR,A
MOVA,#40H;读FIFO命令
MOVX@DPTR,A
MOVDPTR,#0CFE8H;读键值
MOVXA,@DPTR
MOVR1,A;保存键值
MOVDPTR,#0CFE9H;写显示RAM命令
MOVA,#80H;选中LED2
MOVX@DPTR,A
MOVA,R1
ANLA,#0FH;取后半字节
MOVDPTR,#TAB
MOVCA,@A+DPTR;取段显码
MOVDPTR,#0CFE8H;写显示RAM
MOVX@DPTR,A
MOVDPTR,#0CFE9H;写显示RAM命令
MOVA,#81H;选中LED1
MOVX@DPTR,A
MOVA,R1
ANLA,#0F0H
SWAPA;取后半字节
MOVDPTR,#TAB
MOVCA,@A+DPTR;取段显码
MOVDPTR,#0CFE8H;写显示RAM
MOVX@DPTR,A
MOVDPTR,#0CFE9H
SJMPLOOP1
TAB:
DB3FH,06H,5BH,4FH,4FH,4FH,66H,6DH,7DH,07H;段显码表
db07H,07H,7fh,6fh,77h,7cH
END
实验15A/D转换实验
一、实验目的:
1.掌握A/D转换与单片机的接口方法。
2.了解A/D芯片ADC0809转换性能及编程方法。
3.通过实验了解单片机如何进行数据采集。
二、实验内容:
利用实验台上的ADC0809做A/D转换器,实验箱上的电位器提供模拟电压信号输入,编制程序,将模拟量转换成数字量,用数码管显示模拟量转换的结果。
三、实验电路:
四、实验步骤:
1.0809的片选信号CS0809接CS0。
2.电位器的输出信号AN0接0809的ADIN0。
3.EOC接CPU板的INT0.
思考题:
将P1.0接LED1,P1.1接LED2;修改源程序,满足以下要求(2,3小题选作一题即可):
1)将ADC0809的采样方式改为中断响应,利用中断处理程序读取转换结果。
2)当采样值大于0F0H,LED1亮;当采样值小于010H,LED2亮。
参考程序T15.c
#include
#include
#defineLed_datXBYTE[0xcfe8]//8279数据口地址
#defineLed_ctlXBYTE[0xcfe9]//设置8279控制字
#definead_portXBYTE[0xcfa0]//ADC0809地址
sbitP10=P1^0;
sbitP11=P1^1;
voidDisplay_byte(unsignedcharloc,unsignedchardat)
{
unsignedchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
loc&=0xf;//1111
Led_ctl=loc|0x80;//选中LED1
Led_dat=table[dat>>4];/*显示高4位*/
loc++;
Led_ctl=loc|0x80;//90H,选中LED2
Led_dat=table[dat&0xf];/*显示低4位*/
}
voiddelay(unsignedintt)
{
for(;t>0;t--);
}
voidmain(void)
{
EA=1;
EX0=1;
IT0=1;
Led_ctl=0xd1;//清屏显示
while((Led_ctl&0x80)==0x80);
Led_ctl=0x31;
ad_port=0;//启动A/D转换
while
(1);
}
/*将ADC0809的采样方式改为中断响应,利用中断处理程序读取转换结果。
*/
voidint0_int(void)interrupt0
{
Display_byte(0,ad_port);
delay(10000);
if(ad_port>0xf0)P10=0;//当采样值大于0F0H,LED1亮
if(ad_port<0x10)P11=0;//当采样值小于010H,LED2亮
if(ad_port>=0x10&ad_port<=0xf0)P10=P11=1;
ad_port=0;
}