单片机原理及其应用实验报告.doc
''北航单片机原理及其应用 实验报告班级:110323姓名:赵敏杰学号:11031064同组者:郑硕学号:110311052实验一实验一 单片机开发环境以及单片机开发环境以及 I/OI/O 使用实验使用实验一实验目的一实验目的 1熟悉 MCS-51 系列单片机开发软件的使用 2掌握单片机 I/O 口的使用 3学习延时子程序的编写和使用二实验内容二实验内容 1 1验证性实验验证性实验 (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 C 语言程序语言程序 #include /89S52 寄存器定义头文件 /*-延时子程序(有参函数),t=n*10ms-*/ void delay(unsigned char n) unsigned char i,j,k; for(i=0;i /89S52 寄存器定义头文件 void main() while(1) P0=0xff; /对端口写“1“,作为高阻抗输入端用 if(P0_0) /判断 P0.0 是否为高电平 P1_0=0; else /如果 P0.0 不是高电平,则执行后面的语句 P1_0=1; 汇编语言参考程序 ORG 00H LJMP MAIN ORG 30H MAIN:JB P0.0,DEL ;识别按键是否闭合 SETB P1.0 LJMP MAIN DEL:CLR P1.0 LJMP MAIN END实验现象:实验现象: 可以看到 LED1 的状态和开关 1 的状态一致。52.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 C 语言程序语言程序 #include /89S52 寄存器定义头文件void delay(unsigned char n) unsigned char i,j,k; for(i=0;i>1; if(P0_1!=0|P0_0!=1)break; if(P0_1=1 for(i=1;iunsigned char STATE;unsigned char s0;/*-延时子程序(有参函数) ,t=n*10ms-*/void delay(unsigned char n) unsigned char i,j,k;for(i=0;iint 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;15汇编语言参考程序汇编语言参考程序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 加 116MOV P1,BMOV A,#0AHJMP LOOP ;/*-定时器 0 中断程序-*/ET0P:DEC A ;A 减 1MOV TH0,#4CHMOV TL0,#00HRETIEND实验现象:实验现象:可以看到用 P1 口所接的 8 路 LED 表示的二进制数每隔 0.5s 加 1。2.2.设计性实验设计性实验实验内容:模拟救护车优先的交通灯控制实验具体要求:具体要求为用两组不同颜色的 LED 分别模仿两个路口的“红灯”、 “绿灯” 、 “黄灯” 。平时两组交通灯按规律点亮,具体规律为:南北路口:绿灯(5s)黄灯(2s)红灯(5s)黄灯(2s)绿灯(5s)17东西路口:红灯(5s)黄灯(2s)绿灯(5s)黄灯(2s)红灯(5s)当救护车来时(用负脉冲触发外部中断表示救护车到来) ,两个路口马上都变成红灯让救护车优先通过,红灯保持 3s,待救护车通过以后,两个路口的交通灯恢复正常的工作状态。实验中的交通灯点亮的时间需要用定时器精确定时,不能使用延时函数。硬件连接:INT0 与负脉冲相连,LED 与单片机的连接没有固定要求,下图只是提供一种参考接法。程序:# includeunsigned char STATE;unsigned char s0;18/*-延时子程序(有参函数) ,t=n*10ms-*/void delay(unsigned char n) unsigned char i,j,k;for(i=0;iint time,i;unsigned char STATE;unsigned char m;void delay(unsigned char n)unsigned char i,j,k;for(i=0;i=5000 TH0=64614/256; /重新装载定时器初值TL0=64614%256;void int0() interrupt 0 P1=0x24;ET1=1;TR1=1;TH1=64614/256; /重新装载定时器初值TL1=64614%256;while(m#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;27void 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; /设置定时器工作方式28PCON = 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 = m#define uchar unsigned char /变量类型定义uchar d ;uchar SENT ;void Int0_Init();void Uart_Init(); /串口初始化void Int0_Init()EA=1; /CPU 开中断EX0=1; /开外部中断 0IT0=1; /边沿触发方式32/*-串口初始化-*/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) ;33TI=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;34EX0=0; /关外部中断,防止按键抖动引起干扰实验现象:每按一下脉冲按钮,串口调试助手接收到的计数值增 1。2.2.设计性实验设计性实验实验内容:模拟上位机控制云台实验具体要求:监控行业通信协议应用最广的协议就是美国 PELCO-P、PELCO-D 协议, PELCO 主控与前端解码器是通过 RS422RS485 通信格式传输,PELCO 协议内容包括云台控制命令,摄像机控制命令,辅助控制命令,预置位设置和调用命令。现在我们通过用 RS232 通信格式传输命令,模拟控制云台,云台控制协议选用 PELCO-D 协议。PELCO-D 协议数据格式: 1 位起始位、 8 位数据、 1 位停止位,无效验位。波特率:2400B/S命令格式如下:1. 该协议中所有数值都为十六进制数2. 同步字节始终为 FFH3. 地址码为云台的逻辑地址号,地址范围: 00H FFH4. 指令码表示不同的动作355. 数据码 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 的意思,同时用数码管最低位36显示字母 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(); /串口初始化 37void 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;38COM=0xd1; /11010001B,总清除命令do reg1=COM;/读状态字,DU=1 时,表示清除命令正在执行while(reg1 /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 /00111111B,屏蔽高两位数/键的编码格式 CNTL SHIFT 扫描行序号(3 位)(硬件的列号),回馈线列信号(3 位) (硬件的行号)linedata=a /获得列数值,00000111B;rowdata=a/获得行数值,00111000B;39rowdata=(rowdata>>3);/变量的第三位表示行号与列号b=0x85;COM=b;/向控制口写显示 RAM 命令,10000000B,AI=0(不自增),写到 RAM 中 16 个地址中的 0 号地址;A4A3A2A1=01010000(6 个地址)if(rowdata=1) /行数为 1 的代码为 07,其列数也为 07DAT=tablelinedata; /把 07 写到数据口else if(rowdata=0)/行数为 0 的代码为 8,9,af,其列号为07DAT=tablelinedata+8;/把 8,9,af 写到数据口else /行数为 2 的代码为 GMPRWXYS,其列号为 07; /不执行操作/*-主函数-*/ 40void main (void) Uart_Init() ; Init8279();IT0=1; /外部中断 0 下降沿触发EX0=1; /开外部中断 0EA=1; /打开中断总开关while(1) /*键盘中断服务程序*/void KeyIn() interrupt 0uchar keydata; /定义键盘数据寄存器COM=0x40; /01000000B,读 FIFO RAM 命令,AI=0,从堆栈顶读键值keydata=DAT; /读取键盘数据41Display(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);42else if(e6=c6)Display(12);else if(e6=d6)Display(13);/*if(e0=a0else if(e0=b0else if(e0=c0else if(e0=d0*/else43Display(14);SBUF=(69);/e 的 ASCII 码 while(TI=0) ; TI=0; RI=0; /清除接收标志位 三实验分析与感想三实验分析与感想本次实验是单片机串口使用实验,要求我们学习单片机与上位机串行通信的基本使用方法,学习动态数码管显示的基本使用方法。由于第一次使用串口通信,实验过程中遇到了很多问题,经过反复研究和修改最终完成实验。在验证性实验中我们也按照实验的具体步骤操作并且得到了预期的结果。这次的设计性试验是模拟上位机控制云台实验。这个设计性试验比较复杂,我们研究和尝试了好久,才完成程序的编写,很庆幸我们最后完成了实验,我们设计的程序,基本满足了题目中的协议中所有数值都为十六进制数、同步字节始终为 FFH、地址码为云台的逻辑地址号以及指令码表示不同的动作44等要求。通过这次的试验,我们对程序的编写有了更进一步的认识,熟练度也大大提高。实验四实验四 单片机扩展模数转换器实验单片机扩展模数转换器实验一实验目的一实验目的1掌握 A/D 转换与单片机的接口方法。2了解 A/D 芯片 ADC0809 转换性能及编程方法。3通过实验了解单片机如何进行数据采集二实验内容二实验内容1 1验证性实验验证性实验(1 1)实验内容:)实验内容:单片机模数转换实验,利用实验台上的 ADC0809 做 A/D 转换器,实验台上的电位器提供模拟量输入,编制程序,将模拟量转换成数字量,把数字量转换为电压值,并把电压以字符形式通过串口上传到 PC 机上,PC 机端以串口助手接收。有关说明:A/D 转换器用于实现模拟量到数字量的转换,按转换原理可分为 4 种:计数式 A/D 转换器、双积分式 A/D 转换器、逐次逼近式A/D 转换器和并行式 A/D 转换器。目前最常用的是双积分式和逐次逼近式。双积分式 A/D 转换器的主要优点是转换精度高,抗干扰性45能好,价格便宜,但转换速度较慢,因此这种转换器主要用于速度要求不高的场合。逐次逼近式 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,另一端接地。46程序:C 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);47void Int0() interrupt 0P1=DAT; /读取转换结果并显示DAT=0x00; /开始下一次转换实验现象:实验现象:通过旋转电位器,与 P1 口相连的 8 个 LED 表示的二进制数随着电压值的变压而变化。(2 2)实验内容:)实验内容:单片机串行发送数据实验,波特率为 9600,外部中断 INT0 与负脉冲相连,对脉冲个数进行计数,将计数结果以字符形式通过串口发送到上位机。上位机通过串口调试助手以字符形式显示计数结果。有关说明:以字符形式发送不同于十六进制形式发送,发送计数结果时,百位、十位、个位要分别发送,发送的时候要转换成对应的 ASCII 码。硬件连接:用导线将实验箱中负脉冲与外部中断 INT0 相连。48程序:C C 语言程序语言程序#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 049P1=DAT; /读取转换结果并显示DAT=0x00; /开始下一次转换实验现象:每按一下脉冲按钮,串口调试助手接收到的计数值增 1。2.2.设计性实验设计性实验实验内容:模拟室温控制系统实验具体要求:用电位器输出的电压值代表温度传感器输出的电压值,并且假定电位器输出的电压值与温度成线性关系,而且他们的对应关系为:0V0,5V50。单片机对两个通道的模拟量进行采集,将采集到的数据转换成对应的温度。通道 IN0 为温度设置通道,对 IN0 的电压值进行采集并且转换成对应的温度值,转换以后的温度值代表室温控制系统设定的初值。通道 IN1 为温度采集通道,对 IN1 的电压值进行采集并且转换成对应的温度值,转换以后的温度值代表当前室温。室温与初值的差值(室温温度-初值温度)T 和单片机做出的反应对应关系50T -25 3 台空调制热-25 < T -15 2 台空调制热-15 < T -5 1 台空调制热-5 < T 5 不做任何反应5 < T 15 1 台空调制冷15 < T 15 2 台空调制冷25 < T 3 台空调制冷用点亮一枚红色的 LED 表示一台空调制热,点亮一枚绿色的LED 表示一台空调制冷。此外通过串口(串口波特率为 9600) ,每 1 秒钟向上位机发送一遍初值和室温与初值的差值T,以字符形式发送。例如当前温度的初值为 25,差值T 为-3,则上位机接收到的字符格式为“25,-3” 。初值与差值之间用逗号隔开,每一次发送的数据都用换行符换行。硬件连接:0809 片选端 CS5 接 2027,EOC 接 INT01;P1.0P1.2 接 3 个红色发光二极管,P1.3P1.5 接 3 个绿色发光二极管;10K 电位器中间头接 IN0,另外两个头一端接+5V,另一端接地;4.7K 电位器中间头接 IN1,另外两个头一端接+5V,另一端接地;J13 接串口线。51三三实验分析与感想实验分析与感想本次实验是单片机扩展模数转换器实验,主要要求我们掌握A/D 转换与单片机的接口方法,了解 A/D 芯片 ADC0809 转换性能及编程方法以及单片机进行数据采集的方法。通过这次实验我们学习并了解掌握了单片机的扩展模数转换。而在验证性实验中,我们的单片机出现了问题,我们询问老师并一起研究了问题,最终经过排查确定问题应该出在单片机中。就这样我们四次单片机实验全部圆满完成。在这四次的实验中,我们对单片机有不断的了解和认识,自己编程能力也有了很大提高,而且在一次次的实验中,因为有问题不断涌现,我们通过自己排查问题,解决问题,逐渐形成了良好的实验习惯,提高了实践能力。我相信这些宝贵的实践经验会在今后的学习工作中有很大帮助。