您好,欢迎来到小侦探旅游网。
搜索
您的当前位置:首页单片机C51程序设计实验报告书

单片机C51程序设计实验报告书

来源:小侦探旅游网
实验一 并行输入输出口的使用

一、实验目的:学会设计proteus 7仿真电路,学习P1口的使用方法和延时子程序的编写用Keil uVision 3编程实现发光二极管的流水点亮。

二、实验原理:P1口为8位准双向I/O口,它的每一位都可以分别定义为输入线或输出线(作为输入时,口锁存器必须置1)。P1口作为输出,接8个发光二极管D1~D8经限流电阻分别接至8个引脚。本实验仿真电路图、流程图如下: R1470RD1LED-REDU1393837363534333221222324252627281011121314151617P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDATC51XTAL119R2470RD2LED-REDXTAL218R3D3LED-REDRST9470RR4470R293031D4LED-REDPSENALEEAR70RD5LED-REDP1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.712345678R70RD6LED-REDR7470RD7LED-REDR8470RD8LED-RED 开始 P1口初始化 点亮D1发光二极管 延时 发光二极管移到下一位 循环

1

三、实验代码: #include

#include //移位库函数包含于此头文件中 void delay(unsigned int d) //定义延时子函数 { while(--d>0);} void main()

{ unsigned char i,sel; while(1) { sel=0xfe;

for(i=0;i<=8;i++)

{ P1=sel; //显示变量赋给P1口 delay(50000); //延时

sel=_crol_(sel,1); //改变显示变量 } } }

四、实验结论:用while语句实现发光二极管循环流水点亮,从上到下一次点亮。

实验二 C51分支程序设计

一、实验目的:学习多分支选择结构和switch语句,了解循环的嵌套。

二、实验原理:do while 循环先执行后判断是否循环,switch括号中的表达式的值与某case后的常量表达式的值相同时,就执行它后面的语句,遇到break语句则退出switch语句。本实验仿真电路图、流程图如下:

U1SW3SW-SPST876321P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0171615141312111028272625242322213233343536373839SW2SW-SPSTD4D3D2D1LED-REDLED-REDR4470RR3R2R1313029EAALEPSEN470R470RLED-RED9RSTLED-RED470R18XTAL219XTAL1ATC51 (仿真电路图)

2

开始 P1口初始化 将P1口赋给a并屏蔽高6位 a+散转地址 ‘0’循环子句 ‘1’循环子句 ‘2’循环子句 ‘3’循环子句 Y While是否为真 N 结束

(流程图)

三、实验代码: #include void main() { char a; do

{ P1=0xff; a=P1; a=a&0x03; switch(a)

{ case 0:P2=0x0e;break; case 1:P2=0x0d;break; case 2:P2=0x0b;break; case 3:P2=0x07;break; } }while(1); }

四、实验结论:多分支选择的switch/case语句,可直接处理并行多分支选择问题,从匹配表达式的括号开始执行,不再进行判断。

3

实验三 外部中断实验

一、实验目的:掌握外部中断的原理以及中断处理程序的编写方法。

二、实验原理:外部中断0和外部中断1均为下降沿触发,当外部中断0发生时,P0端口的电平反向,当外部中断1发生时,P1端口的电平反向,LED状态取反,引脚P3.2、P3.3是外部中断INT0和INT1的输入端,本实验仿真电路图、流程图如下:

U1171615141312111028272625242322213233343536373839P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0ATC51P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0876321D1LED-REDR1470REAALEPSEN313029R0470RRST9D0LED-REDXTAL218XTAL119 (仿真电路图)

开始 初始化P0、P1口 设置外中断0、外中断1为下降沿触发方式 外中断0发生或外中断1发生 P0口电平反向或P1口电平反向 LED熄灭 LED熄灭 等待中断

(主程序) (中断服务程序)

三、实验代码:

4

#include #include

void ISO(void) interrupt 0

{ P0=~P0; } //P0端口反向 void IS1(void) interrupt 2

{ P1=~P1; } //P1端口反向 void main ()

{ P0=0x00; P1=0xFF; SCON=0x50; TMOD=0x22; TH1=0xF3; TR1=1;

IT0=1; IT1=1; //设置下降沿触发方式 EX0=1; EX1=1; EA=1; //中断允许 while(1); }

四、实验结论:利用外中断程序可控制LED的亮灭,P0口、P1口电平反向,LED状态取反。

实验四 定时/计数器实验

一、实验目的:学习定时计数器的使用和编写方法,进一步掌握中断处理程序的方法以及对示波器的了解。

二、实验原理:启动定时器T1延时10ms,当定时时间到产生中断,执行中断程序,LED熄灭,T1再延时10ms,点亮LED,如此循环,本实验仿真电路图、流程图如下:

U1171615141312111028272625242322213233343536373839P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0ATC51P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0876321D0LED-REDR1470REAALEPSEN313029ARST9BCXTAL218DXTAL119 (仿真电路图)

5

开始 设置T1为定时器模式T1中断 送定时初值10ms 重置初值 LED熄灭 点亮(熄灭)LED 开T1中断 启动T1计数 中断返回 等待中断

(主程序) (中断服务程序)

三、实验代码: #include

sbit Wave=P1^0; //位定义

void T1ISR(void) interrupt 3 //定时器T1中断响应

6

{ Wave=~Wave; //反向

TL1=0x0F0; //重置计数初值 TH1=0x0D8;}

void main(void)

{ Wave=0; //初始化P1.0=0

TMOD=0x10; //设置定时器T1为模式1 TL1=0x0F0; TH1=0x0D8; TR1=1; //启动定时计数器 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闪烁,本实验仿真电路图、流程图如下:

U11716151413121110P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0ATC51P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0876321R1470RD1D2D3D4D5D6D7D8LED-REDLED-REDR2R3R4R5R6R7R8470R470R28272625242322213233343536373839EAALEPSEN313029LED-REDRST9470RLED-REDXTAL218470RLED-REDXTAL119470RLED-RED470RLED-RED470RLED-RED (仿真电路图)

7

开始 中断入口 初始化P0口 中断1发生 中断0发生 设定外中断0,外中断1为下降沿触发方式 8只LED闪烁 8只LED闪烁 中断0是否发生 中断允许 N Y

等待中断

(主程序) (中断服务程序)

三、实验代码: #include sbit P32=P3^2;

void delay(unsigned int d) //定义延时子函数 { while(--d>0); }

void main()

{P0=0xFF; //熄灭LED

IT0=1; IT1=1; //外中断0、1脉冲触发方式 EA=1; EX0=1; EX1=1; //开中断 for(;;) //延时等待中断发生 {;} }

void INT0_ISR() interrupt 0 //外中断0中断服务函数 { P0=0x00;}

void INT1_ISR() interrupt 2 //外中断1中断服务函数 { while(P32!=0) //如果有外中断0,退出 { delay(5000); P0=0x00; delay(5000); P0=0xFF; } }

四、实验结论:当外中断0发生,即按下了So按钮,8只LED点亮;当外中断1发生,即按下了S1按钮,8只LED闪烁,遇到外中断0发生,8只LED停止闪烁并保持点亮状态。

8

实验六 串行口双机通信实验

一、实验目的:理解串行通信的基本概念和C51单片机的串行通信接口结构,熟悉串口的4种工作方式、通信连线和应用编程。

二、实验原理:单片机1将P1口拨动开关数据装入SBUF,经由TXD将数据发送给单片机2,单片机2将接收数据存入SBUF,再由SBUF装入累加器,并输出至P1,点亮相应端口的LED,本实验仿真电路图、流程图如下:

DSW1910111213141516OFFONU1876321876321P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0171615141312111028272625242322213233343536373839DIPSW_8313029EAALEPSENR1470RD1LED-REDD29RSTR2470R18XTAL2R3470RLED-REDD319XTAL1U2ATC51876321P1.7P1.6P1.5P1.4P1.3P1.2P1.1P1.0P3.7/RDP3.6/WRP3.5/T1P3.4/T0P3.3/INT1P3.2/INT0P3.1/TXDP3.0/RXDP2.7/A15P2.6/A14P2.5/A13P2.4/A12P2.3/A11P2.2/A10P2.1/A9P2.0/A8P0.7/AD7P0.6/AD6P0.5/AD5P0.4/AD4P0.3/AD3P0.2/AD2P0.1/AD1P0.0/AD0171615141312111028272625242322213233343536373839R4470RLED-REDD4R70RLED-REDD5R70RLED-REDD6313029EAALEPSENR7470RLED-REDD7R8470RLED-REDDRSTLED-RED18XTAL219XTAL1ATC51 (仿真电路图)

9

单片机1开始 设置波特率 串口寄存器设置 启动定时器 读拨入键值 载入SBUF发送 是否发送完清楚T1 三、实验代码: 单片机1的代码: #include

#define uint unsigned int #define uchar unsigned char void main() { uchar i;

TMOD=0x20; TH1=TL1=0xff; SCON=0x50; PCON=0x80; TR1=1; P1=0xff; while(1) { P1=0xff; i=P1; SBUF=i;

while(TI==0){;} TI=0; } }

10

单片机2开始 设置波特率 串口寄存器设置 启动定时器 是否接收数据 清除R1 数据暂存 数据输出到P1

(程序流程图)

单片机2的代码: #include

#define uint unsigned int #define uchar unsigned char void main() { uchar i=0; TMOD=0x20; TH1=TL1=0xff; SCON=0x50; PCON=0x80; TR1=1; while(1)

{ while(RI==0) {;} RI=0; i=SBUF; P1=i; } }

四、实验结论:当开关拨动到左边则对应的LED点亮,反之LED熄灭。将双片单片机串行通信,结果存入SBUF并输出至P1使相应的LED点亮。

11

实验七 单片机串口通信(二)

一、实验目的:加深对串行通信的基本概念和C51单片机的串行通信接口结构的了解,以及串口的工作方式、通信连线和应用编程。

二、实验原理:甲、乙两机以方式1进行串行通信,甲机首先发送信号AA,乙机接收到后应答BB,甲收到BB后发送数据,数据发送完毕立即发送校验和。乙机收齐一个数据块后,再接收甲发来的校验和,并将其与乙求得的校验和比较,若相等,说明接收正确,乙回答00H,若不等,说明接收不正确,乙回答0FFH,请求重新发送。

开始 串口初始化 甲发送信号AA 乙接收不正确 乙机应答否 发送命令帧 甲计算发送校验和 乙机应答否 乙计算校验和 校验和相等否 乙接收正确

(程序流程图)

三、实验代码: #include

#define uchar unsigned char

#define TR 1 //TR=1,发送 uchar idata buf[10]; uchar pf;

12

/*串行口初始化子函数*/ void init(void)

{ TMOD=0x20; //T1工作于方式2 TH0=0xE8; TL0=0xE8; TR1=1;

SCON=0X50; //串行口工作于方式1,REN=1 }

/*发送子函数*/

void send(uchar idata*d) { uchar i; do

{ SBUF=0xAA; //发送联络信号 while(TI==0) //等待一帧发送完毕

TI=0; //发送完毕,标志位清0 while(RI==0) //等待乙机应答信号 RI=0;

}while (SBUF^0xBB!=0); //乙机未准备好,继续联络 do

{ pf=0; //校验和变量清0 for(i=0;i<10;i++)

{ SBUF=d[i]; //发送一个数据 pf+=d[i]; //计算校验和 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(SBUF^0xAA!=0); //判断甲机是否请求 SBUF=0xBB; //发应答信号 while(TI==0) TI=0; while(1)

{ pf=0; //清校验和 for(i=0;i<10;i++) { d[i]=SBUF; //接收数据 pf+=d[i];

13

} //计算校验和

while(RI==0) RI=0; //接收甲校验和 if((SBUF^pf)==0) //比较校验和

{ SBUF=0x00;break;} //校验和相等,发0x00 else

{ SBUF=0xFF; //校验和不相等,发0xFF while(TI==0) TI=0; } } }

void main()

{ init(); //串行口初始化子函数 if(TR==0)

{ send(buf);} //发送 else

{ receive(buf);} //接收 }

四、实验结论:甲、乙两单片机通过P3口连接,设置寄存器SBUF,串口工作于方式1.根据TR的设置,利用发送函数和接收函数分别实现发送和接收功能。

实验八 多位七段数码动态显示

一、实验目的:掌握数码管动态显示数字的原理和连接方式,学习端口输入输出的应用,以及74LS245驱动LED显示的电路设计。

二、实验原理:轮流选中各位LED数码管,同时给P0口送不同的码字,并做一定的视觉残留,数码管就会同时出现不同的数字。本实验仿真电路图、流程图如下:

(仿真电路图)

14

开始 位码赋初值 点亮 循环次数加1 延时1ms 关闭显示 调整位码到下循环次数是否小于0 否 结束 (流程图)

三、实验代码: #include

#define uchar unsigned char

uchar data dis_buf[6]; //显示缓冲区 uchar code table [18]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40,0x00}; //代码表

void d1_ms() //延时1 ms函数 { unsigned int j;

for(j=0;j<200;j++) ;} void display(void) //显示函数 { uchar segcode,bitcode,i;

bitcode=0xfe; //位码赋初值 for(i=0;i<6;i++)

{ segcode=dis_buf[i]; //显示缓冲器内容查表 P0=table[segcode]; P3=bitcode; d1_ms();

P3=0xff; //关闭显示 bitcode=bitcode<<1; //调整位码 bitcode=bitcode|0x01; } }

15

void main(void)

{ dis_buf[0]=1; dis_buf[1]=2; //显示缓冲区赋初值 dis_buf[2]=3; dis_buf[3]=4; dis_buf[4]=5; dis_buf[5]=6; while(1)

{ display();} }

四、实验结论:七段数码管动态显示是一位一位轮流点亮各位数码管,每隔一段时间显示,设置点亮延时时间短,循环扫描点亮,使人眼分辨不出,看到各位数码管同时发光。

实验九 数/模转换实验

一、实验目的:学习掌握D/A转换基本原理,掌握D/A转换程序设计方法。

二、实验原理:D/A转换器的功能主要是将输入的数字量信号转换成模拟量,检测按键执行相应的D/A转换,显示结果。本实验仿真电路图、流程图如下: U1393837363534333221222324252627281011121314151617P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RDATC51XTAL119123456710U2CSVCCWR1ILE(BY1/BY2)GNDWR2DI3XFERDI2DI4DI1DI5DI0DI6VREFDI7RFBIOUT2GNDIOUT1DAC083220191817161514131211XTAL218RST9U3PSENALEEA293031-2.49VoltsOPAMP12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7 开始 DCA0832初始化 检测按键 D/A转换 显示

(流程图)

16

三、实验代码: #include #include

#define uchar unsigned char

#define DAC0832 XBYTE[0x7fff] sbit P10=P1^0; sbit P12=P1^2;

void main()

{ DAC0832=0x80; while(1) { P1=0xff; if(P10==0)

{ DAC0832=0xff;} if(P12==0)

{DAC0832=0x00;} } }

四、实验结论:通过手动按键将数字量DAC0832转换输出模拟电压信号。

实验十 模/数转换实验

一、实验目的:学习掌握A/D转换基本原理,掌握用无条件方式、查询方式、中断方式完成模/数转换程序的编写方法。

二、实验原理:A/D转换是将模拟量转换为一定码制的数字量。调节滑动变阻器将模拟量转换成数字量通过P1口输出显示。本实验仿真电路图、流程图如下:

U3(CLOCK)U2:A74LS022131067P0.0/AD0P0.1/AD1P0.2/AD2P0.3/AD3P0.4/AD4P0.5/AD5P0.6/AD6P0.7/AD7P2.0/A8P2.1/A9P2.2/A10P2.3/A11P2.4/A12P2.5/A13P2.6/A14P2.7/A15P3.0/RXDP3.1/TXDP3.2/INT0P3.3/INT1P3.4/T0P3.5/T1P3.6/WRP3.7/RD393837363534333221222324252627281011121314151617674LS0274LS02109212019188151417U3CLOCKSTARTEOCOUT1OUT2OUT3OUT4OUT5OUT6OUT7OUT8IN0IN1IN2IN3IN4IN5IN6IN7ADD AADD BADD CALEVREF(+)VREF(-)26272812345252423221216U119XTAL1RV11kD1LED-REDD2LED-REDD3LED-REDD4LED-REDD5LED-REDD6LED-REDD7LED-REDD8LED-RED18+2.50VoltsXTAL29RSTOEADC0808293031PSENALEEAU2:B12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7ATC51U2:C 17

开始 ADC0808初始化 启动A/D 中断 N 转换结束否 Y 显示

(流程图)

三、实验代码: #include #include

#define uchar unsigned char

#define ADC08080 XBYTE[0x78ff] sbit P33=P3^3; sbit P27=P2^7; sbit P36=P3^6; sbit P37=P3^7; 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亮。

18

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- xiaozhentang.com 版权所有 湘ICP备2023022495号-4

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务