编写一段程序,控制八支贴片发光二极管管L1L2L3L4L5L6L7L8L循环点亮

当前位置: >>
单片机原理及其应用实验报告
北航单片机原理及其应用 实验报告班级:110323 姓名:赵敏杰 学号: 同组者:郑硕 学号: 实验一 单片机开发环境以及 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 &AT89X52.H& //89S52 寄存器定义头文件 /*---延时子程序(有参函数),t=n*10ms---*/ void delay(unsigned char n) { unsigned char i,j,k; for(i=0;i&n;i++) for(j=0;j&14;j++)2 for(k=0;k&237;k++); } /*---主函数---*/ void main() { while(1) { P1_0=0; //P1.0 赋值为 0,LED 灭 delay(100); //调用延时子程序,t=100*10ms P1_0=1; //P1.0 赋值为 1,LED 亮 delay(100); } }汇编语言程序 ORG 00H AJMP START ;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG 30H START:CLR P1.0 ;P1.0 赋值为 0,LED 灭 MOV R0,#100 ;R0 的值决定延时时间长短 t=R0*10ms LCALL DELAY ;调用延时函数 SETB P1.0 ;P1.0 赋值为 1,LED 亮 MOV R0,#100 3 LCALL DELAY ;调用延时函数 AJMP START ;无条件跳转至 START,继续循环执行 /*---延时子程序,t=R0*10ms---*/ DELAY: D1:MOV R1,#20 D2:MOV R2,#248 DJNZ R2,$ DJNZ R1,D2 DJNZ R0,D1 RET END3 实验现象: 可以看到 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 &AT89X52.H& //89S52 寄存器定义头文件 void main() { while(1) { P0=0 //对端口写&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 END4 实验现象: 可以看到 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.0~P1.7 分别与 LED 发光二极管 L1~L8 相连。 程序: C 语言程序 #include &AT89X52.H& //89S52 寄存器定义头文件 void delay(unsigned char n) { unsigned char i,j,k; for(i=0;i&n;i++) for(j=0;j&14;j++) for(k=0;k&237;k++); } void main() {5 P0=0 while(1) { if(P0_1==0&P0_0==0) { P1=0x01; for(i=1;i&=8;i++) {delay(100); P1=P1&&1; if(P0_1!=0|P0_0!=0) } } if(P0_1==0&P0_0==1) { P1=0x80; for(i=1;i&=8;i++) {delay(100); P1=P1&&1; if(P0_1!=0|P0_0!=1) } } if(P0_1==1&P0_0==0) { P1=0x01; for(i=1;i&=4;i++) {delay(100); P1=P1&&2; if(P0_1!=1|P0_0!=0)} P1=0x02; for(i=1;i&=4;i++) {delay(100); P1=P1&&2; if(P0_1!=1|P0_0!=0)6
} } if(P0_1==1&P0_0==1) { P1=0 delay(100); P1=0x00; delay(100); if(P0_1!=1|P0_0!=1) } } }三.实验分析与感想本次实验的内容是单片机的开发环境以及 I/O 的使用,主要要 求我们熟悉 MCS-51 系列单片机开发软件的使用, 掌握单片机 I/O 口 和延时子程序的使用。 第一次接触编写程序的软件有些不熟练, 慢慢摸索之后逐渐掌握 了编写和倒入单片机的过程,但是由于电脑串口的问题,经常出现串 口被占用的情况,多次检查之后仍然不能排除错误,最后重启电脑之 后可以继续完成实验,但一两次使用之后又出现串口的情况,十分奇 怪,最近不得不换电脑才能完成实验。本次实验基本完成了老师要求 的内容,但由于串口被占用的情况,被浪费太多时间,以至于最后一 个实验没有完全完成,但整体思想及程序上已没有问题。第二次7 实验二 单片机中断及定时器使用实验一.实验目的1.学习外部中断技术的基本使用方法及中断处理的编程方法。 2.学习单片机定时器的基本使用方法及其编程方法。二.实验内容1.验证性实验 (1)实验内容: 外部中断的实验,8 路 LED 做流水灯,当接收到外部中断后, LED 全部点亮一段时间,之后恢复到流水灯状态。有关说明: 采用外部中断 0 负边沿产生中断信号,中断响应函数应尽量简 洁。 硬件连接: 用导线将实验箱中的 P1.0~P1.7 分别与 LED 发光二极管 L1~L8 相连。INT0 与负脉冲相连(硬件在实验箱的具体位置可以参照文档最后面的附 图) 。8 程序:C 语言程序 # include&regx51.h& unsigned char STATE; unsigned char s0; /*---延时子程序(有参函数) ,t=n*10ms---*/ void delay(unsigned char n) { unsigned char i,j,k; for(i=0;i&n;i++) for(j=0;j&14;j++)9 for(k=0;k&237;k++); } void main() { EA=1; //CPU 开中断 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式 s0=0x01; while(1) { if(!STATE) //如果标志位 STATE 为 0,则做流水灯 {P1=s0; s0=s0&&1; if(s0==0x00) s0=0x01; delay(30); } else //如果标志位 STATE 为 1,则 LED 全亮 {STATE=0; P1=0 delay(100); } }10 } /*---中断服务函数---*/ void int0() interrupt 0 {STATE=1; } //标志位 STATE 置 1汇编语言程序 ORG 0000H JMP START ;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG 0003H ;外部中断 0 程序入口地址 JMP INT ORG 0030H START:SETB EA ;CPU 开中断 SETB EX0 ;开外部中断 0 SETB IT0 ;边沿触发方式 MOV A,#01H CALL LOOP LOOP: MOV P1,A MOV R0,#30 ;R0 的值决定延时时间长短 ;t=R0*10ms CALL DELAY ;调用延时函数11 RL A ;移位 JMP LOOP ;无条件跳转至 LOOP,继续循环执行 /*---外部中断 0 中断程序---*/ INT: MOV B,#0FFH MOV P1,B MOV R0,#30 CALL DELAY RETI /*---延时子程序,t=R0*10ms---*/ DELAY: D1:MOV R1,#20 D2:MOV R2,#248 DJNZ R2,$ DJNZ R1,D2 DJNZ R0,D1 RET END实验现象: 可以看到在没有中断的时候,8 路 LED 从右至左流水点亮,当 外部中断脉冲到来以后 8 路 LED 全部点亮一段时间,之后恢复流水 点亮状态。12 (2)实验内容: 定时器实验,8 路 LED 所表示的二进制数每定时 0.5s 增 1。 有关说明: 实验箱单片机使用的晶振频率为 11.0592MHz,在计算定时器初 值的时候要注意。在汇编语言中,数据长度只支持到 8 位,因此在 用定时器定时的时候要注意到这一点。 硬件连接: 用导线将实验箱中的 P1.0~P1.7 分别与 LED 发光二极管 L1~L8 相连。程序:13 C 语言程序 # include &regx51.h& void main() { TMOD=0x01; //定时器 0 工作方式 1 TH0=; //计算初值 TL0=; EA=1; //CPU 开中断 ET0=1; //开定时器中断 0 TR0=1; //开启定时器 0 并开始工作 while(1); //等待中断 } /*---定时器 0 中断服务函数---*/ void time0() interrupt 1 { time++; //每 1ms,time 加 1 if(time==500) //time 加满 500 次后,0.5s 时间到 { time=0; //time 清零,重新计数 P1++; } TH0=; //重新装载定时器初值 TL0=; }14 汇编语言参考程序 ORG 0000H JMP START ;在首地址处放置跳转指令 ;以免主程序占用中断入口地址 ORG 000BH ;定时器 0 程序入口地址 JMP ET0P ORG 0030H START:MOV TMOD,#01H ;定时器 0,工作方式 1 MOV TH0,#4CH ;定时器装载初值,50ms 中断一次 MOV TL0,#00H ;这里需要注意,前面的 c 程序定时时间为 ;1ms,这里汇编定时时间为 50ms,因为汇编 ;数据长度只支持到 8 位,如果定时时间为 1ms, ;500ms 需要中断 500 次,汇编无法支持,所以 ;定时时间改为 50ms SETB EA ;CPU 开中断 SETB ET0 ;开定时器中断 SETB TR0 ;定时器开始工作 MOV A,#0AH CALL LOOP LOOP: CJNE A,#00H,LOOP ;A 不等于零,跳转 LOOP INC B ;B 加 115 MOV P1,B MOV A,#0AH JMP LOOP ; /*---定时器 0 中断程序---*/ ET0P:DEC A ;A 减 1 MOV TH0,#4CH MOV TL0,#00H RETI END实验现象: 可以看到用 P1 口所接的 8 路 LED 表示的二进制数每隔 0.5s 加 1。2.设计性实验 实验内容: 模拟救护车优先的交通灯控制实验 具体要求: 具体要求为用两组不同颜色的 LED 分别模仿两个路口的 “红灯” 、 “绿灯” 、 “黄灯” 。平时两组交通灯按规律点亮,具体规律为: 南北路口:绿灯(5s)黄灯(2s)红灯(5s)黄灯(2s) 绿灯(5s)??16 东西路口:红灯(5s)黄灯(2s)绿灯(5s)黄灯(2s) 红灯(5s)?? 当救护车来时(用负脉冲触发外部中断表示救护车到来) ,两个 路口马上都变成红灯让救护车优先通过,红灯保持 3s,待救护车通 过以后,两个路口的交通灯恢复正常的工作状态。实验中的交通灯点 亮的时间需要用定时器精确定时, 不能使用延时函数。 硬件连接: INT0 与负脉冲相连,LED 与单片机的连接没有固定要求,下图 只是提供一种参考接法。程序: # include&regx51.h& unsigned char STATE; unsigned char s0;17 /*---延时子程序(有参函数) ,t=n*10ms---*/ void delay(unsigned char n) { unsigned char i,j,k; for(i=0;i&n;i++) for(j=0;j&14;j++) for(k=0;k&237;k++); } void main() { EA=1; //CPU 开中断 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式 s0=0x01; while(1) { if(!STATE) //如果标志位 STATE 为 0,则做流水灯 {P1=s0; s0=s0&&1; if(s0==0x00) s0=0x01; delay(30); } else //如果标志位 STATE 为 1,则 LED 全亮 {STATE=0; P1=018 delay(100); } } } /*---中断服务函数---*/ void int0() interrupt 0 {STATE=1 ; } //标志位 STATE 置 1# include &regx51.h& int time,i; unsigned char STATE; void delay(unsigned char n) { unsigned char i,j,k; for(i=0;i&n;i++) for(j=0;j&14;j++) for(k=0;k&237;k++); }19 void main() { TMOD=0x01; //定时器 0 工作方式 1 TH0=; //计算初值 TL0=; EA=1; //CPU 开中断 ET0=1; //开定时器中断 0 TR0=1; //开启定时器 0 并开始工作 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式while(1);} /*---定时器 0 中断服务函数---*/ void time0() interrupt 1 { time++; //每 1ms,time 加 1if(time&5000) P1=0x21; if(time&=5000&&time&=7000) { P1=0x12; }20 if(time&=7000&&time&=12000) { P1=0x0c; } if(time&=12000&&time&=14000) { P1=0x12; } if(time&14000) { time=0; } TH0=; //重新装载定时器初值 TL0=; }void int0() interrupt 0 { P1=0x24; ET1=1; TR1=1; TH1=; //重新装载定时器初值 TL1=; while(m&=3000);21 ET1=0; TR1=0;}void t1() interrupt 3 { m++; TH1=; //重新装载定时器初值 TL1=; }三.实验分析与感想本次实验是单片机中断及定时器使用实验, 要求我们学习外部中断技 术的基本使用方法及中断处理的编程方法, 学习单片机定时器的基本 使用方法及其编程方法。前两个小实验都比较顺利,分别利用了中断 和定时器的功能。 只要注意一下实验使用的 LED 灯是共阳的还是共阴 的,应该就可以较顺利完成。第三个设计性实验综合了前两个实验的 内容,而且要求中出现了三个时间,但是 51 单片机没有三个定时器,22 故要利用软件的辅助才能完成。但是始终没有结果,调试将近半节课 还是不行,在老师的帮助下再次调试,发现单片机出现了问题。这让 我领悟到:出现问题不要一味埋头找程序错误或者硬件连接错误,应 该灵活的判断器件是否出现了故障。这会让我们节约很多时间,少走 一些弯路。23 实验三 单片机串口使用实验一.实验目的1.学习单片机与上位机串行通信的基本使用方法。 2.学习动态数码管显示的基本使用方法。二.实验内容1.验证性实验 (1)实验内容: 单片机串行接收数据实验: 6 位数码管通过动态扫描作为显示模 块,上位机通过串口调试助手以十六进制形式向单片机发送‘00’‘ff’范围内的数据,波特率为 9600,单片机接收到数据以后,在 数码管的最后两位显示出来,数码管其它位熄灭。 有关说明: LED 数码管显示是单片机应用系统中最常用、最基本的输出设 备,用户可以利用显示器件显示各种需要输出的视觉信息,实现人机 对话。单片机对数码管的显示方式可分为静态显示与动态显示两种。 静态显示中每一个数码管需要一个独立的输出口控制, 静态显示的特 点是显示程序简单、亮度 高、稳定性好、占用 CPU 时间少,但占用的 I/O 口较多,所以静态 显示常用在显示器数目较少的应用系统中。当显示位数较多时,可以 采用动态显示。动态显示是指数码管轮流地显示各自的字符,每位数24 码管都在显示和熄灭两个状态中循环, 同一时间只有一位数码管处于 显示状态。动态显示的特点是线路简单、硬件成本相对较低,但需要 不断刷新、扫描 I/O 口,占用 CPU 时间较多。 动态数码管控制原理: 采用各位数码管循环轮流显示的方法,当循环显示频 率较高时,由于人眼的暂留特性,看不出闪烁显示现象,这种显示需 要一个接口完成字型码的输出(字形选择) ,另一接口完成各数码管 的轮流点亮(数位选择) 。 AT89S52 有 UART 可编程的全双工串行口用于串行通信,由 TXD 发送数据,RXD 接收外部输入的数据。具有两个缓冲器 SBUF,一个 作发送缓冲器,另一个作接收缓冲器,它们拥有相同的名字和地址空 间,但不会出现冲突,因为一个只能读出数据,一个只能写入数据。 硬件连接: 首先将实验箱上的 LD0 ――LD5 与 S0――S5 之间的短路冒全部拔 去,a――h 与 B0――B3、A0――A3 之间的短路帽也全部拔去,将 短路帽插到双排插针中的一根针上,防止丢失,做完实验再重新插回 去。之后将 LD0――LD5 与 P2_0 ――P2_5 用导线相连,a――h 与 P1_0――P1_7 用导线相连,最后 还需要将串口插到电脑上,串口线的另一端与实验箱的 J13 相连, 注意引脚排列顺序。25 程序:C 语言程序 #include&reg52.h& #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 segment[6] ; //段选 uchar byte[6] ; //位选 uchar play[6]={0,0,0,0,0,0} ; //要显示的数字26 void Display_Init(); //数码管显示初始化 void Uart_Init(); //串口初始化 void Display(); //数码管显示函数 /*---数码管显示初始化---*/ void Display_Init() //初始化,通过定时器,按固定频率扫描数码 管 { TMOD = TMOD|0x01; //定时器 0,工作方式 1 TH0 = 0 //计算初值,定时时间为 1ms TL0 = 0x66; EA = 1; //CPU 开中断 ET0 = 1; //开定时器中断 0 TR0 = 1; //开启定时器 0 并开始工作 } 5 /*---串口初始化---*/ void Uart_Init() { TMOD = TMOD|0x20; //定时器 1,工作方式 2 TH1 = 0 //波特率为 9600 TL1 = 0 SCON = 0x50; //设置定时器工作方式27 PCON = 0; EA = 1; //CPU 开中断 ES = 1; //允许串口中断 TR1 = 1; //定时器 1 开始工作 } /*---扫描数码管数据显示函数---*/ void Display() { uchar n=0 ; uchar m=0x01; for(n=0;n&6;n++) { if(play[n]&0x0f) segment[n]=0x10; //显示的数据大于 0x0f,则该位熄灭 else segment[n]=play[n]; byte[n]=m; m = m&&1; } } /*---主函数---*/ void main (void)28 { Uart_Init() ; Display_Init(); play[0]=0x00; play[1]=0x00; play[2]=0 play[3]=0 play[4]=0 play[5]=0 while(1) 6 { Display() ; } } /*---定时器 0 中断服务函数---*/ void time0() interrupt 1 { P1 = table[segment[k]]; P2 = byte[k]; k++; if(k==6)29 k=0; TH0=0 //重新装载初值 TL0=0x66; } void uart() interrupt 4 { if(RI) //接收标志位 { d = SBUF; //读取串口发来的数据 play[1] = d/0x10; play[0] = d%0x10; RI=0; //清除接收标志位 } }实验现象: 单片机复位以后,最后两位数码管显示‘00’ ,其它位数码管则 熄灭,当上位机通过串口发送数据时,数码管的后两位显示数据。(2)实验内容: 单片机串行发送数据实验,波特率为 9600,外部中断 INT0 与 负脉冲相连,对脉冲个数进行计数,将计数结果以字符形式通过串口30 发送到上位机。上位机通过串口调试助手以字符形式显示计数结果。 有关说明: 以字符形式发送不同于十六进制形式发送,发送计数结果时,百 位、十位、个位要分别发送,发送的时候要转换成对应的 ASCII 码。 硬件连接: 用导线将实验箱中负脉冲与外部中断 INT0 相连。程序: C 语言程序 #include&reg52.h& #define uchar unsigned char //变量类型定义 uchar SENT ; void Int0_Init(); void Uart_Init(); //串口初始化 void Int0_Init() { EA=1; //CPU 开中断 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式 } /*---串口初始化---***/31 void Uart_Init() { TMOD = 0x20; //定时器 1,工作方式 2 TH1 = 0 //波特率为 9600 TL1 = 0 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);32 while(TI==0) ; TI=0; 8 SBUF=(d%10+0x30); while(TI==0) ; TI=0; SBUF=' '; while(TI==0) ; TI=0; EX0=1; //重新开外部中断 SENT=0; } } } /*---定时器 0 中断服务函数---*/ void Int0() interrupt 0 { d++; if(d==0xff) d=0; SENT=1; EX0=0; //关外部中断,防止按键抖动引起干扰 }33 实验现象: 每按一下脉冲按钮,串口调试助手接收到的计数值增 1。2.设计性实验 实验内容: 模拟上位机控制云台实验 具体要求: 监控行业通信协议应用最广的协议就是美国 PELCO-P、PELCO-D 协议, PELCO 主控与前端解码器是通过 RS422\RS485 通信格式传输, PELCO 协议内容包括云台控制命令, 摄像机控制命令, 辅助控制命令, 预置位设置和调用命令。现在我们通过用 RS232 通信格式传输命令, 模拟控制云台,云台控制协议选用 PELCO-D 协议。 PELCO-D 协议数据格式: 1 位起始位、 8 位数据、 1 位停止 位,无效验位。波特率:2400B/S命令格式如下: 1. 该协议中所有数值都为十六进制数 2. 同步字节始终为 FFH 3. 地址码为云台的逻辑地址号,地址范围: 00H C FFH 4. 指令码表示不同的动作 5. 数 据 码 1 、 2 分别表示水平、垂直方向速度( 00-3FH ) ,FFH 表示“ turbo ” 速度34 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 进制形式连续发送以下 字符就可以了: 上:ff 下:ff 左:ff04 右:ff02 单片机对接收到的命令进行解析,如果是以上四条命令中的一 条,则单片机通过用最低位数码管对应显示‘A’ 、 ‘B’ 、 ‘C’ 、 ‘D’ , 其它位数码管熄灭,如果接收到的命令不符合上面四条命令,则单片 机向上位机发送“e”代表 error 的意思,同时用数码管最低位显示 字母 E。 硬件连接:硬件连接与验证性实验的第一个实验的连线相同。35 程序: #include&AT89X52.h& #include&absacc.h& //储存器分配宏定义#define DAT XBYTE[0x1B30] //数据口地址 #define COM XBYTE[0x1B31] //命令/状态口地址 #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 a[7]={0xff,0x01,0x00,0x08,0x00,0xff,0x08}; uchar code b[7]={0xff,0x01,0x00,0x10,0x00,0xff,0x10}; uchar code c[7]={0xff,0x01,0x00,0x04,0xff,0x00,0x04}; uchar code d[7]={0xff,0x01,0x00,0x02,0xff,0x00,0x02}; uchar e[7]={0,0,0,0,0,0,0}; // 七 段 码void Uart_Init(); void Init8279(); void Display(uchar a);36//串口初始化 //8279 初始化 //数码管显示函数 /*---串口初始化---*/ void Uart_Init() { TMOD = TMOD|0x20; TH1 = 0xf4; TL1 = 0xf4; SCON = 0x50; PCON = 0; EA ES = 1; = 1; //CPU 开中断 //允许串口中断 //定时器 1 开始工作 //设置定时器工作方式 //定时器 1,工作方式 2 //波特率为 2400TR1 = 1; }/*8279 初始化函数*/ void Init8279(void) { uchar reg1; COM=0xd1; //B,总清除命令 do37 { reg1=COM;//读状态字,DU=1 时,表示清除命令正在执行 } while(reg1&0x80); //B,等待清除结束,DU=0,相与为 0, 清除结束 COM=0; //B,设置 8279 工作方式,8 位字符,左端输入 //编码键盘扫描,两键封锁 COM=0x32; //B,时钟频率 18 分频 10010B=18D } /****数码管显示函数****/ void Display(uchar a) { //行数寄存器//列数寄存器 a=a&0x3f; //B,屏蔽高两位数 //键的编码格式 CNTL SHIFT 扫描行序号(3 位) (硬件的列号),回馈线列信号(3 位) (硬件的行号) linedata=a&0x07; //获得列数值,B; rowdata=a&0x38;//获得行数值,B; rowdata=(rowdata&&3);//变量的第三位表示行号与列号 b=0x85;38 COM=b;//向控制口写显示 RAM 命令,B,AI=0(不自增), 写到 RAM 中 16 个地址中的 0 号地址;A4A3A2A1=(6 个地 址) if(rowdata==1) //行数为 1 的代码为 0~7,其列数也为 0~7 { DAT=table[linedata]; //把 0~7 写到数据口 } else if(rowdata==0)//行数为 0 的代码为 8,9,a~f,其列号为 0~7 { DAT=table[linedata+8];//把 8,9,a~f 写到数据口 } else //行数为 2 的代码为 GMPRWXYS,其列号为 0~7 { ; //不执行操作 }}/*---主函数---*/ void main (void) { Uart_Init() ;39 Init8279(); IT0=1; EX0=1; EA=1; //外部中断 0 下降沿触发 //开外部中断 0 //打开中断总开关while(1){} }/*键盘中断服务程序*/ void KeyIn() interrupt 0 { //定义键盘数据寄存器 COM=0x40; 读键值 keydata=DAT; //读取键盘数据 //B,读 FIFO RAM 命令,AI=0,从堆栈顶Display(keydata); //调用显示函数}40 void uart() interrupt 4 { if(RI) { x = SBUF; e[i]=x; i++; if(i&=7) { i=0; e[6]=(e[1]+e[2]+e[3]+e[4]+e[5])/256; if(e[6]==a[6]) Display(10); else if(e[6]==b[6]) Display(11); else if(e[6]==c[6]) Display(12); else if(e[6]==d[6])41//接收标志位//读取串口发来的数据 Display(13);/*if(e[0]==a[0]&&e[1]==a[1]&&e[2]==a[2]&&e[3]==a[3]&&e[4 ]==a[4]&&e[5]==a[5]&&e[6]==a[6]) Display(10); else if(e[0]==b[0]&&e[1]==b[1]&&e[2]==b[2]&&e[3]==b[3]&&e[4]==b[ 4]&&e[5]==b[5]&&e[6]==b[6]) Display(11); else if(e[0]==c[0]&&e[1]==c[1]&&e[2]==c[2]&&e[3]==c[3]&&e[4]==c[ 4]&&e[5]==c[5]&&e[6]==c[6]) Display(12); else if(e[0]==d[0]&&e[1]==d[1]&&e[2]==d[2]&&e[3]==d[3]&&e[4]==d[ 4]&&e[5]==d[5]&&e[6]==d[6]) Display(13);*/ else { Display(14); SBUF=(69);//e 的 ASCII 码 while(TI==0) ;42 TI=0; }} RI=0; } } //清除接收标志位三.实验分析与感想本次实验是单片机串口使用实验, 要求我们学习单片机与上位机 串行通信的基本使用方法,学习动态数码管显示的基本使用方法。由 于第一次使用串口通信,实验过程中遇到了很多问题,经过反复研究 和修改最终完成实验。 在验证性实验中我们也按照实验的具体步骤操 作并且得到了预期的结果。 这次的设计性试验是模拟上位机控制云台 实验。这个设计性试验比较复杂,我们研究和尝试了好久,才完成程 序的编写,很庆幸我们最后完成了实验,我们设计的程序,基本满足 了题目中的协议中所有数值都为十六进制数、同步字节始终为 FFH、 地址码为云台的逻辑地址号以及指令码表示不同的动作等要求。 通过 这次的试验,我们对程序的编写有了更进一步的认识,熟练度也大大 提高。43 实验四 单片机扩展模数转换器实验一.实验目的 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 个模拟量输入通44 道,芯片内带通道地址译码锁存器,输出带三态数据锁存器,启动信 号为脉冲启动方式,可实现 8 路模拟信号的分时采集,每一通道的 转换时间大约 100us。 ADC0809 进行完一次转换以后采用中断方式,此时 0809 的 EOC 信号需要经过反相器才能产生负脉冲。 例程硬件连接说明: 如图 1 所示, 0809 片选端 CS5 接 20――27, EOC 接 INT01(注 意 INT01 的位置,INT01 经过反相器与单片机的 INT0 相连) ;P1.0 ――P1.7 接发光二极管 L1――L8,10K 电位器中间头接 IN0,另外 两个头一端接+5V,另一端接地。程序:C 语言程序 #include&reg52.h&45 #include&absacc.h& #define uchar unsigned char //变量类型定义 uchar IN; //模拟量输入通道 #define DAT XBYTE[0x1B20+IN] //数据口地址 void Int0_Init(); void Int0_Init() { EA=1; //CPU 开中断 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式 } void main() { Int0_Init(); IN=0; //设置模拟量输入通道为 0 DAT=0x00; //任意写一个数,开始 A/D 转换 while(1); } void Int0() interrupt 0 { P1=DAT; //读取转换结果并显示 DAT=0x00; //开始下一次转换46 }实验现象: 通过旋转电位器,与 P1 口相连的 8 个 LED 表示的二进制数随 着电压值的变压而变化。(2)实验内容: 单片机串行发送数据实验,波特率为 9600,外部中断 INT0 与 负脉冲相连,对脉冲个数进行计数,将计数结果以字符形式通过串口 发送到上位机。上位机通过串口调试助手以字符形式显示计数结果。 有关说明: 以字符形式发送不同于十六进制形式发送,发送计数结果时,百 位、十位、个位要分别发送,发送的时候要转换成对应的 ASCII 码。 硬件连接: 用导线将实验箱中负脉冲与外部中断 INT0 相连。程序: C 语言程序 #include&absacc.h& #define uchar unsigned char //变量类型定义 uchar IN; //模拟量输入通道 #define DAT XBYTE[0x1B20+IN] //数据口地址47 void Int0_Init(); void Int0_Init() { EA=1; //CPU 开中断 EX0=1; //开外部中断 0 IT0=1; //边沿触发方式 } void main() { Int0_Init(); IN=0; //设置模拟量输入通道为 0 DAT=0x00; //任意写一个数,开始 A/D 转换 while(1); } void Int0() interrupt 0 { P1=DAT; //读取转换结果并显示 DAT=0x00; //开始下一次转换 }实验现象: 每按一下脉冲按钮,串口调试助手接收到的计数值增 1。48 2.设计性实验 实验内容: 模拟室温控制系统实验 具体要求: 用电位器输出的电压值代表温度传感器输出的电压值, 并且假定 电位器输出的电压值与温度成线性关系,而且他们的对应关系为:0V ――0℃,5V――50℃。 单片机对两个通道的模拟量进行采集, 将采集到的数据转换成对 应的温度。通道 IN0 为温度设置通道,对 IN0 的电压值进行采集并 且转换成对应的温度值, 转换以后的温度值代表室温控制系统设定的 初值。通道 IN1 为温度采集通道,对 IN1 的电压值进行采集并且转 换成对应的温度值,转换以后的温度值代表当前室温。 室温与初值的差值(室温温度-初值温度)△T 和单片机做出的 反应对应关系△T ≤ -25℃ 3 台空调制热 -25℃ & △T ≤ -15℃ 2 台空调制热 -15℃ & △T ≤ -5℃ 1 台空调制热 -5℃ & △T ≤ 5℃ 不做任何反应 5℃ & △T ≤ 15℃ 1 台空调制冷 15℃ & △T ≤ 15℃ 2 台空调制冷49 25℃ & △T 3 台空调制冷 用点亮一枚红色的 LED 表示一台空调制热, 点亮一枚绿色的 LED 表示一台空调制冷。 此外通过串口(串口波特率为 9600) ,每 1 秒钟向上位机发送一 遍初值和室温与初值的差值△T,以字符形式发送。例如当前温度的 初值为 25℃,差值△T 为-3℃,则上位机接收到的字符格式为“25, -3” 。初值与差值之间用逗号隔开,每一次发送的数据都用换行符换 行。 硬件连接: 0809 片选端 CS5 接 20――27, EOC 接 INT01; P1.0――P1.2 接 3 个红色发光二极管, P1.3――P1.5 接 3 个绿色发光二极管; 10K 电 位器中间头接 IN0,另外两个头一端接+5V,另一端接地;4.7K 电位 器中间头接 IN1,另外两个头一端接+5V,另一端接地;J13 接串口 线。三.实验分析与感想 本次实验是单片机扩展模数转换器实验,主要要求我们掌握 A/D 转换与单片机的接口方法,了解 A/D 芯片 ADC0809 转换性能及编程 方法以及单片机进行数据采集的方法。 通过这次实验我们学习并了解 掌握了单片机的扩展模数转换。而在验证性实验中,我们的单片机出 现了问题,我们询问老师并一起研究了问题,最终经过排查确定问题50 应该出在单片机中。就这样我们四次单片机实验全部圆满完成。在这 四次的实验中,我们对单片机有不断的了解和认识,自己编程能力也 有了很大提高,而且在一次次的实验中,因为有问题不断涌现,我们 通过自己排查问题,解决问题,逐渐形成了良好的实验习惯,提高了 实践能力。 我相信这些宝贵的实践经验会在今后的学习工作中有很大 帮助。51
单片单片机原理及应用 实验报告 专 业 2011 级计算机科学与技术 (嵌入式应用技术) 学姓 号名 合肥师范学院实验报告姓名:汪美玲 课程名称:单片机原理及应用 院(...单片机原理及应用 实验报告班级: 学号: 姓名: 2014 年 5 月 实验一 熟悉 Proteus 电路仿真软件实验 一、实验目的 1 熟悉 POTEUS 的环境。 2 掌握单片机最小...单片机原理及应用实验报告_调查/报告_表格/模板_实用文档。实验课程:单片机原理及应用 实验项目:单片机控制 LED 灯亮灭 专业班级: 学姓号: 名: 实验日期: 实验...单片机原理及应用 实验报告 单片机原理及应用实验报告 实验一:数组排序练习实验目的:练习使用用 wave6000 的 “软件模拟器” 实验内容:编一个排序 程序 ,用 wave...《单片机原理及应用》实验报告 - 《单片机原理及应用》 实验报告
学年第 1 学期 系别计算机学院 专业软件工程 班级 17 软件工程班 姓名 XXXXXX 学号 ...单片机原理及应用实验报告_信息与通信_工程科技_专业资料。西华大学实验报告 . 第 组 西华大学实验报告(机械类)开课学院及实验室:机械工程与自动化学院实验室学 ...PIC单片机原理及应用课程实验报告 - 西安电子科技大学 PIC 单片机原理及应用课程实验报告 实验名称 PIC 单片机原理及应用 通信工程学院 姓名 学号 同作者 班 实验...单片机原理与应用课程实践,实验报告_工学_高等教育_教育专区。基于C单片机的课程实践 ,单片机原理与应用课程实践 实验报告单片机原理及应用课程实践实验名称: ...单片机原理及应用实验报告_信息与通信_工程科技_专业资料。。。桂林航天工业学院 实验报告 课程名称 开课学期 实验室班姓级名 实验名称 桂林航天工业学院学生实验报告...单片机原理及应用实验报告模板 (1) - 实验报告 课程名称 专班学业级号 单片机原理及应用 电子信息工程 信息 0158 余建婕 学生姓名 ...
All rights reserved Powered by
www.tceic.com
copyright &copyright 。文档资料库内容来自网络,如有侵犯请联系客服。

我要回帖

更多关于 发光二极管 的文章

 

随机推荐