杭电单片机实验报告六.docx
- 文档编号:10327881
- 上传时间:2023-02-10
- 格式:DOCX
- 页数:16
- 大小:20.62KB
杭电单片机实验报告六.docx
《杭电单片机实验报告六.docx》由会员分享,可在线阅读,更多相关《杭电单片机实验报告六.docx(16页珍藏版)》请在冰豆网上搜索。
杭电单片机实验报告六
杭电单片机实验报告六
单片机原理与应用技术实验报告
实验
题目:
:
AD/A转换器得接口与应用
姓名:
:
_
*
_
学号:
:
___
**_
_
**
实验日期:
:
20177、66、66
指导教师:
:
高惠芳
11、实验内容
、1波得波齿锯现实程编请,V01—为压电考参,接所上堂课如线接得机片单与2380CADﻩ形,锯齿波得周期为20+作业号,单位就是ms。
我得作业号就是6,所以周期就就是26ms。
经过计算后时间应为0、102ms左右。
1)
程序代码:
H0000GROﻩWASADPMJAﻩH0020GROﻩDASAW:
CLRALOOP1:
MOVP1,ADELAY:
61#,7RVOMﻩDLY1:
MOVR6,#1DLY2:
DJNZR6,DLY2
PONﻩDJNZR7,DLY1
INCA
1POOLPMJSﻩEND2)
软件程序截图
3)
编译通过截图
4)
调试截图
时间满足00、s102ms左右
5)
仿真电路图
6)
仿真波形图
2、DAC0832与单片机得接线如课堂上所接,参考电压为—10V,请编程实现三角波得波形,三角波得周期为20+作业号,单位就是ms。
我得作业号就是6,所以周期就就是26ms。
经过计算后时间应为0、102ms左右。
1)程序代码:
ORG0000H
WASADPMJAﻩORG0200HDASAW:
CLRALOOP1:
MOVP1,A;
DELAY:
61#,7RVOMﻩDLY1:
1#,6RVOMﻩDLY2:
DJNZR6,DLY2
PONﻩ1YLD,7RZNJDﻩACNIﻩCJNEA,#00H,LOOP1LOOP2:
MOVP1,A;
DECA
2POOL,H00#,AENJCﻩSJMPDASAW
END2)代码程序截图
3)编译通过截图
4)仿真电路图
5)仿真结果
33、实验心得
通过以上得实验,对DAC得转换原理有了比较深刻得了解,也对D/A转换器有了一定得了解,DAC得基本原理就是把数字量得每一位按照权重转换成相应得模拟分量,然后根据叠加定理将每一位对应得模拟分量相加,输出对应得电流或电压。
根据DAC内部结构得不同,DAC可以分成权电阻网络与T型网络等结构;根据输出结构得不同,DAC也可以分成电压输出与电流输出两类。
引起了我很大的兴趣。
看得我意犹未尽。
实验一
一、实验
题目:
试编写一段程序,其功能为将21H单元的内容8位分别依次存放到从22H开始的8单元中。
二、keil代码:
org0000hjmpstart
org0100hstart:
mov21h,#8;movA,21h;取出21中的数movR0,#22h;初始化movR1,#7h;循环次数为7loop:
RRCA;把A之中的最低位移到C
JCreal;判断C里面是数是否为1,如果是1.则跳转到realmov@R0,#0hjmpkk;real:
mov@R0,#1h;如果是1,则将1赋到R0单元里kk:
INCr0;依次判断A中的每一位
DJNZR1,loop;jmp$;死循环end
三、实验截图:
四、实验小结:
这是我们单片机的第一个实验,因为刚接触,所以会感觉很陌生,内心有一种畏惧感,看到
题目的时候也是没有头绪,可以说完全是不知道到底
题目是一个什么意思,更是不知道我们应该如何编写程序。
不过后面通过老师的讲解,自己也去查看了一些有关的书籍,慢慢也理解了该如何去实现这种实验
题目。
在认真琢磨之后,我开始学会像以前刚开始学习C语言一样慢慢绘制一个程序的流程图,理清思绪,然后根据流程图编写相应的代码。
下面是本题的实验流程图:
通过完成这个实验,我对单片机的程序有了很大的认识。
实验中,也是深刻的理解到了一个单片机程序每一步的实现与运行。
当然,也掌握了在keil中调试的方法。
实验二
一、实验
题目:
若0-5号键的键值分别是:
EEH、DEH、BEH、7EH、EDH、DDH。
设键值存放在内部RAM20H单元中,编程实现根据2OH中的键值分别使程序转移到PR0-PR4程序段。
要求当以上程序段的功能完成后,都采用RET指令,指定返回到程序的初始入口START标号处。
要求:
PR0:
教材75页习题。
PR1:
同上习题9题PR2:
同上习题10其余入口,只需完成空操作就返回。
二、keil代码:
org0000ljmpstartorg0100TAB:
DB0EEH,0DEH,0BEH,7EH,0EDH,0DDHstart:
movdptr,#startpushdplpushdph
movA,#0EEHMOV20H,A
MOVDPTR,#TAB
MOVA,#0NE_T:
PUSHACC;先保存A寄存器中的值
MOVCA,@A+DPTR
;A是键码表的编码
;置键码表首址
;表的起始位置的偏移量为零CJNEA,20H,NE_T1POPACCRLA
;将20H值和键码表的值比较
;如相等,序号乘以2,得到分支表内偏移量2n(8位变16位)
MOVDPTR,#APJ
JMP@A+DPTRPRn指令
NE_T1:
POPACC
INCACJNEA,#6,NE_T;表示如果==6了,说明编码查完了也没有相等的,程序直接结束
SJMP$
APJ:
AJMPPR0AJMPPR1AJMPPR2AJMPPR3AJMPPR4
;不相等,则比较下一个
;置分支表首址
;执行表JPT+2H中的AJMP
PR0:
MOVR7,#5HMOV3DH,#00HMOV3EH,#20HMOV4EH,#88HMOV5EH,#98HMOVA,#0MOVR4,AMOVR5,AMOVR6,A
;正数个数
;负数个数
;零的个数
MOVR0,#40HMOVR1,#50HMOVSP,#3FHLOOP:
POPACCJZZEROJBACC.7,FSINCR4MOV@R0,AINCR0AJMPDJFS:
INCR5MOV@R1,AINCR1AJMPDJZERO:
INCR6DJ:
DJNZR7,LOOPRET
DATA1:
DB0EFH,3FH,3EH,07HPR1:
MOVR7,#03H;进行3次循环MOVR0,#DATA1MOVA,@R0
CPLA;取反ADDA,#01
;加1MOV@R0,AAB1:
INCR0MOVA,@R0CPLAADDCA,#0;带进位DJNZR7,AB1;SJMP$
RETBUF1:
DBB,0B,0010B,0100B,0B,0010B,0001B,0000B,1001B,0000B,0B,1B,0000B,0011B,0010B,0001BBUF2:
DB0BUF:
DB0PR2:
;30h放平均值40h放余数MOVR0,#BUF1
MOVR7,#16;循环16次数MOVB,#0MOVA,@R0MOVR2,ALOOP1:
MOVA,R2INCR0ADDA,@R0MOVR2,AMOVA,BADDCA,#0MOVB,ADJNZR7,LOOP1
MOVR6,#04HMOV30H,#BUF2MOV30H,AMOV40H,#BUFMOV40H,#0NE_:
CLRCMOVA,BRRCAMOVB,AMOVA,30HRRCA
MOV30H,AMOVA,40HRRCAMOV40H,ADJNZR6,NE_SJMP$RETPR5:
RETPR3:
RETPR4:
RETEND
三、实验截图:
初始化:
结果:
四、实验小结:
本实验中,将键码排成表,将键码表中的值和20H单元中的内容进行比较;另外编制一张转移表,存放AJMP指令,利用JMP@A+DPTR执行表内的AJMP指令,从而实现分支转移。
“RLA”:
因为每个AJMP指令占两个字节,将刚记下来的键码中的值(即:
键码的序号)乘以2即为转移表的偏移地址,在利用JMP@A+DPTR执行表内的AJMP指令,从而实现分支转移。
“movdptr,#startPushdplpushdph”:
指定每次主程序返回到start。
在单片机中,每一个子程序的返回用RET指令,而RET指令的功能正好可以使得子程序从栈顶弹出断点到PC,从而返回到主程序
实验三
一、实验
题目:
使用C语言完成,实验一,实验二。
二、keil代码:
实验一:
#include#includevoidmain{char_p1=0_21;char_p2=0_22;inti=1;
_p1=0_8;
while(i{
_p2=_p1&01;
_p1=_p1>>1;p2++;i++;
}}实验二:
#includevoidPR0;voidPR1;voidPR2;voidPR3;voidPR4;voidPR5;
intmain{inti;//键码表code[]的下表
intkey=0;charcode1[]={0_EE,0_DE,0_BE,0_7e,0_ED,0_DD};char_p0=0_20;
//指针变量_p0指向20H这个单元
_p0=0_DE;
//给20H单元赋初值(20H单元里存放键码表中任一值)
for(i=0;i}
key=i;switch(key)if(_p0==code1[i]){break;}
}{
}return0;case0:
PR0;break;case1:
PR1;break;case2:
PR2;break;case3:
PR3;break;case4:
break;case5:
break;default:
break;voidPR0{chartable1[16]={1,2,-6,7,8,9,0,-1,-2,-3,-4,-5,-6,1,4,6};chardata_p30=0_30;chardata_p40=0_40;chardata_p50=0_50;inti;intcountR4=0;R4,R5,R6中
intcountR5=0;
//分别将正数、负数和零的个数存入intcountR6=0;for(i=0;i//依次将table1表里的16个数据存入30H单元开始的单元里。
{
}for(i=0;i{
if(_p30>0){
}elseif(_p30}else_p50=_p30;++p50;++countR5;
_p40=_p30;++p40;++countR4;
p30[i]=table1[i];
{}++countR6;
}
++p30;}}
voidPR1{chardata1[]={0_10,0_11,0_12,0_13};inti;intj;charCy=PSW^7;data1[0]=(~data1[0])+0_1;//while(j}}data1[i]=(~data1[i])+Cy;i++;
voidPR2{charbuf1[]={0_1,0_2,0_3,0_4,0_5,0_6,0_7,0_8,0_9,0A,0B,0C,0D,0E,0_F};charbuf2=0;charbuf=0;intsum=0;inti=1;while(i{sum=sum+buf1[i];
++i;
}buf2=sum/0_10;buf=sum0_10;}
三、实验截图:
实验一:
实验二:
四、实验小结:
在本实验中,我们用C语言编写代码的时候,特别注意指针的使用。
另外,在单片机中使用C语言,与我们之前写C语言的时候还是有一些不同的地方,尤其是在指针使用上面的不同。
C语言是一种通用的程序设计语言,代码率高,数据类型丰富,且具有良好的程序结构;单片机的C语言采用C51编译器,由C51产生的目标代码短,运行速度快,所需内存空间小。
实验中,注意:
“for(i=0;i{
p30[i]=table1[i];}”:
表示依次将table1表里的16个数据存入30H单元开始的单元里。
实际上,在C中指针就相当于一个数组。
在本实验中,我可以根据之前的汇编程序实验,较为容易的根据每个子程序编子函数模块。
由于之前有C语言的基础,所以能够比较好的完成本实验。
实验四
五、实验
题目:
当K1键按下后,首先使蜂鸣器响一声,然后使LED1-LED8完成3种闪亮的花样(自己定义),每一种花样循环3次,然后周而复始。
六、keil代码:
/_当K1键按下后,首先使蜂鸣器响一声,
然后使LED1-LED8完成3种闪亮的花样(自己定义),每一种花样循环3次,然后周而复始。
_/#includesbitP2=P2^0;//接蜂鸣器sbitP2_7=P2^7;sbitP1=P1^0;sbitP1_1=P1^1;sbitP1_2=P1^2;sbitP1_3=P1^3;sbitP1_4=P1^4;sbitP1_5=P1^5;sbitP1_6=P1^6;sbitP1_7=P1^7;
voidDELAY(inttime)//延时{while(time--){}}
voidBUZ_ON{if(P2_7==0)
{P2=1;}else{P2=0;}
}
voidF1(void){inti;chardata_group_mide[5]={00,0_18,0_24,0_42,0_81};//向两边延伸for(i=0;iP1=00;
}voidF2(void){inti;chardata_group_left[8]={0_FF,0_7F,0_3F,0F,07,03,01,00};//向左延伸for(i=0;iP1=00;
}voidF3(void){inti;chardate_group_right[8]={00,01,03,07,0f,0_3f,0_7f,0_ff};//向右延伸for(i=0;iP1=00;
}voidmain{
unsignedinti;//每种花样循环三次
P2=0;
P2_7=1;
BUZ_ON;
P1=00;while(P2_7==0)
{
for(i=0;i{F1;}
for(i=0;i{F2;}
for(i=0;i{F3;}
}
}
三、protues电路图:
四、实验截图:
五、实验小结:
通过本次实验,我们熟悉了protues的编译环境,对以后的单片机学习有很大帮助。
实验五
一、实验
题目:
程序启动后4位LED显示器滚动显示“-”,每按下1次K1键后,首先使蜂鸣器响一声。
然后,依次使LED滚动显示CNT的计数值(0-9)。
二、Keil代码:
/_程序启动后4位LED显示器滚动显示“-”,每按下才1次K1键后,首先使蜂鸣器响一声。
然后,依次使LED滚动显示CNT的计数值(0-9)。
1、按键K1采用中断来管理。
(INT0采用边沿触发)
2、中断服务程序完成四个功能:
1)消除按键K1抖动。
2)CNT计数。
3)查表将计数值转换成LED显示器的段代码。
4)将段代码分别放入4个显示缓冲单元。
_/#include#defineucharunsignedchar#defineuintunsignedintsbitP2_7=P2^7;sbitP3_3=P3^3;ucharCORDING[]={0_c0,0_f9,0_a4,0_b0,0_99,0_92,0_82,0_f8,0_80,0_90,0_c0,0_f9,0_a4,};//0,1,2,3,4.9,0,1,2的段码intdelayms(uintt){
uintn;while(--t){n=20__;while(--n);};return0;}
intmain{uintCNT=0;
P2_7=0;
P3_3=1;P1=0_F7;while
(1)
{if(P3_3==0)
{
uinti;
CNT++;
P2_7=1;delayms(100);for(i=1;i//4位
{
P1=CORDING[CNT-1];
switch(i)
{
//点亮第1位
//点亮第2位
//点亮第3位
//点亮第4位
delayms(100);
}
case
case
case
case}
P2=00;1:
P2=01;break;2:
P2=02;break;3:
P2=04;break;4:
P2=08;break;
//熄灭
if(CNT>10){
CNT=CNT-10;}
}
三、protues电路图:
P2_7=0;}return0;}
四、实验截图:
五、实验总结:
通过本次实验,我们熟悉了CNT计数,学会了如何使LED灯上显示0-9数字。
实验六
一、实验
题目:
两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,重新计数。
二、keil代码:
/_两个数码管,K1,K2两个按键,完成K1启动计数,K2暂停计数,每一秒钟数码管增加1,60秒钟后,数码管回归0,
重新计数。
按键K1,K2采用中断来管理。
(INT0采用边沿触发)_/#defineucharunsignedchar#defineuintunsignedint#includeucharCNT=0;uchar
m=0;sbitP3_7=P3^7;sbitP3_2=P3^2;sbitP0=P0^0;ucharCORDING[]={0_3F,06,0_5B,0_4F,0_66,0_6D,0_7D,07,0_7F,0_6F};//0,1,2,3,4.9的段码voidDelay(uinta){
while(--a){};
}voidintprocinterrupt0{
TR0=0;}
voidTime0interrupt1{
m++;
//中断一次,m加1
if(m==20){
m=0;
//中断次数清零CNT++;//秒加1if(CNT==60){CNT=0;}
P1=CORDING[CNT/10];//显示十位Delay(10);
P2=CORDING[CNT10];//显示个位Delay(10);
}}voidinit{
TMOD=01;
//使用定时器T0使用方式1TH0=0_3c;
TL0=0_b0;
ET0=1;TR0=1;E=1;IT0=1;EA=1;}
voidmain{
P1=0_3f;
P2=0_3f;
P3_7=1;while
(1)
{if(P3_7==0)//50ms中断一次//控制是否开启
{init;
}}
三、protues电路图:
}
四、实验截图:
五、实验总结:
本次实验,我们用到了中断,按键K1,K2采用中断来管理。
(INT0采用边沿触发),通过本次实验加强了中断的学习,更加有利于单片机的学习。
实验七
一、实验
题目:
晶振12MHz,波特率120__,程序启动后单片机主动发出HelloServer,PC使用串口助手应答单片机,单片机收到数据后,不做任何修改返回PC。
二、keil代码:
#include#defineucharunsignedchar#defineuintunsignedint
ucharcodetable[]="HELLOSERVER!
";uintflag=0;uchara,b;voidinit{
}
voidSendByte(ucharch){SBUF=ch;TMOD=0_20;TH1=0_FD;TL1=0_FD;SCON=0_50;TR1=1;EA=1;ES=1;
}while(!
TI);TI=0;voidSendString(ucharcode_str){
}
voidmain{
init;
SendString("HELLOSERVER!
");while
(1){
if(flag==1){
ES=0;SBUF=a;while(!
TI);TI=0;while(_str)SendByte(_str++);
}
}ES=1;flag=0;
}
voidserinterrupt4{
}
if(RI==1){
}RI=0;a=SBUF;flag=1;
三、protues电路图:
四、实验截图:
五
六、实验总结:
本次实验,我们利用了中断来实现,通过本次实验我们对中断有了更加深刻的了解,让我们在以后的为以后的学习之中打下了一定的基础。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告