单片机原理实验报告_第1页
单片机原理实验报告_第2页
单片机原理实验报告_第3页
单片机原理实验报告_第4页
单片机原理实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机原理实验报告实验一:仿真软件的使用以及跑马灯的设计实验目的掌握仿真软件的使用方法掌握MCS-51单片机的P0、P1、P2口的使用方法掌握实现发光二极管的移动、闪烁程序的编写方法实验仪器1、计算机一台。2、LJD-SY-5200实验系统一套。3、上位机端KeilC51编译系统。实验内容及要求1、掌握单片机仿真器的程序输入、调试和运行等方法。2、P2口作为输入口,接8个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地GND相连接。在没有按键被按下是P2的输入全为高电平,当有按键被按下时对应的P2的相应引脚被拉低,该引脚输入变成低电平。P0、P1作输出,接16个发光二极管,以P2口的值为点亮发光二极管的个数进行循环点亮实验线路:实验内容:实验程序(汇编):ORG0000H;初始化地址LJMPMAIN;进入程序MAIN: MOVA,P2;将P2口的状态送入A中MOVR0,#8;将数值8送入R0MOVR1,#8;将数值8送入R1LOOP3: MOVP0,A;跑马灯循环开始处,并将A的数值送入P0口LCALLDELAY;亮灯延时RLA;将A中数值左移一位,即点亮下一个灯DJNZR0,LOOP3;若A中数值不等于8(即没完成一次循环)继续循环MOVP0,#0FFH;P0循环完成,将其全部熄灭MOVA,#0FEH;将使第一个灯点亮的值送入A中LOOP4: MOVP1,A;将A的数值送入P1口,开始循环第二排的灯LCALLDELAY;亮灯延时RLA;将A中数值左移一位,即点亮下一个灯DJNZR1,LOOP4;若A中数值不等于8(即没完成一次循环)继续循环MOVP1,#0FFH;P1循环完成,将其全部熄灭LJMPMAIN;进入下一个总循环DELAY: MOVR5,#200;延时程序,借用R5,R4寄存器产生延时LOOP2: MOVR4,#200LOOP1: NOPDJNZR4,LOOP1DJNZR5,LOOP2RETEND实验流程图:开始开始初始化PA口初始化PA口点亮发光二极管点亮发光二极管调用延时调用延时PA口数据循环左移一位PA口数据循环左移一位循环结束?循环结束?NY结束结束实验二定时器及计数器的应用实验目的:一、熟悉8051的T0作为定时器的设置及使用方法二、掌握T0作为计数器的软件设计方法。三、掌握单脉冲发生电路的硬件线路连接方式。实验内容及要求:一、在液晶屏上显示定时、计数结果1、利用定时器T0进行计时,并把计时结果通过液晶屏显示出来。以每秒为单位显示。2、把T0作为计数器对T0引脚的输入脉冲进行计数,并通过液晶显示屏显示T0计数结果。3、我们给出液晶屏显示程序,同学自己用编写T0定时器程序(中断部分程序)及由T0引脚输入的外部脉冲进行计数的计数器程序(汇编或C语言均可)。将定时或计数结果付给液晶屏显示程序中的count即可显示。实验线路:二、利用定时器T0控制八个发光二极管1、利用定时器T0进行计时,在程序运行2s后首先使得发光二极管顺序循环点亮三次,随后使用定时器T0使得发光二极管奇数位和偶数位循环点亮三次,并循环显示。以500ms为单位显示。2、把T0作为计数器对T0引脚的输入脉冲进行计数,使用P2口中的一位作为输入口,接1个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地GND相连接。在没有按键被按下时P2的输入为高电平,当有按键被按下时对应的P2的相应引脚被拉低,该引脚输入变成低电平。当按键次数达到3的整数倍时点亮P1口的一个发光二极管。实验步骤:一、进行实验线路连接。将串口线一端与计算机串口相连另一端与LJD-SY-5200实验系统上的串口相连接。二、将仿真监控芯片正确(注意方向,谨防插反)地插到实验系统的CPU插座上。三、取下JP5、JP6,其他的跳线连接方式采用默认的即可。四、编写源程序添加进去,进行调试。实验说明:一、CH451芯片的时钟和数据线用的分别是单片机的T0,T1引脚,所以请不要再尝试使用数码管去显示T0计数的结果。二、T1的实验方法同T0,只是单脉冲发生电路的左边的插孔需要和T1而不是T0连接起来。三、完成本次实验后请取下两根直连导线。实验内容及要求:一、在液晶屏上显示定时、计数结果1、利用定时器T0进行计时,并把计时结果通过液晶屏显示出来。以每秒为单位显示。实验程序1.1/********************************************************************************T0定时器的应用中液晶屏显示部分(count为要显示的内容)******************************************************************************/#include<reg52.h>#include<absacc.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;#defineW_C_GLCDXBYTE[0xcfff]#defineW_D_GLCDXBYTE[0xdfff]#defineR_B_GLCDXBYTE[0xefff]#defineR_D_GLCDXBYTE[0xffff]voidcommand_GLCD(ucharord);voidinitial_GLCD(void);voidwrite_GLCD(uchardat);voidchkbusy_GLCD();voiddelay(void);ucharpdatadisp_num[10]="0123456789";ucharpdatadisp_hz[12]="T0计时:XXXXS";sbitACC7=ACC^7;sbitbflag=ACC^7;ucharflag_count;uintcount;/********************************************************************函数名:initial_GLCD()功能:对12232液晶显示屏进行初始化说明:调用:入口参数:出口参数:***********************************************************************/voidinitial_GLCD(){command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x06);/*显示器控制:游标不显示*/delay();command_GLCD(0x01);/*清屏幕*/delay();command_GLCD(0x0c);/*进入模式设定*/delay();}/********************************************************************函数名:conmmand_GLCD(ucharord)功能:写命令到12232说明:调用:入口参数:ucharord出口参数:***********************************************************************/voidcommand_GLCD(ucharord){chkbusy_GLCD();W_C_GLCD=ord;}/********************************************************************函数名:write_GLCD(uchardat)功能:写数据到12232说明:调用:入口参数:uchardat出口参数:***********************************************************************/voidwrite_GLCD(uchardat){chkbusy_GLCD();W_D_GLCD=dat;}voidchkbusy_GLCD(){do{ACC=R_B_GLCD;}while(bflag==1);}/********************************************************************函数名:delay()功能:延时25us说明:调用:入口参数:出口参数:***********************************************************************/voiddelay(){uchari;for(i=0;i<25;i++){;}}/********************************************************************函数名:delay1()功能:延时mus说明:调用:入口参数:出口参数:***********************************************************************/voiddelay1(uintm){while(m--);}main(){uchari,j;flag_count=0;count=0; j=0;TMOD=0x51;/*设置T0的工作方式为16位定时器*/TL0=(65536-10000)%256;/*给T0赋值,使其定时时间为10ms*/TH0=(65536-10000)/256;TR0=1;/*T0开始工作*/initial_GLCD();/*清屏*/while(1){ if(TF0==1)/*若溢出,说明定时已经到了10ms*/ { if(j<100)/*若总定时还未满1s*/ { TF0=0;/*重置TF0*/ TH0=(65536-10000)/256;/*重置T0*/ TL0=(65536-10000)%256; j++;/*继续累加j,直到1s*/ } Else/*总定时已经达到1s*/ { j=0;/*重置j*/ count++;/*显示当前已定时时间*/ } }command_GLCD(0x80);for(i=0;i<7;i++){write_GLCD(disp_hz[i]);}write_GLCD(disp_num[count/1000]);/*显示定时结果的千位*/write_GLCD(disp_num[count%1000/100]);/*显示定时结果的百位*/write_GLCD(disp_num[count%1000%100/10]);/*显示定时结果的十位*/write_GLCD(disp_num[count%1000%100%10]);/*显示定时结果的个位*/write_GLCD(disp_hz[11]);delay1(1000);}}实验流程图:开始开始初始化初始化T0为10ms是否溢出是否溢出?NYj<100?j<100?初始化初始化T0为10msTF=0;j++`NYj=0;count++j=0;count++显示定时结果显示定时结果2、把T0作为计数器对T0引脚的输入脉冲进行计数,并通过液晶显示屏显示T0计数结果。1.2/*******************************************************************************T0计数器的应用中液晶屏显示部分(count为要显示的内容)******************************************************************************/#include<reg52.h>#include<absacc.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;#defineW_C_GLCDXBYTE[0xcfff]#defineW_D_GLCDXBYTE[0xdfff]#defineR_B_GLCDXBYTE[0xefff]#defineR_D_GLCDXBYTE[0xffff]voidcommand_GLCD(ucharord);voidinitial_GLCD(void);voidwrite_GLCD(uchardat);voidchkbusy_GLCD();voiddelay(void);ucharpdatadisp_num[10]="0123456789";ucharpdatadisp_hz[11]="T0计数程序:";ucharcount;sbitACC7=ACC^7;sbitbflag=ACC^7;/********************************************************************函数名:initial_GLCD()功能:对12232液晶显示屏进行初始化说明:调用:入口参数:出口参数:***********************************************************************/voidinitial_GLCD(){command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x30);/*功能设定*/delay();command_GLCD(0x06);/*显示器控制:游标不显示*/delay();command_GLCD(0x01);/*清屏幕*/delay();command_GLCD(0x0c);/*进入模式设定*/delay();}/********************************************************************函数名:conmmand_GLCD(ucharord)功能:写命令到12232说明:调用:入口参数:ucharord出口参数:***********************************************************************/voidcommand_GLCD(ucharord){chkbusy_GLCD();W_C_GLCD=ord;}/********************************************************************函数名:write_GLCD(uchardat)功能:写数据到12232说明:调用:入口参数:uchardat出口参数:***********************************************************************/voidwrite_GLCD(uchardat){chkbusy_GLCD();W_D_GLCD=dat;}voidchkbusy_GLCD(){do{ACC=R_B_GLCD;}while(bflag==1);}/********************************************************************函数名:delay()功能:延时25us说明:调用:入口参数:出口参数:***********************************************************************/voiddelay(){uchari;for(i=0;i<25;i++){;}}/********************************************************************函数名:delay1()功能:延时mus说明:调用:入口参数:出口参数:***********************************************************************/voiddelay1(uintm){while(m--);}voidisr_t0(void)interrupt1{TH0=0xFF;/*给T0赋值,有一次外部脉冲输入则立即产生中断*/TL0=0xFF;count++;/*T0值已为FFH,若有外部脉冲输入,则产生中断使count++*/}main(){uchari;TMOD=0x05;/*设置T0的工作方式为16位计数器*/TH0=0xFF;/*给T0赋值,有一次外部脉冲输入则立即产生中断*/TL0=0xFF;EA=1;/*将总的中断允许开关打开*/ET0=1;/*将T0的中断允许开关打开*/TR0=1;/*开始计数*/initial_GLCD();/*清屏*/while(1){command_GLCD(0x80);for(i=0;i<11;i++){write_GLCD(disp_hz[i]);}write_GLCD(disp_num[count/100]);/*显示计数结果的百位*/write_GLCD(disp_num[count%100/10]);/*显示计数结果的十位*/write_GLCD(disp_num[count%100%10]);/*显示计数结果的个位*/delay1(1000);}}外部输入脉冲开始实验流程图:外部输入脉冲开始T0溢出,产生中断T0溢出,产生中断初始化T0重置T0,count++重置T0,count++以以count值显示计数结果二、利用定时器T0控制八个发光二极管1、利用定时器T0进行计时,在程序运行2s后首先使得发光二极管顺序循环点亮三次,随后使用定时器T0使得发光二极管奇数位和偶数位循环点亮三次,并循环显示。以100ms为单位显示。2.1#include<reg52.h>#include<intrins.h>intnum;charaa=0xfe; //11111110bvoidtimer0_init(){ TMOD=0X01;/*设置T0的工作方式为16位定时器*/ TH0=(65536-50000)/256;/*晶振为12MHz*/ TL0=(65536-50000)%256; /*定时为50ms*/ EA=1;/*开全局中断*/ ET0=1;/*开定时器0中断*/ TR0=1;/*启动定时器0*/}voidTimer0()interrupt1{ num++; if(num==341) { num=0; } TH0=(65536-500000)/256;/*晶振为12MHz*/ TL0=(65536-500000)%256; /*定时为50ms*/ switch(num)/*亮灯程序,间隔50ms*10=0.5s*/ { case40: P2=aa; //11111110 aa=_crol_(aa,1); //循环右移 break; case50: P2=aa; //11111101 aa=_crol_(aa,1); break; case60: P2=aa; //11111011 aa=_crol_(aa,1); break; case70: P2=aa; //11110111 aa=_crol_(aa,1); break; case80: //11101111 P2=aa; aa=_crol_(aa,1); break; case90: P2=aa; //11011111 aa=_crol_(aa,1); break; case100: P2=aa; //10111111 aa=_crol_(aa,1); break; case110: P2=aa; //01111111 aa=_crol_(aa,1); break; case120: P2=aa; //11111110 aa=_crol_(aa,1); break; case130: P2=aa; //11111101 aa=_crol_(aa,1); break; case140: P2=aa; //11111011 aa=_crol_(aa,1); break; case150: P2=aa; //11110111 aa=_crol_(aa,1); break; case160: P2=aa; //11101111 aa=_crol_(aa,1); break; case170: P2=aa; //11011111 aa=_crol_(aa,1); break; case180: P2=aa; //10111111 aa=_crol_(aa,1); break; case190: P2=aa; //01111111 aa=_crol_(aa,1); break; case200: P2=aa; //11111110 aa=_crol_(aa,1); break; case210: P2=aa; aa=_crol_(aa,1); break; case220: P2=aa; aa=_crol_(aa,1); break; case230: P2=aa; aa=_crol_(aa,1); break; case240: P2=aa; aa=_crol_(aa,1); break; case250: P2=aa; aa=_crol_(aa,1); break; case260: P2=aa; aa=_crol_(aa,1); break; case270: P2=aa; //01111111 aa=_crol_(aa,1);//三次完毕 break; case280: P2=0x55; //01010101 break; case290: P2=0xaa; //10101010 break; case300: P2=0x55; break; case310: P2=0xaa; break; case320: P2=0x55; break; case330: P2=0xaa; break; case340: num=39; //两秒后继续开始 break; }}voidmain(){ timer0_init(); while(1);}2、把T0作为计数器对T0引脚的输入脉冲进行计数,使用P2口中的一位作为输入口,接1个按键。所有按键的一端接通过上拉电阻接至+5V电源,另一端和电源地GND相连接。在没有按键被按下时P2的输入为高电平,当有按键被按下时对应的P2的相应引脚被拉低,该引脚输入变成低电平。当按键次数达到3的整数倍时点亮P1口的一个发光二极管。2.2 #include<reg52.h>#include<absacc.h>#include<intrins.h>sbitP0_3=P0^3;typedefunsignedcharuchar;typedefunsignedintuint;unsignedintcount=0;/********************************************************************函数名:delay1()功能:延时mus说明:调用:入口参数:出口参数:***********************************************************************/voiddelay1(uintm){while(m--);}voidmain(){while(1){TMOD=0x05;/*设置T0工作模式为16位计数器*/TH0=0xFF;/*T0初值设置*/TL0=0xFF;ET0=1;/*开启T0中断*/EA=1;/*开启总中断*/TR0=1;/*开启T0*/if(count==5){P0_3=0;count=0;while(count==0){delay1(1000);};};else{P0_3=1;};}}voidtime0()interrupt1{count++;TH0=0xff;/*T0初值设置*/TL0=0xff;}Count++;初始化TO产生中断外部输入脉冲(按键)亮灯;初始化count灭灯是否按了5次初始化TO开始实验流程图:Count++;初始化TO产生中断外部输入脉冲(按键)亮灯;初始化count灭灯是否按了5次初始化TO开始NY实验三模拟/数字(A/D,TLC549)实验实验目的一、了解8位串行输出A/D转换器TLC549的工作原理。二、掌握TLC549的硬件线路连接方式。三、掌握A/D转换器TLC549的编程方法。实验内容及要求一、仔细阅读TLC549的数据手册。二、仔细阅读CH451的应用手册。三、编写程序把A/D转换器的转换结果通过数码管显示出来。实验线路:实验步骤:一、进行实验线路连接。将串口线一端与计算机串口相连另一端与LJD-SY-5200实验系统上的串口相连接。二、将仿真监控芯片正确(注意方向,谨防插反)地插到实验系统的CPU插座上。三、在跳线器JP5、JP6上插上跳线冒。四、取下跳线器JP4、JP7、JP8上的跳线冒。五、编译、下载程序至仿真监控芯片,六、调节模拟转换参考电压(即电位器W2),观察数码管上数值的变化情况。实验程序:#include<reg52.h>#include<absacc.h>#include<intrins.h>typedefunsignedcharuchar;typedefunsignedintuint;sbitch451_din=P3^5;sbitch451_clk=P3^4;sbitch451_load=P1^2;sbitP1_4=P1^4;sbitP1_3=P1^3;sbittlc549_clk=P1^1;sbittlc549_d0 =P1^0;sbittlc549_cs=P1^5;inti=0;/*须主程序定义的参数*/#defineCH451_DIG00x0800/*数码管位0显示*/#defineCH451_DIG10x0900/*数码管位1显示*/#defineCH451_DIG20x0a00/*数码管位2显示*/#defineCH451_DIG30x0b00/*数码管位3显示*/#defineCH451_DIG40x0c00/*数码管位4显示*/#defineCH451_DIG50x0d00 /*数码管位5显示*/ #defineCH451_DIG60x0e00 /*数码管位6显示*/ #defineCH451_DIG70x0f00/*数码管位7显示*/voiddelay(uintus){while(us--);}/**//********************************************************************函数名:ch451_init()功能:对ch451芯片进行初始化说明:调用:入口参数:返回值:设计:蓝海微芯***********************************************************************/voidch451_init(void){ch451_din=0;/*先低后高,选择4线输入*/ch451_din=1; ch451_load=1;ch451_clk=1;_nop_();}/********************************************************************函数名:ch451_write()功能:把12位的指令或数据写入ch451说明:12位数据或指令的写入顺序是低位调用:入口参数:command返回值:设计:蓝海微芯***********************************************************************/voidch451_write(unsignedintcommand){unsignedchari; ch451_load=0; /*命令开始*/for(i=0;i<12;i++){ /*送入12位数据,低位在前*/ch451_din=command&1; ch451_clk=0;command>>=1;ch451_clk=1; /*上升沿有效*/}ch451_load=1; /*加载数据*/}/********************************************************************函数名:disp_ad()功能:把A/D转换结果通过数码管进行显示说明:调用:入口参数:command返回值:设计:蓝海微芯***********************************************************************/voiddisp_ad(uintadc_result){ucharA;ucharB;ucharC;ucharD;A=adc_result/1000;B=adc_result%1000/100;C=adc_result%1000%100/10;D=adc_result%1000%100%10

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论