《2022年单片机C51程序设计实验报告书 .pdf》由会员分享,可在线阅读,更多相关《2022年单片机C51程序设计实验报告书 .pdf(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1 实验一 并行输入输出口的使用一、实验目的: 学会设计 proteus 7仿真电路,学习P1口的使用方法和延时子程序的编写用 Keil uVision 3 编程实现发光二极管的流水点亮。二、实验原理: P1 口为 8 位准双向 I/O 口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1) 。P1 口作为输出,接8 个发光二极管 D1D8经限流电阻分别接至8 个引脚。本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/
2、AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51R1470RR2470RR3470RR4470RR5470RR6470RR7470RR8470RD1LED-REDD2LED-REDD3LE
3、D-REDD4LED-REDD5LED-REDD6LED-REDD7LED-REDD8LED-RED开始P1 口初始化点亮 D1发光二极管延时发光二极管移到下一位循环精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 18 页2 三、实验代码:#include #include /移位库函数包含于此头文件中void delay(unsigned int d) /定义延时子函数 while(-d0); void main() unsigned char i,sel; while(1) sel=0 xfe; for(i=0;i=8;i+) P1
4、=sel; /显示变量赋给 P1 口delay(50000); /延时sel=_crol_(sel,1); /改变显示变量 四、实验结论: 用 while 语句实现发光二极管循环流水点亮,从上到下一次点亮。实验二 C51 分支程序设计一、实验目的: 学习多分支选择结构和switch 语句,了解循环的嵌套。二、实验原理: do while 循环先执行后判断是否循环,switch 括号中的表达式的值与某 case 后的常量表达式的值相同时,就执行它后面的语句,遇到break 语句则退出switch 语句。本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST
5、9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51SW2SW-SPSTSW3S
6、W-SPSTR1470RR2470RR3470RR4470RD1LED-REDD2LED-REDD3LED-REDD4LED-RED(仿真电路图)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 18 页3 (流程图)三、实验代码:#include void main() char a; do P1=0 xff; a=P1; a=a&0 x03; switch(a) case 0:P2=0 x0e;break; case 1:P2=0 x0d;break; case 2:P2=0 x0b;break; case 3:P2=0 x07;br
7、eak; while(1); 四、实验结论: 多分支选择的 switch/case语句,可直接处理并行多分支选择问题,从匹配表达式的括号开始执行,不再进行判断。开始P1 口初始化将 P1 口赋给 a 并屏蔽高6 位a+散转地址0循环子句1循环子句2循环子句3循环子句While 是否为真结束N Y 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 18 页4 实验三 外部中断实验一、实验目的: 掌握外部中断的原理以及中断处理程序的编写方法。二、实验原理: 外部中断 0 和外部中断 1 均为下降沿触发,当外部中断0 发生时,P0端口的电平反向
8、,当外部中断1 发生时, P1 端口的电平反向, LED 状态取反,引脚P3.2、P3.3是外部中断 INT0 和 INT1 的输入端,本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6
9、/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51R0470RR1470RD0LED-REDD1LED-RED(仿真电路图)(主程序)(中断服务程序)三、实验代码:开始初始化 P0、P1 口设置外中断0、外中断 1为下降沿触发方式LED 熄灭等待中断外中断 0 发生或外中断1发生P0 口电平反向或P1 口电平反向LED 熄灭精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 18 页5 #i
10、nclude #include void ISO(void) interrupt 0 P0=P0; /P0 端口反向void IS1(void) interrupt 2 P1=P1; /P1 端口反向void main () P0=0 x00; P1=0 xFF; SCON=0 x50; TMOD=0 x22; TH1=0 xF3; TR1=1; IT0=1; IT1=1; /设置下降沿触发方式EX0=1; EX1=1; EA=1; /中断允许while(1); 四、实验结论: 利用外中断程序可控制LED 的亮灭, P0 口、P1 口电平反向, LED状态取反。实验四 定时/计数器实验一、实验
11、目的: 学习定时计数器的使用和编写方法,进一步掌握中断处理程序的方法以及对示波器的了解。二、实验原理: 启动定时器 T1 延时 10ms,当定时时间到产生中断,执行中断程序,LED 熄灭,T1 再延时 10ms,点亮 LED,如此循环,本实验仿真电路图、 流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.
12、1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51R1470RD0LED-REDABCD(仿真电路图)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 18 页6 (主程序)(中断服务程序)三、实验代码:#include sbit Wave=P10; /位定义void T1ISR(void
13、) interrupt 3 /定时器 T1 中断响应开始设置 T1 为定时器模式送定时初值10ms LED 熄灭开 T1 中断启动 T1 计数等待中断T1 中断点亮(熄灭) LED 中断返回重置初值精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 18 页7 Wave=Wave; /反向TL1=0 x0F0; /重置计数初值TH1=0 x0D8; void main(void) Wave=0; /初始化 P1.0=0 TMOD=0 x10; /设置定时器 T1 为模式 1 TL1=0 x0F0; TH1=0 x0D8; TR1=1; /启
14、动定时计数器ET1=1; EA=1; /开中断while(1) 四、实验结论: T1 工作于模式 1,定时器产生 10ms的定时,定时中断产生,P1.0端口的输出在示波器中显示, LED 闪烁。利用定时计数器可控制LED 的显示时间变化。实验五 外中断使用一、实验目的: 更熟练的掌握外部中断的原理与应用以及中断处理程序的编写方法。二、实验原理: 引脚 P3.2、P3.3分别是外部中断INT0 和外部中断 INT1 的输入端,均为低电平有效,下降沿触发。外中断0 发生, 8 只 LED 全部点亮,外中断1 发生, 8只 LED 闪烁,本实验仿真电路图、流程图如下:XTAL218XTAL119AL
15、E30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C
16、51R1470RR2470RR3470RR4470RR5470RR6470RR7470RR8470RD1LED-REDD2LED-REDD3LED-REDD4LED-REDD5LED-REDD6LED-REDD7LED-REDD8LED-RED(仿真电路图)精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 7 页,共 18 页8 (主程序)(中断服务程序)三、实验代码:#include sbit P32=P32; void delay(unsigned int d) /定义延时子函数 while(-d0); void main() P0=0 xFF;
17、 /熄灭 LED IT0=1; IT1=1; /外中断 0、1 脉冲触发方式EA=1; EX0=1; EX1=1; /开中断for(;) /延时等待中断发生; void INT0_ISR() interrupt 0 /外中断 0 中断服务函数 P0=0 x00; void INT1_ISR() interrupt 2 /外中断 1 中断服务函数 while(P32!=0) /如果有外中断 0,退出 delay(5000); P0=0 x00; delay(5000); P0=0 xFF; 四、实验结论: 当外中断 0 发生,即按下了 So按钮, 8 只 LED 点亮;当外中断 1 发生,即按下
18、了 S1 按钮,8 只 LED 闪烁,遇到外中断0 发生,8 只 LED 停止闪烁并保持点亮状态。开始初始化 P0 口设定外中断0,外中断1为下降沿触发方式中断允许等待中断中断入口中断 0 发生中断 1 发生8 只 LED 闪烁8 只 LED 闪烁中断 0 是否发生Y N 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 8 页,共 18 页9 实验六 串行口双机通信实验一、实验目的: 理解串行通信的基本概念和C51 单片机的串行通信接口结构, 熟悉串口的 4 种工作方式、通信连线和应用编程。二、实验原理: 单片机 1 将 P1口拨动开关数据装入SB
19、UF,经由 TXD 将数据发送给单片机 2,单片机 2 将接收数据存入 SBUF,再由 SBUF 装入累加器,并输出至P1,点亮相应端口的 LED,本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD
20、17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT1
21、13P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U2AT89C51OFFON12345678161514131211109DSW1DIPSW_8D1LED-REDD2LED-REDD3LED-REDD4LED-REDD5LED-REDD6LED-REDD7LED-REDD8LED-REDR1470RR2470RR3470RR4470RR5470RR6470RR7470RR8470R(仿真电路图)精选学习资料 -
22、- - - - - - - - 名师归纳总结 - - - - - - -第 9 页,共 18 页10 (程序流程图)三、实验代码:单片机 1 的代码:#include #define uint unsigned int #define uchar unsigned char void main() uchar i; TMOD=0 x20; TH1=TL1=0 xff; SCON=0 x50; PCON=0 x80; TR1=1; P1=0 xff; while(1) P1=0 xff; i=P1; SBUF=i; while(TI=0); TI=0; 单片机 1 开始单片机 2 开始设置波特率
23、串口寄存器设置启动定时器读拨入键值载入 SBUF 发送是否发送完清楚 T1 设置波特率串口寄存器设置启动定时器是否接收数据清除 R1 数据暂存数据输出到P1 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 10 页,共 18 页11 单片机 2 的代码:#include #define uint unsigned int #define uchar unsigned char void main() uchar i=0; TMOD=0 x20; TH1=TL1=0 xff; SCON=0 x50; PCON=0 x80; TR1=1; while(
24、1) while(RI=0) ; RI=0; i=SBUF; P1=i; 四、实验结论: 当开关拨动到左边则对应的LED 点亮,反之 LED 熄灭。将双片单片机串行通信,结果存入SBUF 并输出至 P1 使相应的 LED 点亮。精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 11 页,共 18 页12 实验七 单片机串口通信(二)一、 实验目的:加深对串行通信的基本概念和C51单片机的串行通信接口结构的了解,以及串口的工作方式、通信连线和应用编程。二、实验原理: 甲、乙两机以方式1 进行串行通信,甲机首先发送信号AA ,乙机接收到后应答 BB,甲收
25、到 BB 后发送数据,数据发送完毕立即发送校验和。乙机收齐一个数据块后,再接收甲发来的校验和,并将其与乙求得的校验和比较,若相等,说明接收正确,乙回答00H,若不等,说明接收不正确,乙回答0FFH,请求重新发送。(程序流程图)三、实验代码:#include #define uchar unsigned char #define TR 1 /TR=1,发送uchar idata buf10; uchar pf; 开始串口初始化甲发送信号AA 乙机应答否发送命令帧甲计算发送校验和乙机应答否乙计算校验和校验和相等否乙接收正确乙接收不正确精选学习资料 - - - - - - - - - 名师归纳总结
26、- - - - - - -第 12 页,共 18 页13 /*串行口初始化子函数 */ void init(void) TMOD=0 x20; /T1 工作于方式 2 TH0=0 xE8; TL0=0 xE8; TR1=1; SCON=0X50; /串行口工作于方式1,REN=1 /*发送子函数 */ void send(uchar idata*d) uchar i; do SBUF=0 xAA; /发送联络信号while(TI=0) /等待一帧发送完毕TI=0; /发送完毕,标志位清0 while(RI=0) /等待乙机应答信号RI=0; while (SBUF0 xBB!=0); /乙机未
27、准备好,继续联络do pf=0; /校验和变量清 0 for(i=0;i10;i+) SBUF=di; /发送一个数据pf+=di; /计算校验和while(TI=0) TI=0; SBUF=pf; /发送校验和while(TI=0) TI=0; while(RI=0) RI=0; /等待乙机应答 while(SBUF!=0); /回答出错,则重新发送 /*接收函数 */ void receive(uchar idata*d) uchar i; do while(RI=0) RI=0; while(SBUF0 xAA!=0); /判断甲机是否请求SBUF=0 xBB; /发应答信号while(
28、TI=0) TI=0; while(1) pf=0; /清校验和for(i=0;i10;i+) di=SBUF; /接收数据pf+=di; 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 13 页,共 18 页14 /计算校验和while(RI=0) RI=0; / 接收甲校验和if(SBUFpf)=0) /比较校验和 SBUF=0 x00;break; /校验和相等,发0 x00 else SBUF=0 xFF; /校验和不相等,发 0 xFF while(TI=0) TI=0; void main() init(); /串行口初始化子函数if(
29、TR=0) send(buf); /发送else receive(buf); /接收 四、实验结论: 甲、乙两单片机通过P3 口连接,设置寄存器SBUF,串口工作于方式 1.根据 TR 的设置,利用发送函数和接收函数分别实现发送和接收功能。实验八 多位七段数码动态显示一、实验目的: 掌握数码管动态显示数字的原理和连接方式,学习端口输入输出的应用,以及 74LS245驱动 LED 显示的电路设计。二、实验原理: 轮流选中各位 LED 数码管,同时给 P0 口送不同的码字,并做一定的视觉残留,数码管就会同时出现不同的数字。本实验仿真电路图、流程图如下:(仿真电路图)精选学习资料 - - - - -
30、 - - - - 名师归纳总结 - - - - - - -第 14 页,共 18 页15 (流程图)三、实验代码:#include #define uchar unsigned char uchar data dis_buf6; /显示缓冲区uchar code table 18=0 x3f,0 x06,0 x5b,0 x4f,0 x66,0 x6d,0 x7d,0 x07,0 x7f,0 x6f,0 x77,0 x7c,0 x39,0 x5e,0 x79,0 x71,0 x40,0 x00; /代码表void d1_ms() /延时 1 ms函数 unsigned int j; for(j=
31、0;j200;j+) ; void display(void) /显示函数 uchar segcode,bitcode,i; bitcode=0 xfe; /位码赋初值for(i=0;i6;i+) segcode=dis_bufi; /显示缓冲器内容查表P0=tablesegcode; P3=bitcode; d1_ms(); P3=0 xff; /关闭显示bitcode=bitcode1; /调整位码bitcode=bitcode|0 x01; 开始位码赋初值点亮延时 1ms 关闭显示调整位码到下循环次数是否小于0 结束循环次数加1 否精选学习资料 - - - - - - - - - 名师归
32、纳总结 - - - - - - -第 15 页,共 18 页16 void main(void) dis_buf0=1; dis_buf1=2; /显示缓冲区赋初值dis_buf2=3; dis_buf3=4; dis_buf4=5; dis_buf5=6; while(1) display(); 四、实验结论: 七段数码管动态显示是一位一位轮流点亮各位数码管,每隔一段时间显示,设置点亮延时时间短,循环扫描点亮,使人眼分辨不出,看到各位数码管同时发光。实验九 数/模转换实验一、实验目的: 学习掌握 D/A 转换基本原理,掌握D/A 转换程序设计方法。二、实验原理: D/A 转换器的功能主要是将
33、输入的数字量信号转换成模拟量,检测按键执行相应的 D/A 转换,显示结果。本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P3.5/T115P2.7/A1528P2.0/A8
34、21P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51VREF8GND3VCC20CS1WR12DI34DI25DI16DI07RFB9GND10IOUT111IOUT212DI713DI614DI515DI416XFER17WR218ILE(BY1/BY2)19U2DAC0832U3OPAMPVolts-2.49(流程图)开始DCA0832 初始化检测按键D/A 转换显示精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 16 页,共 18 页17 三、实验代码:#
35、include #include #define uchar unsigned char #define DAC0832 XBYTE0 x7fff sbit P10=P10; sbit P12=P12; void main() DAC0832=0 x80; while(1) P1=0 xff; if(P10=0) DAC0832=0 xff; if(P12=0) DAC0832=0 x00; 四、实验结论: 通过手动按键将数字量DAC0832 转换输出模拟电压信号。实验十 模/数转换实验一、实验目的: 学习掌握 A/D 转换基本原理,掌握用无条件方式、查询方式、中断方式完成模 /数转换程序的编
36、写方法。二、实验原理: A/D 转换是将模拟量转换为一定码制的数字量。调节滑动变阻器将模拟量转换成数字量通过P1口输出显示。本实验仿真电路图、流程图如下:XTAL218XTAL119ALE30EA31PSEN29RST9P0.0/AD039P0.1/AD138P0.2/AD237P0.3/AD336P0.4/AD435P0.5/AD534P0.6/AD633P0.7/AD732P1.01P1.12P1.23P1.34P1.45P1.56P1.67P1.78P3.0/RXD10P3.1/TXD11P3.2/INT012P3.3/INT113P3.4/T014P3.7/RD17P3.6/WR16P
37、3.5/T115P2.7/A1528P2.0/A821P2.1/A922P2.2/A1023P2.3/A1124P2.4/A1225P2.5/A1326P2.6/A1427U1AT89C51Volts+2.50U3(CLOCK)OUT121ADD B24ADD A25ADD C23VREF(+)12VREF(-)16IN31IN42IN53IN64IN75START6OUT58EOC7OE9CLOCK10OUT220OUT714OUT615OUT817OUT418OUT319IN228IN127IN026ALE22U3ADC0808231U2:A74LS02564U2:B74LS028910U
38、2:C74LS02RV11kD1LED-REDD2LED-REDD3LED-REDD4LED-REDD5LED-REDD6LED-REDD7LED-REDD8LED-RED精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 17 页,共 18 页18 (流程图)三、实验代码:#include #include #define uchar unsigned char #define ADC08080 XBYTE0 x78ff sbit P33=P33; sbit P27=P27; sbit P36=P36; sbit P37=P37; void main() EA=1; EX1=1; IT1=1; ADC08080=0; /启动 A/D while(1); void int0() interrupt 2 P1=ADC08080; /读取数据ADC08080=0; /启动 A/D 四、实验结论: 当 A/D 转换结束时,引脚 EOC 由低电平转换为高电平输出信号LED亮,调节滑动变阻器显示相应的LED 亮。开始ADC0808 初始化启动 A/D 转换结束否显示中断N Y 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 18 页,共 18 页