单片机报告.docx
《单片机报告.docx》由会员分享,可在线阅读,更多相关《单片机报告.docx(23页珍藏版)》请在冰豆网上搜索。
![单片机报告.docx](https://file1.bdocx.com/fileroot1/2023-8/4/1ae037ff-02db-4950-ab43-8c8deca9fe68/1ae037ff-02db-4950-ab43-8c8deca9fe681.gif)
单片机报告
实验一BCD码与ASCII码转换程序设计
1.实验目的
初步掌握KeilC51(汇编语言),工程的建立及软件模拟仿真的使用
2.实验设备
单片机实验箱一台、具有一个RS232串行口并安装KeilC51的计算机一台。
3.实验内容
R2中放有组合BCD码,将其转换为对应ASCII码,高位放入R0,低位放入R1。
4.实验电路
本实验只需将单片机实验箱和PC机连好即可
5.实验代码
汇编代码:
ORG0000H
LJMPSTART
ORG0030H
START:
MOVR2,#19H
MOVA,R2
ANLA,#0FH
ADDA,#30H
MOVR1,A;存低位字节的ASCII码
MOVA,R2
ANLA,#0F0H
SWAPA
ADDA,#30H
MOVR0,A;存高位字节的ASCII码
SJMP$
END
C程序代码:
#include"REG51.H"
voidmain()
{
unsignedcharx,yh,yl;
x=0x26;
yl=x&0x0f;
yh=(x>>4)&0x0f;
while
(1)
{
;
}
}
6.实验步骤
(1)建立一个工程项目选择芯片确定选项。
Project→
NewProject→
输入工程名test→
保存工程文件
(2)加入C源文件或汇编源文件。
选CPU厂家(Atmel)→
选CPU型号(89C51),
选好后确定
(3)用项目管理器生成各种应用文件。
Project→
OptionsforTarget‘Target1’…→
在Target中→
更改CPU晶振频率为12MHz→⑤在Output中→⑥选择生成HEX格式其它采用缺省设置→⑦选好后确定。
(4)检查并修改源文件中的错误。
如果在源文件中存在错误在Output窗口中会出现错误提示信息,你可以在源程序中进行修改,然后存盘后重新Build观察错误提示信息。
(5)编译连接通过后进行软件模拟仿真。
Debug→Start/StopDebugSession进入软件模拟的仿真窗口,可使用单步、设断点来进行调试和除错。
7.实验结果
在软件仿真过程中,每执行程序一步,R2和R0寄存器的数值都有相应的改变
8.实验体会
通过本节实验,熟悉了KeilC51(汇编语言和C语言)开发过程的基本步骤,在进行软件仿真的过程对单片机汇编程序也有了更多的理解
实验二基本I/O口实验
1.实验目的
进一步掌握KeilC51(汇编语言)和ZY15MCU12BD型综合单片机实验箱的操作和使用,能够输入和运行简单的程序。
2.实验设备
单片机实验箱一台、具有一个RS232串行口并安装KeilC51的计算机一台。
3.实验内容
P1口输入接8个按钮开关,74ls273做输出读取开关状态,在发光二极管显示。
4.实验电路
5.实验代码
汇编代码:
OUT_PORTEQU0CFA0H
ORG0000H
LJMPSTART
ORG0030H
START:
MOVP1,#0FFH
MOVA,P1
MOVDPTR,#OUT_PORT
MOVX@DPTR,A
LJMPSTART
END
C代码
#include"REG51.H"
#include"ABSACC.H"
unsignedintOUT_PORT=0xCFA0;
voidmain()
{
unsignedchari;
while
(1)
{
P1=0xFF;
i=P1;
XBYTE[OUT_PORT]=i;
}
}
6.实验步骤
(1)按照上一节实验一的步骤将工程建立起来还有将程序调试好
(2)在OptionsforTarget‘Target1’中的Debug选项中选择硬件调试,也即勾选UseKeilMoniters-51Driver这一项
(3)按照电路图将硬件电路连接好
(4)运行并观察
7.实验结果
在硬件的调试过程中,拨动不同的开关,相应的灯有亮灭的变化
8.实验体会
通过本节实验,熟悉了PC机和实验箱的连接调试过程,将程序下载到实验箱进行调试,试验中,遇到了无论开关按键如何灯都是亮的情况,后来知道原因是程序只是下载到了实验箱而没有执行。
实验三基本I/O口实验
1.实验目的
8255A应用、定时计数器应用、数码管应用
2.实验设备
单片机实验箱一台、具有一个RS232串行口并安装KeilC51的计算机一台。
3.实验内容
用8255A作为单片机的扩展I/O口控制数码管动态显示,用单片机定时器设置数码管显示间隔
4.实验电路
5.实验代码
分析:
6MHz,12个时钟周期为2us,16位计数最大定时131ms,每次125ms产生溢出,8次为1s。
即(65536-x)*2=125000,则x=3036,即0xbdc;
汇编代码:
PA_PORTEQU0CFA0H;
PB_PORTEQU0CFA1H;
PC_PORTEQU0CFA2H;
PCTL_PORTEQU0CFA3H;
ORG0000H
LJMPSTART
ORG000BH
LJMPINT_T0_over
ORG0030H
START:
MOVSP,#68H
MOVR0,#0
MOVR1,#0
LCALLinit_t0
SETBTR0
SETBEA
MOVDPTR,#PCTL_PORT
MOVA,#80H
MOVX@DPTR,A;8255的PA、PB都工作在方式0,输出
LOOP:
MOVDPTR,#PB_PORT
MOVA,#0FFH
MOVX@DPTR,A;//数码管熄灭
MOVA,#0FDH
MOVX@DPTR,A
MOVA,R1
MOVB,#10
DIVAB
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#PA_PORT
MOVR2,#10
LOOPA:
MOVX@DPTR,A;//显示十位
DJNZR2,LOOPA
MOVDPTR,#PB_PORT
MOVA,#0FFH
MOVX@DPTR,A;//数码管熄灭
MOVA,#0FEH
MOVX@DPTR,A
MOVA,B
MOVDPTR,#TAB
MOVCA,@A+DPTR
MOVDPTR,#PA_PORT
MOVR2,#10
LOOPB:
MOVX@DPTR,A;//显示个位
DJNZR2,LOOPB
LJMPLOOP
init_t0:
CLRTR0;//T0禁止计数定时
MOVTMOD,#01H;//T0方式1(16位),定时
MOVTH0,#0bH;
MOVTL0,#0dcH;
SETBET0;//T0允许中断
RET
INT_T0_over:
;C/T0溢出中断服务函数
PUSHPSW
PUSHACC
MOVTH0,#0bH;
MOVTL0,#0dcH;
INCR0;
CJNER0,#8,LOOP1
LOOP1:
JCLOOP2
MOVR0,#0
INCR1
CJNER1,#60,LOOP3
LOOP3:
JCLOOP2
MOVR1,#0
LOOP2:
POPACC
POPPSW
RETI
TAB:
DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;//共阴数码管段码
END
C代码
#include"REG51.H"
#include"ABSACC.H"
unsignedintPA_PORT=0xCFA0;
unsignedintPB_PORT=0xCFA1;
unsignedintPC_PORT=0xCFA2;
unsignedintPCTL_PORT=0xCFA3;
unsignedchardata_seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段码
unsignedchart1,t2;
voidinit_t0()
{
TR0=0;//T0禁止计数定时
TMOD=0x01;//T0方式1(16位),定时
TH0=0x0b;
TL0=0xdc;
ET0=1;//T0允许中断
}
voidInt0Demo(void)interrupt1//C/T0溢出中断服务函数
{
TH0=0x0b;
TL0=0xdc;
t1=t1+1;
if(t1>=8)
{
t1=0;
t2=t2+1;
if(t2>=60)
{
t2=0;
}
}
}
voidmain()
{
unsignedchari;
XBYTE[PCTL_PORT]=0x80;//8255的PA、PB都工作在方式0,输出
init_t0();
TR0=1;
EA=1;
while
(1)
{
XBYTE[PB_PORT]=0xff;//数码管熄灭
XBYTE[PB_PORT]=0xfe;
for(i=0;i<10;i++)
{
XBYTE[PA_PORT]=data_seg[t2%10];//显示个位
}
XBYTE[PB_PORT]=0xff;//数码管熄灭
XBYTE[PB_PORT]=0xfd;
for(i=0;i<10;i++)
{
XBYTE[PA_PORT]=data_seg[t2/10];//显示十位
}
}
}
6.实验步骤
(1)按照上一节实验一的步骤将工程建立起来还有将程序调试好
(2)在OptionsforTarget‘Target1’中的Debug选项中选择硬件调试,也即勾选UseKeilMoniters-51Driver这一项
(3)按照电路图将硬件电路连接好
(4)运行并观察实验现象,下面是实验运行情况。
7.实验结果
在硬件的调试过程中,数码管会从0开始显示显示到60,隔1s显示
8.实验体会
通过本节实验,熟悉了8255A的使用,数码管的动态显示的连接方法,掌握8段LED显示器的使用及显示程序的设计方法,同时对定时器的编程使用有了进一步的了解。
实验四AD转换
1.实验目的
ADC0809的应用
2.实验设备
单片机实验箱一台、具有一个RS232串行口并安装KeilC51的计算机一台。
3.实验内容
用单片机处理A/D转换器采集回来的电平信息,并控制LED灯的明亮程度来反映出来
4.实验电路
5.实验代码
汇编代码:
;cs273与cs0连接,00~07与L1~L8连接
;cs0809与cs1连接,AN0与ADIN0连接,EOC与P1.0连接
CS273EQU0CFA0H;
CS0809EQU0CFA8H;
sbitEOC=P1.0
ORG0000H
LJMPSTART
ORG0030H
START:
MOVSP,#68H
MOV30H,#0;存放上次ad结果
LOOP:
SETBEOC;eoc设置为输入
MOVDPTR,#CS0809
MOVX@DPTR,A;启动adc0809,此时与所写的数据无关,注意AINI为cs0809+I
JNBEOC,$
MOVXA,@DPTR;读取adc0809转换结果
CJNEA,30H,LOOP1;比较连续2次结果是否相同
LJMPLOOP
LOOP1:
MOV30H,A
MOVDPTR,#CS273
MOVX@DPTR,A;led显示AD结果
LJMPLOOP
END
C程序代码:
//cs273与cs0连接,00~07与L1~L8连接
//cs0809与cs1连接,AN0与ADIN0连接,EOC与P1.0连接
#include"REG51.H"
#include"ABSACC.H"
unsignedintcs273=0xCFA0;
unsignedintcs0809=0xCFA8;
unsignedchart1,t2;
sbiteoc=P1^0;
voidmain()
{
unsignedchari,j;
while
(1)
{
eoc=1;//eoc设置为输入
XBYTE[cs0809]=0x80;//启动adc0809,此时与所写的数据无关,注意ADINI为cs0809+I
while(eoc==0)continue;
j=XBYTE[cs0809];//读取adc0809转换结果,注意ADINI为cs0809+I
if(j!
=i)//连续2次结果不同
{
XBYTE[cs273]=j;//led显示结果
}
}
}
6.实验步骤
(1)按照上一节实验一的步骤将工程建立起来还有将程序调试好
(2)在OptionsforTarget‘Target1’中的Debug选项中选择硬件调试,也即勾选UseKeilMoniters-51Driver这一项
(3)按照实验电路原理图连好电路
(4)当PC机和实验箱连接好后,会提示已连接到实验箱,下面是程序运行情况
7.实验结果
在调节A/D的旋钮,LED灯会有不同的亮灭情况
8.实验体会
通过本节实验,熟悉了A/D的编程方法,对A/D的使用有了进一步的了解,同时在调试实验箱的过程当中,连线出了一点问题,原因是没看好实验原理图,以后还得多加强实验动手方面的能力。
注:
报告最好有变化,老师做实验时交代说报告一样的就不用交了,大家辛苦一下吧,改改吧。
然后晚上各寝室长收一下,我晚上去拿