单片机原理及其应用实验报告.doc_第1页
单片机原理及其应用实验报告.doc_第2页
单片机原理及其应用实验报告.doc_第3页
单片机原理及其应用实验报告.doc_第4页
单片机原理及其应用实验报告.doc_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

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

文档简介

北航单片机原理及其应用实验报告班级:110323姓名:赵敏杰学号:11031064同组者:郑硕学号:11031105实验一 单片机开发环境以及I/O 使用实验一实验目的1熟悉MCS-51 系列单片机开发软件的使用2掌握单片机I/O 口的使用3学习延时子程序的编写和使用二实验内容1验证性实验(1)实验内容:I/O 口做输出口,I/O 口接一个LED 发光二极管,使其闪烁。有关说明:根据 LED 的单向导通性,可以用单片机的P1.0(也可以是其他I/O 口)作为LED 的控制端。当P1.0 输出为低电平时,LED 灭,反之,LED 亮。本实验系统晶振为 11.0592MHz,则一个机器周期为12/11.0592us=1.085us,为方便编写延时函数,认为一个机器周期为1us。硬件连接:用导线将试验箱中的 P1.0 与L1 相连。程序:C 语言程序#include /89S52 寄存器定义头文件/*-延时子程序(有参函数),t=n*10ms-*/void delay(unsigned char n) unsigned char i,j,k;for(i=0;in;i+)for(j=0;j14;j+)for(k=0;k237;k+);/*-主函数-*/void main() while(1)P1_0=0; /P1.0 赋值为0,LED 灭delay(100); /调用延时子程序,t=100*10msP1_0=1; /P1.0 赋值为1,LED 亮delay(100);汇编语言程序ORG 00HAJMP START ;在首地址处放置跳转指令;以免主程序占用中断入口地址ORG 30HSTART:CLR P1.0 ;P1.0 赋值为0,LED 灭MOV R0,#100 ;R0 的值决定延时时间长短t=R0*10msLCALL DELAY ;调用延时函数SETB P1.0 ;P1.0 赋值为1,LED 亮MOV R0,#1003LCALL DELAY ;调用延时函数AJMP START ;无条件跳转至START,继续循环执行/*-延时子程序,t=R0*10ms-*/DELAY:D1:MOV R1,#20D2:MOV R2,#248DJNZ R2,$DJNZ R1,D2DJNZ R0,D1RETEND实验现象:可以看到 LED1 大致亮1s 后灭1s,如此循环。(2)实验内容:I/O 口做输入口,一个I/O 口接一个拨动开关,另一个I/O 口接一个LED发光二极管,单片机读取开关的状态并通过LED 显示出来。有关说明:P0 口是一组漏极开路型双向I/O 口,也即地址/数据总线复用口。对端口写“1”可作为高阻抗输入端用。硬件连接:用导线将试验箱中的 P1.0 与LED 发光二极管L1 相连,P0.0 与拨动开关K1相连。程序:C 语言程序#include /89S52 寄存器定义头文件void main()while(1) P0=0xff; /对端口写1,作为高阻抗输入端用if(P0_0) /判断P0.0 是否为高电平P1_0=0;else /如果P0.0 不是高电平,则执行后面的语句P1_0=1;汇编语言参考程序ORG 00HLJMP MAINORG 30HMAIN:JB P0.0,DEL ;识别按键是否闭合SETB P1.0LJMP MAINDEL:CLR P1.0LJMP MAINEND实验现象:可以看到 LED1 的状态和开关1 的状态一致。2.设计性实验实验内容:模拟舞台灯光控制实验具体要求:P0.0 和P0.1 口连接两路拨动开关,P1 口连接8 路LED。不同的开光状态控制LED 进行流水灯、闪烁等,从而达到模拟舞台炫耀灯光控制的目的。当 P0.1 和P0.0 的状态为00 时,8 路LED 从右至左流水点亮,具体循环顺序为:L1L2L3L4L5L6L7L8L1,如此重复循环;当P0.1 和P0.0的状态为01 时,8 路LED 从左至右流水点亮,具体循环顺序为:L8L7L6L5L4L3L2L1L8,如此重复循环;当P0.1 和P0.0 的状态为10 时,8 路LED 交替闪烁,具体循环顺序为:L1、L3、L5、L7L2、L4、L6、L8 L1、L3、L5、L7,如此重复循环下去;当P0.0 和P0.1 的状态为11 时,8 路LED 一起闪烁,具体循环顺序为:全灭全亮全灭,如此重复下去。硬件连接:用导线将实验箱中的P0.0 与开关K1 相连,P0.1 与开关K2 相连,P1.0P1.7 分别与LED 发光二极管L1L8 相连。程序:C 语言程序#include /89S52 寄存器定义头文件void delay(unsigned char n) unsigned char i,j,k;for(i=0;in;i+)for(j=0;j14;j+)for(k=0;k237;k+);void main() unsigned char i; P0=0xff; while(1)if(P0_1=0&P0_0=0) P1=0x01;for(i=1;i=8;i+)delay(100);P1=P11; if(P0_1!=0|P0_0!=0) break; if(P0_1=0&P0_0=1) P1=0x80;for(i=1;i1; if(P0_1!=0|P0_0!=1) break;if(P0_1=1&P0_0=0) P1=0x01;for(i=1;i=4;i+)delay(100);P1=P12; if(P0_1!=1|P0_0!=0) break; P1=0x02;for(i=1;i=4;i+)delay(100);P1=P12; if(P0_1!=1|P0_0!=0) break; if(P0_1=1&P0_0=1) P1=0xff; delay(100); P1=0x00; delay(100); if(P0_1!=1|P0_0!=1) break;三实验分析与感想本次实验的内容是单片机的开发环境以及I/O 的使用,主要要求我们熟悉MCS-51 系列单片机开发软件的使用,掌握单片机I/O 口和延时子程序的使用。第一次接触编写程序的软件有些不熟练,慢慢摸索之后逐渐掌握了编写和倒入单片机的过程,但是由于电脑串口的问题,经常出现串口被占用的情况,多次检查之后仍然不能排除错误,最后重启电脑之后可以继续完成实验,但一两次使用之后又出现串口的情况,十分奇怪,最近不得不换电脑才能完成实验。本次实验基本完成了老师要求的内容,但由于串口被占用的情况,被浪费太多时间,以至于最后一个实验没有完全完成,但整体思想及程序上已没有问题。第二次实验二 单片机中断及定时器使用实验一实验目的1学习外部中断技术的基本使用方法及中断处理的编程方法。2学习单片机定时器的基本使用方法及其编程方法。二实验内容1验证性实验(1)实验内容:外部中断的实验,8 路LED 做流水灯,当接收到外部中断后,LED 全部点亮一段时间,之后恢复到流水灯状态。有关说明:采用外部中断 0 负边沿产生中断信号,中断响应函数应尽量简洁。硬件连接:用导线将实验箱中的 P1.0P1.7 分别与LED 发光二极管L1L8 相连。INT0与负脉冲相连(硬件在实验箱的具体位置可以参照文档最后面的附图)。程序:C 语言程序# includeunsigned char STATE;unsigned char s0;/*-延时子程序(有参函数),t=n*10ms-*/void delay(unsigned char n) unsigned char i,j,k;for(i=0;in;i+)for(j=0;j14;j+)for(k=0;k237;k+);void main()EA=1; /CPU 开中断EX0=1; /开外部中断0IT0=1; /边沿触发方式s0=0x01;while(1) if(!STATE) /如果标志位STATE 为0,则做流水灯P1=s0;s0=s01;if(s0=0x00) s0=0x01;delay(30);else /如果标志位STATE 为1,则LED 全亮STATE=0;P1=0xff;delay(100);/*-中断服务函数-*/void int0() interrupt 0STATE=1; /标志位STATE 置1汇编语言程序ORG 0000HJMP START ;在首地址处放置跳转指令;以免主程序占用中断入口地址ORG 0003H ;外部中断0 程序入口地址JMP INTORG 0030HSTART:SETB EA ;CPU 开中断SETB EX0 ;开外部中断0SETB IT0 ;边沿触发方式MOV A,#01HCALL LOOPLOOP: MOV P1,AMOV R0,#30 ;R0 的值决定延时时间长短;t=R0*10msCALL DELAY ;调用延时函数RL A ;移位JMP LOOP ;无条件跳转至LOOP,继续循环执行/*-外部中断0 中断程序-*/INT: MOV B,#0FFHMOV P1,BMOV R0,#30CALL DELAYRETI/*-延时子程序,t=R0*10ms-*/DELAY:D1:MOV R1,#20D2:MOV R2,#248DJNZ R2,$DJNZ R1,D2DJNZ R0,D1RETEND实验现象:可以看到在没有中断的时候,8 路LED 从右至左流水点亮,当外部中断脉冲到来以后8 路LED 全部点亮一段时间,之后恢复流水点亮状态。(2)实验内容:定时器实验,8 路LED 所表示的二进制数每定时0.5s 增1。有关说明:实验箱单片机使用的晶振频率为 11.0592MHz,在计算定时器初值的时候要注意。在汇编语言中,数据长度只支持到8 位,因此在用定时器定时的时候要注意到这一点。硬件连接:用导线将实验箱中的 P1.0P1.7 分别与LED 发光二极管L1L8 相连。程序:C 语言程序# include int time;void main() TMOD=0x01; /定时器0 工作方式1TH0=64614/256; /计算初值TL0=64614%256;EA=1; /CPU 开中断ET0=1; /开定时器中断0TR0=1; /开启定时器0 并开始工作while(1); /等待中断/*-定时器0 中断服务函数-*/void time0() interrupt 1 time+; /每1ms,time 加1if(time=500) /time 加满500 次后,0.5s 时间到 time=0; /time 清零,重新计数P1+;TH0=64614/256; /重新装载定时器初值TL0=64614%256;汇编语言参考程序ORG 0000HJMP START ;在首地址处放置跳转指令;以免主程序占用中断入口地址ORG 000BH ;定时器0 程序入口地址JMP ET0PORG 0030HSTART:MOV TMOD,#01H ;定时器0,工作方式1MOV TH0,#4CH ;定时器装载初值,50ms 中断一次MOV TL0,#00H ;这里需要注意,前面的c 程序定时时间为;1ms,这里汇编定时时间为50ms,因为汇编;数据长度只支持到8 位,如果定时时间为1ms,;500ms 需要中断500 次,汇编无法支持,所以;定时时间改为50msSETB EA ;CPU 开中断SETB ET0 ;开定时器中断SETB TR0 ;定时器开始工作MOV A,#0AHCALL LOOPLOOP: CJNE A,#00H,LOOP ;A 不等于零,跳转LOOPINC B ;B 加1MOV P1,BMOV A,#0AHJMP LOOP ;/*-定时器0 中断程序-*/ET0P:DEC A ;A 减1MOV TH0,#4CHMOV TL0,#00HRETIEND实验现象:可以看到用 P1 口所接的8 路LED 表示的二进制数每隔0.5s 加1。2.设计性实验实验内容:模拟救护车优先的交通灯控制实验具体要求:具体要求为用两组不同颜色的LED 分别模仿两个路口的“红灯”、“绿灯”、“黄灯”。平时两组交通灯按规律点亮,具体规律为:南北路口:绿灯(5s)黄灯(2s)红灯(5s)黄灯(2s)绿灯(5s)东西路口:红灯(5s)黄灯(2s)绿灯(5s)黄灯(2s)红灯(5s)当救护车来时(用负脉冲触发外部中断表示救护车到来),两个路口马上都变成红灯让救护车优先通过,红灯保持3s,待救护车通过以后,两个路口的交通灯恢复正常的工作状态。实验中的交通灯点亮的时间需要用定时器精确定时,不能使用延时函数。硬件连接:INT0 与负脉冲相连,LED 与单片机的连接没有固定要求,下图只是提供一种参考接法。程序:# includeunsigned char STATE;unsigned char s0;/*-延时子程序(有参函数),t=n*10ms-*/void delay(unsigned char n) unsigned char i,j,k;for(i=0;in;i+)for(j=0;j14;j+)for(k=0;k237;k+);void main() EA=1; /CPU 开中断EX0=1; /开外部中断0IT0=1; /边沿触发方式s0=0x01;while(1) if(!STATE) /如果标志位STATE 为0,则做流水灯P1=s0;s0=s01;if(s0=0x00) s0=0x01;delay(30);else /如果标志位STATE 为1,则LED 全亮STATE=0;P1=0xff;delay(100);/*-中断服务函数-*/void int0() interrupt 0STATE=1 ; /标志位STATE 置1# include int time,i;unsigned char STATE;unsigned char m;void delay(unsigned char n)unsigned char i,j,k;for(i=0;in;i+)for(j=0;j14;j+)for(k=0;k237;k+);void main() TMOD=0x01; /定时器0 工作方式1TH0=64614/256; /计算初值TL0=64614%256;EA=1; /CPU 开中断ET0=1; /开定时器中断0TR0=1; /开启定时器0 并开始工作EX0=1; /开外部中断0IT0=1; /边沿触发方式while(1);/*-定时器0 中断服务函数-*/void time0() interrupt 1 time+; /每1ms,time 加1if(time=5000&time=7000&time=12000&time14000) time=0; TH0=64614/256; /重新装载定时器初值TL0=64614%256;void int0() interrupt 0 P1=0x24;ET1=1;TR1=1;TH1=64614/256; /重新装载定时器初值TL1=64614%256;while(m=3000);ET1=0;TR1=0; void t1() interrupt 3m+;TH1=64614/256; /重新装载定时器初值TL1=64614%256;三实验分析与感想本次实验是单片机中断及定时器使用实验,要求我们学习外部中断技术的基本使用方法及中断处理的编程方法,学习单片机定时器的基本使用方法及其编程方法。前两个小实验都比较顺利,分别利用了中断和定时器的功能。只要注意一下实验使用的LED灯是共阳的还是共阴的,应该就可以较顺利完成。第三个设计性实验综合了前两个实验的内容,而且要求中出现了三个时间,但是51单片机没有三个定时器,故要利用软件的辅助才能完成。但是始终没有结果,调试将近半节课还是不行,在老师的帮助下再次调试,发现单片机出现了问题。这让我领悟到:出现问题不要一味埋头找程序错误或者硬件连接错误,应该灵活的判断器件是否出现了故障。这会让我们节约很多时间,少走一些弯路。实验三 单片机串口使用实验一实验目的1学习单片机与上位机串行通信的基本使用方法。2学习动态数码管显示的基本使用方法。二实验内容1验证性实验(1)实验内容:单片机串行接收数据实验:6 位数码管通过动态扫描作为显示模块,上位机通过串口调试助手以十六进制形式向单片机发送00-ff范围内的数据,波特率为9600,单片机接收到数据以后,在数码管的最后两位显示出来,数码管其它位熄灭。有关说明:LED 数码管显示是单片机应用系统中最常用、最基本的输出设备,用户可以利用显示器件显示各种需要输出的视觉信息,实现人机对话。单片机对数码管的显示方式可分为静态显示与动态显示两种。静态显示中每一个数码管需要一个独立的输出口控制,静态显示的特点是显示程序简单、亮度高、稳定性好、占用CPU 时间少,但占用的I/O 口较多,所以静态显示常用在显示器数目较少的应用系统中。当显示位数较多时,可以采用动态显示。动态显示是指数码管轮流地显示各自的字符,每位数码管都在显示和熄灭两个状态中循环,同一时间只有一位数码管处于显示状态。动态显示的特点是线路简单、硬件成本相对较低,但需要不断刷新、扫描I/O 口,占用CPU 时间较多。动态数码管控制原理:采用各位数码管循环轮流显示的方法,当循环显示频率较高时,由于人眼的暂留特性,看不出闪烁显示现象,这种显示需要一个接口完成字型码的输出(字形选择),另一接口完成各数码管的轮流点亮(数位选择)。AT89S52 有UART 可编程的全双工串行口用于串行通信,由TXD 发送数据,RXD 接收外部输入的数据。具有两个缓冲器SBUF,一个作发送缓冲器,另一个作接收缓冲器,它们拥有相同的名字和地址空间,但不会出现冲突,因为一个只能读出数据,一个只能写入数据。硬件连接:首先将实验箱上的 LD0LD5 与S0S5 之间的短路冒全部拔去,ah 与B0B3、A0A3 之间的短路帽也全部拔去,将短路帽插到双排插针中的一根针上,防止丢失,做完实验再重新插回去。之后将LD0LD5 与P2_0P2_5 用导线相连,ah 与P1_0P1_7 用导线相连,最后还需要将串口插到电脑上,串口线的另一端与实验箱的J13 相连,注意引脚排列顺序。程序:C 语言程序#include#define uchar unsigned char /变量类型定义uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /七段码0-70x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00;/七段码8-f,最后一码0x00 作用为熄灭数码管uchar segment6 ; /段选uchar byte6 ; /位选uchar play6=0,0,0,0,0,0 ; /要显示的数字uchar k;uchar d;void Display_Init(); /数码管显示初始化void Uart_Init(); /串口初始化void Display(); /数码管显示函数/*-数码管显示初始化-*/void Display_Init() /初始化,通过定时器,按固定频率扫描数码管TMOD = TMOD|0x01; /定时器0,工作方式1TH0 = 0xfc; /计算初值,定时时间为1msTL0 = 0x66;EA = 1; /CPU 开中断ET0 = 1; /开定时器中断0TR0 = 1; /开启定时器0 并开始工作5/*-串口初始化-*/void Uart_Init()TMOD = TMOD|0x20; /定时器1,工作方式2TH1 = 0xfd; /波特率为9600TL1 = 0xfd;SCON = 0x50; /设置定时器工作方式PCON = 0;EA = 1; /CPU 开中断ES = 1; /允许串口中断TR1 = 1; /定时器1 开始工作/*-扫描数码管数据显示函数-*/void Display()uchar n=0 ;uchar m=0x01;for(n=0;n0x0f)segmentn=0x10; /显示的数据大于0x0f,则该位熄灭elsesegmentn=playn;byten=m;m = m1;/*-主函数-*/void main (void)Uart_Init() ;Display_Init();play0=0x00;play1=0x00;play2=0xff;play3=0xff;play4=0xff;play5=0xff;while(1)6Display() ;/*-定时器0 中断服务函数-*/void time0() interrupt 1P1 = tablesegmentk;P2 = bytek;k+;if(k=6)k=0;TH0=0xfc; /重新装载初值TL0=0x66;void uart() interrupt 4if(RI) /接收标志位d = SBUF; /读取串口发来的数据play1 = d/0x10;play0 = d%0x10;RI=0; /清除接收标志位实验现象:单片机复位以后,最后两位数码管显示00,其它位数码管则熄灭,当上位机通过串口发送数据时,数码管的后两位显示数据。(2)实验内容:单片机串行发送数据实验,波特率为 9600,外部中断INT0 与负脉冲相连,对脉冲个数进行计数,将计数结果以字符形式通过串口发送到上位机。上位机通过串口调试助手以字符形式显示计数结果。有关说明:以字符形式发送不同于十六进制形式发送,发送计数结果时,百位、十位、个位要分别发送,发送的时候要转换成对应的ASCII 码。硬件连接:用导线将实验箱中负脉冲与外部中断 INT0 相连。程序:C 语言程序#include#define uchar unsigned char /变量类型定义uchar d ;uchar SENT ;void Int0_Init();void Uart_Init(); /串口初始化void Int0_Init()EA=1; /CPU 开中断EX0=1; /开外部中断0IT0=1; /边沿触发方式/*-串口初始化-*/void Uart_Init()TMOD = 0x20; /定时器1,工作方式2TH1 = 0xfd; /波特率为9600TL1 = 0xfd;SCON = 0x50; /设置定时器工作方式PCON = 0;TR1 = 1; /定时器1 开始工作/*-主函数-*/void main (void)Int0_Init() ;Uart_Init() ;while(1)if(SENT=1)SBUF=(d/100+0x30);while(TI=0) ;TI=0;SBUF=(d%100/10+0x30);while(TI=0) ;TI=0;8SBUF=(d%10+0x30);while(TI=0) ;TI=0;SBUF= ;while(TI=0) ;TI=0;EX0=1; /重新开外部中断SENT=0;/*-定时器0 中断服务函数-*/void Int0() interrupt 0d+;if(d=0xff) d=0;SENT=1;EX0=0; /关外部中断,防止按键抖动引起干扰实验现象:每按一下脉冲按钮,串口调试助手接收到的计数值增 1。2.设计性实验实验内容:模拟上位机控制云台实验具体要求:监控行业通信协议应用最广的协议就是美国PELCO-P、PELCO-D 协议, PELCO主控与前端解码器是通过RS422RS485 通信格式传输,PELCO 协议内容包括云台控制命令,摄像机控制命令,辅助控制命令,预置位设置和调用命令。现在我们通过用RS232 通信格式传输命令,模拟控制云台,云台控制协议选用PELCO-D协议。PELCO-D 协议数据格式: 1 位起始位、 8 位数据、 1 位停止位,无效验位。波特率:2400B/S命令格式如下:1. 该协议中所有数值都为十六进制数2. 同步字节始终为 FFH3. 地址码为云台的逻辑地址号,地址范围: 00H FFH4. 指令码表示不同的动作5. 数据码 1 、 2 分别表示水平、垂直方向速度( 00-3FH ) ,FFH 表示“ turbo ” 速度6. 校验码 =(字节 2 + 字节 3 + 字节 4 + 字节 5 + 字节 6 )/100H本次实验的具体要求为根据云台控制的PELCO-D 通讯协议,上位机通过串口调试软件以PELCO-D 的格式向下发送指令,发送指令应以十六进制格式发送。由于是模拟云台控制,所以只需要模拟其中几条常用的命令,命令具体如下:云台向上运动:0xff,0x01,0x00,0x08,0x00,0xff,0x08,云台向下运动:0xff,0x01,0x00,0x10,0x00,0xff,0x10,云台向左运动:0xff,0x01,0x00,0x04,0xff,0x00,0x04,云台向右运动:0xff,0x01,0x00,0x02,0xff,0x00,0x02,通过串口调试助手发送的时候只需以16 进制形式连续发送以下字符就可以了:上:ff01000800ff08下:ff01001000ff10左:ff010004ff0004右:ff010002ff0002单片机对接收到的命令进行解析,如果是以上四条命令中的一条,则单片机通过用最低位数码管对应显示A、B、C、D,其它位数码管熄灭,如果接收到的命令不符合上面四条命令,则单片机向上位机发送“e”代表error 的意思,同时用数码管最低位显示字母E。硬件连接:硬件连接与验证性实验的第一个实验的连线相同。程序:#include #include /储存器分配宏定义#define DAT XBYTE0x1B30 /数据口地址#define COM XBYTE0x1B31 /命令/状态口地址#define uchar unsigned char /变量类型定义 uchar code table=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, /七段码 0-7 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00; /七段码 8-f,最后一码 0x00 作用为熄灭数码管 uchar code a7=0xff,0x01,0x00,0x08,0x00,0xff,0x08;uchar code b7=0xff,0x01,0x00,0x10,0x00,0xff,0x10;uchar code c7=0xff,0x01,0x00,0x04,0xff,0x00,0x04;uchar code d7=0xff,0x01,0x00,0x02,0xff,0x00,0x02;uchar e7=0,0,0,0,0,0,0;uchar k; uchar x; void Uart_Init(); /串口初始化 void Init8279(); /8279初始化void Display(uchar a); /数码管显示函数 /*-串口初始化-*/ void Uart_Init() TMOD = TMOD|0x20; /定时器 1,工作方式 2 TH1 = 0xf4; /波特率为 2400 TL1 = 0xf4; SCON = 0x50; /设置定时器工作方式 PCON = 0; EA = 1; /CPU 开中断 ES = 1; /允许串口中断 TR1 = 1; /定时器 1 开始工作 /*8279 初始化函数*/void Init8279(void) uchar reg1; COM=0xd1; /11010001B,总清除命令 do reg1=COM;/读状态字,DU=1时,表示清除命令正在执行 while(reg1&0x80); /10000000B,等待清除结束,DU=0,相与为0,清除结束 COM=0; /00000000B,设置8279工作方式,8位字符,左端输入 /编码键盘扫描,两键封锁 COM=0x32; /00110010B,时钟频率18分频10010B=18D/*数码管显示函数*/void Display(uchar a) uchar rowdata; /行数寄存器 uchar linedata;/列数寄存器 uchar b; a=a&0x3f; /00111111B,屏蔽高两位数 /键的编码格式CNTL SHIFT 扫描行序号(3位)(硬件的列号),回馈线列信号(3位)(硬件的行号) linedata=a&0x07; /获得列数值,00000111B; rowdata=a&0x38;/获得行数值,00111000B; rowdata=(rowdata3);/变量的第三位表示行号与列号 b=0x85; COM=b;/向控制口写显示RAM命令,10000000B,AI=0(不自增),写到RAM中16个地址中的0号地址;A4A3A2A1=01010000(6个地址) if(rowdata=1) /行数为1的代码为07,其列数也为07 DAT=tablelinedata; /把07写到数据口 else if(rowdata=0)/行数为0的代码为8,9,af,其列号为07 DAT=tablelinedata+8;/把8,9,af写到数据口 else /行数为2的代码为GMPRWXYS,其列号为07 ; /不执行操作 /*-主函数-*/ void main (void) Uart_Init() ; Init8279(); IT0=1; /外部中断0下降沿触发 EX0=1; /开外部中断0 EA=1; /打开中断总开关 while(1) /*键盘中断服务程序*/void KeyIn() interrupt 0 uchar keydata; /定义键盘数据寄存器 COM=0x40; /01000000B,读FIFO RAM命令,AI=0,从堆栈顶读键值 keydata=DAT; /读取键盘数据 Display(keydata); /调用显示函数 void uart() interrupt 4 int i; if(RI) /接收标志位 x = SBUF; /读取串口发来的数据 ei=x; i+; if(i=7) i=0; e6=(e1+e2+e3+e4+e5)/256;if(e6=a6)Display(10);else if(e6=b6)Display(11);else if(e6=c6)Display(12);else if(e6=d6)Display(13);/*if(e0=a0&e1=a1&e2=a2&e3=a3&e4=a4&e5=a5&e6=a6)Display(10);else if(e0=b0&e1=b1&e2=b2&e3=b3&e4=b4&e5=b5&e6=b6)Display(11);else if(e0=c0&e1=c1&e2=c2&e3=c3&e4=c4&e5=c5&e6=c6)Display(12);else if(e0=d0&e1=d1&e2=d2&e3=d3&e4=d4&e5=d5&e6=d6)Display(13);*/elseDisplay(14);SBUF=(69);/e的ASCII码 while(TI=0) ; TI=0; RI=0; /清除接收标志位 三实验分析与感想本次实验是单片机串口使用实验,要求我们学习单片机与上位机串行通信的基本使用方法,学习动态数码管显示的基本使用方法。由于第一次使用串口通信,实验过程中遇到了很多问题,经过反复研究和修改最终完成实验。在验证性实验中我们也按照实验的具体步骤操作并且得到了预期的结果。这次的设计性试验是模拟上位机控制云台实验。这个设计性试验比较复杂,我们研究和尝试了好久,才完成程序的编写,很庆幸我们最后完成了实验,我们设计的程序,基本满足了题目中的协议中所有数值都为十六进制数、同步字节始终为 FFH、地址码为云台的逻辑地址号以及指令码表示不同的动作等要求。通过这次的试验,我们对程序的编写有了更进一步的认识,熟练度也大大提高。实验四 单片机扩展模数转换器实验一实验目的1掌握A/D 转换与单片机的接口方法。2了解A/D 芯片ADC0809 转换性能及编程方法。3通过实验了解单片机如何进行数据采集二实验内容1验证性实验(1)实验内容:单片机模数转换实验,利用实验台上的ADC0809 做A/D 转换器,实验台上的电位器提供模拟量输入,编制程序,将模拟量转换成数字量,把数字量转换为电压值,并把电压以字符形式通过串口上传到PC 机上,PC 机端以串口助手接收。有关说明:A/D 转换器用于实现模拟量到数字量的转换,按转换原理可分为4 种:计数式A/D 转换器、双积分式A/D 转换器、逐次逼近式A/D 转换器和并行式A/D 转换器。目前最常用的是双积分式和逐次逼近式。双积分式A/D 转换器的主要优点是转换精度高,抗干扰性能好,价格便宜,但转换速度较慢,因此这种转换器主要用于速度要求不高的场合。逐次逼近式A/D 转换器是一种速度较快精度较高的转换器,其转换时间大约在几微妙到几百毫秒之间。ADC0809 是8 位逐次逼近型A/D 转换器,带8 个模拟量输入通道,芯片内带通道地址译码锁存器,输出带三态数据锁存器,启动信号为脉冲启动方式,可实现8 路模拟信号的分时采集,每一通道的转换时间大约100us。ADC0809 进行完一次转换以后采用中断方式,此时0809 的EOC 信号需要经过反相器才能产生负脉冲。例程硬件连接说明:如图 1 所示,0809 片选端CS5 接2027,EOC 接INT01(注意INT01的位置,INT01 经过反相器与单片机的INT0 相连);P1.0P1.7 接发光二极管L1L8,10K 电位器中间头接IN0,另外两个头一端接+5V,另一端接地。程序:C 语言程序#include#include#define uchar unsigned char /变量类型定义uchar IN; /模拟量输入通道#define DAT XBYTE0x1B20+IN /数据口地址void Int0_Init();void Int0_Init()EA=1; /CPU 开中断EX0=1; /开外部中断0IT0=1; /边沿触发方式void main()Int0_Init();IN=0; /设置模拟量输入通道为0DAT=0x00; /任意写一个数,开始A/D 转换while(1);void Int0() interrupt 0P1=DAT; /读取转换结果并显示DAT=0x00; /开始下一次转换实验现象:

温馨提示

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

评论

0/150

提交评论