单片机课程报告.doc_第1页
单片机课程报告.doc_第2页
单片机课程报告.doc_第3页
单片机课程报告.doc_第4页
单片机课程报告.doc_第5页
免费预览已结束,剩余23页可下载查看

下载本文档

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

文档简介

中 南 大 学微控制器技术实验报告年 级: 大 三 学 号: * 姓 名: * 专业班级: 自动化0706 指导老师: * 二零一零年五月第1章 实验目的及要求1、 学习Keil C51集成开发工具的操作及调试程序的方法,包括:仿真调试与脱机运行间的切换方法;2、 熟悉TD-51单片机系统板及实验系统的结构及使用;3、 进行MCS51单片机指令系统软件编程设计与硬件接口功能设计;4、 学习并掌握Keil C51与Proteus仿真软件联机进行单片机接口电路的设计与编程调试;5、 完成指定MCS51单片机综合设计题。第2章 实验内容本实验分为软件与硬件两大部分,软件部分只需要尽心软件编程调试即可,硬件部分既可以利用实验室提供的设备器材进行联机调试,也可以应用虚拟软件若Proteus进行模拟仿真。要求做实验前需进行充分的准备,软件部分先写好程序、硬件部分编号线路图,或者用虚拟软件运行成功后在到实验室利用单片机等设备进行在线调试运行。第3章 软、硬件环境软件环境:KEIL uv3,PROTEUS7.4硬件环境:PC机,TD-51系统板第4章 软件编程设计实验4.1 实验内容实验一清零程序与拆字程序设计 根据实验指导书之“第二章 单片机原理实验”(P17P23页)内容,熟悉实验环境及方法,清零程序:把 7000H 7FFFH 的内容清零。实验二拼字程序与数据传送程序设计1、 折字程序:把 7000H 的内容拆开,高位送 7001H 低位,低位送 7002H 低位。7001H,7002H高位清零。2、 拼字程序:把 7000H,7001H 的低位相拼后送人 7002H,一般本程序用于把显示缓冲区的 数据取出拼装成个字节。3、 数据传输子程序:把(R2,R3)源 RAM 区首址内的(R6,R7)个字节数据,传送到(R4,R5) 目的 RAM 区。实验三排序程序与散转程序设计1、 编写并调试一个排序子程序,其功能为用冒泡法将内部 RAM 中几个单元字节无符号的正整数,按从小到大的次序重新排列。2、 编写散转程序,根据 8032 片内 20H 中的内容(00 或 01 或 02 或 03)进行散转。4.2 实验程序流程图及算法1、 清零程序清单:ORG0000HSTART:MOVR0,#00HMOVR1,#10H ;循环次数MOVDPTR,#7000H D0:MOVA,#00HMOVXDPTR,A ;清零 INCDPTR ;地址加一INCR0CJNER0,#00H,D0DJNZR1,D0END 图4-1清零程序流程图为了验证程序的结果,可以将清零先改成置一,这样就可以看这个程序是否正确。2. 折字程序:拆字流程图如图二所示:ORG0000HLJMPMAINORG0100HMAIN:MOVDPTR,#7000HMOVA,#33H ;7000H中送33HMOVXDPTR,A MOVXA,DPTRSWAPAANLA,#0FH;屏蔽高四位MOVDPTR,#7001HMOVXDPTR,A;送7000H高位至7001HMOVA,#01HMOVDPTR,#7000H图4-2拆字程序流程图MOVXA,DPTRANLA,#0FHMOVDPTR,#7002H ;送7000H低位至7002HMOVXDPTR,AEND3. 拼字程序:拆字程序流程图见右图4-3。程序清单:ORG0000HLJMPMAINORG0100HMOVDPTR,#7000HMOVA,#05HMOVXDPTR,A MOVXA,DPTRANLA,#0FHSWAPAMOVR0,AMOVDPTR,#7001HMOVA,#01HMOVXDPTR,AMOVXA,DPTRANLA,#0FH图4-3 拼字程序流程图ORLA,R0MOVDPTR,#7002HMOVXDPTR,AEND4数据传输子程序程序流程图见图4-4。图4-4数据传输指令 图4-5 散转指令流程图传输指令清单:;(R2,R3)-(R4,R5) ;(R6,R7)个字节;(R0,R1)作为计数值,与6、7相等时,传送完毕ORG0000HAJMPMAINMAIN:MOVR2,#1;设置各 初始值MOVR3,#2MOVR4,#1MOVR5,#2AHMOVR6,#0MOVR7,#6MOVR0,#00HMOVR1,#0;R0R1 计数初值CJNER6,#0,SCJNER7,#0,SLJMPES:MOVDPH,R2;源地址数据给AMOVDPL,R3MOVXA,DPTRINCDPTRMOVR2,DPHMOVR3,DPLMOVDPH,R4;A给目的地址MOVDPL,R5MOVXDPTR,AINCDPTRMOVR4,DPHMOVR5,DPLMOVDPH,R0;计数值R0R1+1MOVDPL,R1INCDPTRMOVR0,DPHMOVR1,DPLMOVA,R1 ;R1异或R7,若A=0,R1=R7XRLA,R7JNZSMOVA,R0XRLA,R6;若R1=r7且R0=R6,传送完毕JNZSE:END5 散装程序流程图见图4-5。程序清单ORG0000HLJMPMAINORG0100HMAIN:MOVA,20HRLAADDA,20HMOVDPTR,#TABLEJMPA+DPTRTABLE:LJMPPM0 ;散转入口LJMPPM1LJMPPM2LJMPPM3PM0: MOVR0,#00H ; 子程序0MOVR3,#10HMOVR1,#30H L1:MOVA,R0MOVR1,AINCR0INCR1DJNZR3,L1LJMPEXIT PM1:MOVDPTR,#7000H ; 子程序1MOVA,#33HMOVXDPTR,AMOVXA,DPTRINCDPTRMOVR0,AANLA,#0FHMOVX DPTR,AMOVA,R0SWAPAANLA,#0FHINCDPTRMOVXDPTR,ALJMP EXITPM2: MOV11H,#0FH ; 子程序2 AJMPEXITPM3:MOV12H,#0FEH ; 子程序3AJMPEXITEXIT:NOPEND6 冒泡程序流程图件图4-6程序清单:;冒泡法排序;(R0)为数据开始地址指针(R1)为数据块字节数;实现从小到大排序 ORG0000HLJMPMAINMAIN:MOVR0,#50HMOVR1,#5HLCALLMAPEENDMAPE: DECR1MOV R4,R0CLRPSW.5 ;清冒泡标志MAP10:MOVR3,R1MOVR0,R4;数据块起始地址指针MAOP11:MOVR2,R0;取前数 INCR0 MOVA,R0;取后数 CLRC SUBBA,R2 JCMAP12;前数小于后数,不变 SETBPSW.5;置冒泡标志 MOVA,R0 INCR0 MOVR0,A INCR0 MOVR0,R2MAOP12:DJNZR3,MAOP11 JBCPSW.5,MAOP10MAPE:RET开始初始化 内循环次数N-1给CX清冒泡标志i=0修改地址数i数i+1二数位置交换,标志位置1内循环计数减1NY内循环计数到零?外循环标志为1?结束YNNY图4-6 冒泡法排序4.2 实验调试步骤1 输入程序,检查无误后,编译、链接程序,首先给系统复位,然后点击 命令进入调试状态。2、点击命令复位,点击命令运行整个程序,观察存储器窗口的结果。、3、另外在程序出错时可点击命令单步运行程序,观察每一步运行情况,找出错误之处。4.3 实验结果及分析清零、拆字、拼字实验均满足要求,其中清零实验为了验证结果正确性,可以将清零改成置一。运用汇编编写程序后,可以参考实验指导书进行c语言编程,强化理解c语言。散装程序,用途及广,可以实现多个目标的跳转,具有散装功能。冒泡排序一般有两种方法,一个是规定排序次数,进行内外两次循环,也可在外循环设置标志位,只有当内循环需要转换数据时,才进行外循环,否则程序结束。明显,带有标志位的冒泡法排序相对来说时间复杂度要小,本实验即采用第二种冒泡法排序。典型的排序程序还有快速法,查找法等,这里没有进行编写。第5章 硬件程序设计实验51静态存储器扩展实验1、 实验要求及内容:编写实验程序,在单片机内部一段连续RAM 空间30H3FH 中写入初值00H0FH,然后将 这16个数传送到RAM的0000H000FH 中,最后再将外部RAM 的0000H000FH 空间的内容传送 到片内RAM的40H4FH 单元中。为了更好的看到实验效果,添加一显示灯泡,用以表征数据是否正确传输。如果有有传送错误,则令指示灯闪烁2、 实验程序设计及硬件实现:画程序流程图,如5-1NNYY开始将00H-0FH传送至片内RAM的30H-3FH内R1=10H; R0=30HDPTR=0000HR0DPTRR1-1将片外RAM的0000H至000FH的内容传送至片内RAM的40H-4FH中DPTR=R1?R1=0?调用指示灯闪烁子程序R0+1DPTR+1结束图 5-1 SRAM程序流程图:根据流程图编写汇编语言程序。程序如下:ORG0000HAJMPMAINMAIN:MOVP3.5,#1;P3.5外接指示灯指示运行状态(长亮则运行正常,闪烁则出错)MOVR0,#30H;将00H-0FH写入RAM内30H-3FH MOVA,#00HMOVR1,#10HL1:MOVR0,AINCR0INCDPTRINCR0DJNZR1,L2MOVR1,#10H;写入内部RAM 中 MOVDPTR,#0000HMOVR0,#40HL3:MOVXA,DPTRMOVR0,AINCDPTRINCR0DJNZR1,L3ER:MOVP3.5,#0;P3.5闪烁子程序INCADJNZR1,L1MOVR1,#10H;写入外部RAM中 MOVDPTR,#0000HMOVR0,#30HL2:MOVA,R0MOVXDPTR,AMOVXA,DPTRCJNEA,R0,L4L4:LCALLER;传送出错,调用闪烁子程序LCALLDELAYMOVP3.5,#1LCALLDELAYJMPERRET;延时子程序DELAY:MOVR6,#50HD2:MOVR7,#0FFHD1:DJNZR7,D1DJNZR6,D2RETEND:判断程序正误。输入程序,检查无误后,编译、链接程序,先在Keil C中模拟运行,直至正确为止。:按照图5-1进行接线,联机调试运行程序。图5-1 扩展存储器实验线路图:脱机运行程序,学习并掌握脱机联机模式之间的切换方法。5.2数字量输入输出实验5.2.1 实时输入输出1、 实验内容P1口是8位准双向口,每一位均可独立定义为输入输出。编写实验程序,将P1口的低4位定义为输出,高4位定义为输入,数字量从P1口的高4位输入,从P1口的低4位输出控制发光二极管的亮灭。2、 实验程序设计及硬件实现P1口是准双向口,在其作为输入口使用时,首先要写先写入高电平,然后再读P1口数据才是准确的。所以,程序的开始就应该说明P1口的高4为为输入,也就是将高4位写“1”,指令为:MOVP1,#0F0H开始结束P1高4位为输入低4位为输出读取P1口数据程序清单:ORG0000HAJMPMAINMAIN:MOVP1,#0F0H;定义高4位为输入MOVA,P1ANLA,#0F0HSWAPAMOVP1,AAJMPEE:SJMP$END 图 5-2基本输入输出程序流程图此程序的关键点在于:P1口是准双向口,在其作为输入口使用时,首先要写“1”,然后再读P1口数据才是准确的。所以,程序的开始就应该说明P1口的高4为为输入,也就是将高4位写“1”,指令为:MOVP1,#0F0H硬件接线及运行后状态:图5-3 基本输入输出电路图及Proteus仿真结果5.2.2方波发生器1、 实验内容:单片机集成的定时器可以产生定时中断,利用定时器0和定时器1,编写实验程序在P1.0及P1.1 引脚上输出方波信号,通过示波器观察实验现象并测量波形周期。2、实验程序设计及硬件实现程序清单:MOVTMOD,#10H;定时器1工作方式1MOVTH1,#0FFH;设置计数初值MOVTL1,#83HSETBEA;开中断SETBET1;定时器1允许中断SETBTR1;定时开始SJMP$;等待中断中断服务程序:MOVTH1,#0FFH;重新设置计数初值MOVTL1,#83HCPLP1.0;输出取反RETI;中断返回按照实验指导书上硬件接线图进行接线,联机进行调试分析。5.2.3键盘扫描与数码管显示设计1、实验内容:使用汇编语言编程,实现如下功能:在4*4小键盘上按键输入,并将其内容显示在LCD上。2、实验程序设计及硬件实现原理阐述矩阵键盘的运行原理:键盘的列线接电阻后接+5V的电源,另一端接单片机的P3.0P3.3口,行线接在单片机的P3.4P3.7口上。键盘采用扫描的方式,程序开始运行时,检测的方法是单片机的P3.4P3.7口输出全“0”,读取P3.4P3.7口的状态,若P3.4P3.7口有高电平,则有键按下,否则没有键按下。若有键按下,通过延时去抖。去除键抖动后,当检测到有键按下后,延时一段时间在做下一步的检测判断。若有键按下,通过程序判断是哪个按键按下并通过程序判断此键所代表的具体数值(在程序中将每个按键赋予一个固定的值,从0到F),然后查表后的键值送到数码管显示。LCD液晶显式原理:液晶显示的原理是利用液晶的物理特性, 通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图。程序开始时,对液晶进行了初始化设置,约定了显示格式。由于液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志位,即读忙信号和光标地址BF为低电平,表示不忙,否则此指令失效。要显示字符时,程序先输入显示字符地址,也就是告诉模块在哪里显示字符,液晶就可以正常显示。方案讨论独立式键盘由一组相互独立的按键组成。这些按键直接与单片机的I/O口相连,即每个按键盘独占一个I/O口,接口简单。这里采用查询方法,利用判断指令实现键盘功能。矩阵键盘输入:矩阵键盘是4*4的16位键盘,键盘的行线和列线分别接单片机的P3.0P3.3和P3,4P3.7口上,键盘采用键盘扫描的工作方式。 LCD显示输出:将LCD的输入端D0到D7接在单片机的P1端口,数据通过P2口送入LCD,LCD内部有数据译码器,能将数据转换为电压变化,并显示。RS端接P2.1,RW接P2.0,E接P2.2,VSS与滑动变阻器一端接地,VDD与滑动变阻器另一端接+5V,VEE接划动端,通过滑动变阻器改变LCD的显示亮度,使之能正常显示。硬件接线参考图5-5,图为Proteus运行结果。图5-4 4*4键盘扫描输入及显示功能Proteus仿真结果图部分程序流程框图。开 始设置LCD控制信号设置LCD工作模式读取显示数据CHIAN设置数据计数器R5字符输出完?查忙延时等待 YNEND显示输出,定位光标i+读取下个显示数据图5-5 LCD显示子程序开始置所有行为低电平读运行状态行输入为高电平?延时RET读取P3口数据得行号置所有列为低电平读取列值判断哪一列按下调键值译码程序调用显示RETNY图5-6 4*4矩阵键盘流程图程序清单:程序中设置编有头文件LCD1602.h、input.h、hardware.h,函数文件有:LCD1602.c、input.c、SHIYAN.c。SHIYAN.c为最终所需文件。/*- hardwar.h文件 硬件抽取层-*/#ifndef _HARDWAR_H_#define _HARDWAR_H_#include /*- LCD数据、控制口定义-*/#define LCD_DATA P1 /LCD的数据口sbit LCD_BUSY=LCD_DATA7; /LCD忙信号位sbit LCD_RW=P20; /LCD读写控制sbit LCD_RS=P21; /LCD寄存器选择sbit LCD_EN=P22; /LCD使能信号*/*-I2C-EEROM接口定义-*/Sbit SDA=P24; /I2C总线数据Sbit SCL=P23; /I2C总线时钟/*- DS1302接口定义-*/sbit reset=P27;sbit sclk=P26;sbit io=P25;extern void _nop_ (void);#endif。/*键盘输入头文件程序*/*.h file#ifndef _SHURU_H_#define _SHURU_H_bit pkey(); /判断有没有键按下unsigned char kbscan(void); /键盘扫描void input(void); /号码输入void delay(void); /消抖动extern unsigned char key;#endif /*- LCD1602.H文件 LCD1602的一些命令定义-*/#ifndef _LCD_H_#define _LCD_H_#define LCD_GO_HOME 0x02 /AC=0,光标、画面回HOME位/输入方式设置#define LCD_AC_AUTO_INCREMENT 0x06 /数据读、写操作后,AC自动增一#define LCD_AC_AUTO_DECREASE 0x04 /数据读、写操作后,AC自动减一#define LCD_MOVE_ENABLE 0x05 /数据读、写操作,画面平移#define LCD_MOVE_DISENABLE 0x04 /数据读、写操作,画面不动/设置显示、光标及闪烁开、关#define LCD_DISPLAY_ON 0x0C /显示开#define LCD_DISPLAY_OFF 0x08 /显示关#define LCD_CURSOR_ON 0x0A /光标显示#define LCD_CURSOR_OFF 0x08 /光标不显示#define LCD_CURSOR_BLINK_ON 0x09 /光标闪烁#define LCD_CURSOR_BLINK_OFF 0x08 /光标不闪烁/光标、画面移动,不影响DDRAM#define LCD_LEFT_MOVE 0x18 /LCD显示左移一位#define LCD_RIGHT_MOVE 0x1C /LCD显示右移一位#define LCD_CURSOR_LEFT_MOVE 0x10 /光标左移一位#define LCD_CURSOR_RIGHT_MOVE 0x14 /光标右移一位/工作方式设置#define LCD_DISPLAY_DOUBLE_LINE 0x38 /两行显示#define LCD_DISPLAY_SINGLE_LINE 0x30 /单行显示void LCD_cls(void);void LCD_write_data(unsigned char);void LCD_initial(void);void LCD_set_position(unsigned char);void LCD_prints(unsigned char *);void LCD_printc(unsigned char); #endif。/*-主文件设置-*/#includereg51.h#includeLCD1602.h#includehardware.hchar code tab44=1,4,7,#,2,5,8,0, 3,6,9,*,A,B,C,D; /0到F的16个键植void delay(unsigned char a)unsigned char i;while(a-)for(i=100;i0;i-);char kbscan() /键盘扫描 unsigned char hang,lie,key;if(P3!=0x0f)delay(5);if(P3!=0x0f)switch(P3&0x0f)case 0x0e:lie=0;break;case 0x0d:lie=1;break;case 0x0b:lie=2;break;case 7:lie=3;break;P3=0xf0;P3=0xf0;switch(P3&0xf0)case 0xe0:hang=0;break;case 0xd0:hang=1;break;case 0xb0:hang=2;break;case 0x70:hang=3;break;P3=0x0f;while(P3!=0x0f);key=tabhanglie;elsekey=0;return (key);void main()unsigned char temp;LCD_initial();LCD_prints(Output);/初始化显示P3=0x0f;P0=0xff;while(1)temp=kbscan();if(temp!=0)P0=temp;LCD_set_position(0x40);LCD_printc(temp);。/*-LCD1602.C文件 LCD1602的函数-*/ #include hardware.h#include lcd1602.hvoid LCD_check_busy(void)/检测LCD状态 while(1) LCD_EN=0; LCD_RS=0; LCD_RW=1; LCD_DATA=0xff; LCD_EN=1; if(!LCD_BUSY)break; LCD_EN=0;void LCD_cls(void) /LCD清屏 LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=1; LCD_EN=1; LCD_EN=0; void LCD_write_instruction(unsigned char LCD_instruction) /写指令到LCD LCD_check_busy(); LCD_RS=0; LCD_RW=0; LCD_DATA=LCD_instruction; LCD_EN=1; LCD_EN=0; void LCD_write_data(unsigned char LCD_data) /输出一字节数据到LCD LCD_check_busy(); LCD_RS=1; LCD_RW=0; LCD_DATA=LCD_data; LCD_EN=1; LCD_EN=0; void LCD_set_position(unsigned char x) /LCD光标定位到x处 LCD_write_instruction(0x80+x);/*void LCD_go_home(void) /LCD光标归位 LCD_write_instruction(LCD_GO_HOME);void LCD_printc(unsigned char lcd_data) /输出一个字符到LCD LCD_write_data(lcd_data);void LCD_prints(unsigned char *lcd_string) /输出一个字符串到LCD unsigned char i=0; while(lcd_stringi!=0x00) LCD_write_data(lcd_stringi); i+; VoidLCD_initial(void) /初始化LCD LCD_write_instruction(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE); LCD_write_instruction(LCD_DISPLAY_ON|LCD_CURSOR_OFF); LCD_write_instruction(LCD_DISPLAY_DOUBLE_LINE); LCD_cls();/*-Input.C文件函数实现键盘扫描的输入量检测-*/ #includeunsigned char code tab44=1,4,7,#, 2,5,8,0, 3,6,9,*, A,B,C,D; /0到F的16个键植void delay(unsigned char a)unsigned char i;while(a-)for(i=100;i0;i-);char kbscan() /键盘扫描 unsigned char hang,lie;if(P3!=0x0f)delay(5);if(P3!=0x0f)switch(P3&0xf0)case 0x10:hang=0;break;case 0x20:hang=1;break;case 0x40:hang=2;break;case 0x80:hang=3;break;P3=0xf0;P3=0xf0;switch(P3&0x0f)case 1:lie=0;break;case 2:lie=1;break;case 4:lie=2;break;case 8:lie=3;break;P3=0x0f;while(P3!=0x0f);return (tabhanglie);return 0;结果分析:图中为按下键盘8时的显示,其上面的Output为初始化时变设置的输出,可以将其改为其他字符或者去掉不要。本次实验用LCD代替数码管进行显示,提高了实验难度的同时,也使自己在做题过程中得到了许多。5.3定时器/计数器实验5.3.1定时器控制LED灯1、实验内容由单片机内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。P1口的P1.0-P1.7分别接八个发光二极管。编写程序模拟时序控制装置。开机后第一秒钟L1,L3亮,第二秒钟L2,L4亮,第三秒钟L5,L7亮,第四秒钟L6,L8亮,第五秒钟L1,L3,L5,L7亮,第六秒钟L2,L4,L6,L8亮,第七秒钟八个LED灯全亮,第八秒钟全灭,以后又从头开始,L1,L3亮,然后L2,L4亮一直循环下去。2、实验程序设计及硬件实现方案设计:本实验较为简单,利用单片机的计数与定时功能共同实现彩灯循环。流水灯的八个发光二极管负极通过电阻接在单片机的P1口上,正极接+5V电压,当给 P1输入低电平时发光二极管发光,流发光,当程序运行时,给P1口需要发光的口送入低电平,使发光二极管能轮流闪烁发光。此设计使用静态,从而程序简单,显示稳定,线路不易出错,但缺点是但用单片机的I/O多。实验流程图:NY开始初始化设置计数R0=0设置计时器模式开启计时器开启中断允许等待1秒中断中断到?中断溢出标志清零由R0的值转至相应程序段控制彩灯的亮灭R0是7的话则令R0=0否则,R0+1图 4-7 LED彩灯循环显示程序流程图程序清单:MOVTMOD,#01HMOVTH0,#3CHMOVTL0,#80HSETBTR0;启动定时器SETBET0;允许T0中断SETBEA;允许CPU中断SJMP$;等待中断SERVE:MOVTH0,#3CH;重新置数MOVTL0,#80HDJNZB,L;1秒MOVB,#20CJNER0,#0,L1 MOVP1,#00000101B;R0=0, 灯1灯3亮INCR0LJMPLL1:CJNER0,#1,L2MOVP1,#00001010B;R0=1,灯2、4亮INCR0LJMPLL2:CJNER0,#2,L3MOVP1,#50H;R0=2,灯5灯7亮INCR0LJMPLL3:CJNER0,#3,L4MOVP1,#0A0H;R0=3,灯6灯8亮INCR0LJMPLL4:CJNER0,#4,L5MOVP1,#55H ;R0=4,灯1灯3亮INCR0LJMPLL5:CJNER0,#5,L6MOVP1,#0AAH ;R0=5,灯2,4,6,8亮INCR0LJMPL;时间到,判断哪个灯亮L6:CJNER0,#6,L7MOVP1,#0FFH;R0=6,灯全亮INCR0LJMPLL7:MOVP1,#00H ;R0=7,灯全灭MOV R0,#0 ;R0清零,一下循环计数LJMPLL:CLRTF0;中断溢出标志清零 RETI;中断返回END硬件连线图 5-8 LED彩灯循环显示Proteus电路图结果分析:彩灯控制,通过对延时程序时间大小进行修改可以改变灯流转的快慢。5.4 /、/转换实验5.4.1 小键盘指定波形输出 1、 实验内容 小键盘给定(并显示工作状态),选择信号源输出波形类型(D/A转换方式),经过A/D采样后,将采样数据用LED灯,显示当前模拟信号值大小及变化状态。2、实验程序设计及硬件实现 原理阐述:单片机与DAC0832接口有直通方式、单缓冲方式和双缓冲三种方式。直通工作方式不能直接与系统的数据总线连接,需要另加锁存器,而单缓冲方式对于只有一路模拟量输出或者虽有多路模拟量但并不要求输出同步的情况,可以采用单缓冲方式。本实验正属于此类情况,选择单缓冲方式。方案设计与论证选用DAC0832作为DA转换芯片单缓冲工作方式,功放选择U3:A, DAC0832的数据端D0D0与单片机的P0口相连。这里不采用4*4键盘,而是用四个选择键按钮代替小键盘,用于选择三角波、方波、正弦波三种波形选择,将其通过P2口作为输入。9C51单片机用来执行某一波形发生程序,向DA转换器的输入端发送数据,将其转化成模拟量,并通过运算放大器调节波形的幅值,而在输出端得到所需的波形。P2.0所接按键为产生“三角波”键;P1.1所接按键为产生“锯齿波”键;P2.2所接按键为产生“方波”按键,P2.3所接按键为产生“正弦波”按键。并用P0口外接LED灯,实时显示模拟量电压的大小。硬件如图5-9。图 5-9 D/A转换之波形发生实验Proteus仿真电路图实验流程图开始初始化扫描按键状态Key1=0?三角波输出继续扫描按键状态锯齿波输出继续扫描按键方波输出继续扫描按键YNYNKey4=0?正弦波输出继续扫描按键key2=0??YYNKey3=0?图 4-10 D/A转换之波形发生器流程图实验程序:/*正弦波代码*/TABLE:DB 80H,8CH,98H,0A5H,0B0H,0BCH,0C7H,0D1HDB 0DAH,0E2H,0EAH,0F0H,0F6H,0FAH,0FDH,0FFHDB 0FFH,0FFH,0FDH,0FAH,0F6H,0F0H,0EAH,0E3HDB 0DAH,0D1H,0C7H,0BCH,0B1H,0A5H,99H,8CHDB 80H,73H,67H,5BH,4FH,43H,39H,2EHDB 25H,1DH,15H,0FH, 09H,05H,02H,00HDB 00H,00H,02H,05H,09H, 0EH,15H,1CHDB 25H,2EH,38H,43H,4EH, 5AH,66H,73H/*主程序*/DAC0832 EQU00HORG0000HLJMPMAINORG0030HMAIN:MOVP2,#0FFHJNBP2.0,TGUL ; P2.1=0三角波输出JNBP2.1,JUCHI ; P2.1=0矩形波输出JNBP2.2,SQUARE ; P2.2=0方波输出JNBP2.3, SIN ;P2.3=0正弦波输 TGUL:MOV R0,#0ffH ;产生三角波MOV A,#00HMOV DPTR,#DAC0832CC: MOVX DPTR,ANOPNOPNOPINCACJNE A,#0FFH,CCDD: MOVX DPTR,AMOVP1,A ;模拟量输出NOPNOPNOPDECACJNE A,#00H,DDDJNZ R0,CCLJMPMAIN ;返回主程序/*方波程序*/SQUARE:MOVDPTR,#DAC0832LP2:MOVA,#0FFHMOVXDPTR,AMOVP1,A ;模拟量输出ACALLDELAYMOVA,#00HMOVXDPTR,AMOVP1.AACALLDELAYAJMPLP2LJMPMAIN/*锯齿波*/JUCHI: MOV R1,#0JL1:MOVA,R1MOVDPTR,#DAC0832MOVXDPTR,A;输出MOVP1,AMOVA,R1ADDA,#4;步长为四MOVR1,ANOPJNZJL1LJMPMAIN/*正弦波*/SIN: MOV R1,#63HMOV DPTA,#TABLEMOVA,R1MOVCA,A+DPTR ;查正弦码MOVDPTR,#DAC0832MOVXDPTR,A;输出MOVP1,ANOPDJNZR1,SINLJMPMAIN/*延时程序*/DELAY:MOVR0,#10HMOVR1,#05FHL1:DJNZR1,L1NOPMOVR1,#0FFHDJNZR0,L1RETEND实验结果及分析:本实验结果如图5-11(这里仅给出三角波与锯齿波部分)图中右边的灯泡实时显示模拟量的大小。仿真示波器的熟练跳整及使用是完成能否完成这个实验的重点。示波器的扫描时间,幅值的大小均需要耐心调整,直至出现波形为止。当你打开示波器显示波形的窗口时很有可能并不是最佳显示状态,甚至连所测信号的波形都看不到,这就牵涉到示波器的调整问题,其调整方法和使用真实的示波器几乎完全一样。弄清楚示波器上各个按钮的作用后细调即可。实验中,延时程序时间长短的设置也是本实验的一个重点,如果时间过短,波形变化太快,示波器采集显示时可能看不到,太慢,变化也较慢,应适当调整。本次正弦波,采用的正弦波码较为简单,所生成的正弦波精度不够,如果需要更高级别的精度,可以将正弦波码。图 5-11 D/A转换之波形发生实验Proteus结果(三角波部分)图 5-12 D/A转换之波形发生实验Proteus结果(锯齿波部分)5.5串行通讯

温馨提示

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

评论

0/150

提交评论