nbhkdz.com冰点文库

单片机实验

时间:2010-07-29


实验一 闪烁灯 1. 实验任务 在单片机的 P1.0 端口上接一个发光二极管 D1, D1 在不 使 停地一亮一灭. 2. 电路原理图
R1 200 D1 1 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

10 R1OUT T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3. 硬件连线 将单片机中 J2 接口的 P1.0 端口用导线连接到 J15 接口的发 光二极管 D1 的端口上. 4. 程序设计内容 1,编写一段程序,用 P1.0 接口作为控制端口,使发光二极 管亮和灭.

5. 程序框图

主程序框图

6. C 语言程序 #include <REGX51.H> //延时 void delay(unsigned char time) { unsigned char a,b,c; for(a=0;a<=time;a++) for(b=0;b<=10;b++) for(c=0;c<=120;c++); } //主程序

main(void) { while(1) { P1_0=1; delay(10); P1_0=0; delay(10); } } 7,实验思考题 (1)请用户思考下,怎样让几个发光二极管同时亮. //发光二极管 D1 灭 //发光二极管 D1 亮

实验二 跑马灯 1. 实验任务 做单一灯的右移,硬件电路如图 4.4.1 所示,八个发光二极管 D1-D8 分别接在单片机的 P1.0-P1.7 接口上,输出"1"时, 发光二极管亮,开始时 P1.0→P1.1→P1.2→P1.3→┅→P1.7 亮,重复循环. 2. 电路原理图
R1 200 R2 200 R3 200 R4 200 R5 200 R6 200 R7 200 R8 200 D1 D2 D3 D4 D5 D6 D7 D8 1 1 U1 1 1 1 1 1 1 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0 89C51

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3 .硬件连线 将单片机中 J2 接口的 P1.0-P1.7 连接到 J15 接口发光二极管 D1-D8 端口上, 要求: P1.0 对应着 D1, P1.1 对应着 D2, ……, P1.7 对应着 D8. 4 程序设计内容 我们可以运用查表方式,将数据送到 P1 口上,每次送出的数

据是不同,具体的数据如下表 1 所示 P1. P1 P1. P1 P1. P1 P1. P1. 7 .6 5 .4 3 .2 1 0 D1 1 0 0 0 0 0 0 0 D1 亮 D2 亮 D3 亮 D4 亮 D5 亮 D6 亮 D7 亮 D8 亮 说明

D8 D7 D6 D5 D4 D3 D2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0

表1 5. 程序框图

6.C 语言程序

程序框图

#include <REGX51.H> unsigned char shuzu[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //送到 P1 口的数组 //延时程序 void delay(unsigned char time) { unsigned char a,b,c; for(a=0;a<=time;a++) for(b=0;b<=10;b++) for(c=0;c<=120;c++); } //主程序 void main(void) { unsigned char i; while(1) { for(i=0;i<8;i++) { P1=shuzu[i]; delay(10); } } }

//把数组里面的数据送给 P1 口

7,实验思考题 (1) ,请用户思考下,想出几种实现以上功能的编程方法. (2) 请用户思考下, , 使以上实验从左道右, 又右到左怎么实现.

实验三 串并转换 1,实验任务 熟悉并掌握串转并的 I/O 口扩展方法,同时熟悉 74HC595 的 使用方法. 2,实验原理图
R1 200 R2 200 R3 200 R4 200 R5 200 R6 200 R7 200 R8 200 D1 D2 D3 D4 D5 D6 D7 D8 1 1 U5 1 1 1 1 1 1 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 1 2 3 4 5 6 7 8 Q1 VDD Q2 Q0 Q3 SDI Q4 OE Q4 SCK Q6 LCK Q7 SCLK GND Q7' 74HC595 +5V 16 15 Q0 14 13 12 11 10 9 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9

U1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0 89C51

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3,硬件连线 将单片机 J2 接口的 P1.0,P1.1,P1.2,P1.3 分别与 74HC595 区 J9 接口的 OE,SCLK,LCK,SDI 连接.然后将 74HC595 区 J8 接口的 Q0 到 Q7 分别与发光二极管区 J15 接口的 D1 到 D8 连 接. 4,程序设计的内容 编写一段代码,从 74HC595 写入一个数据,通过外接 8 个发

光将数据显示出来 5,程序框图
开始

发送字节高位

字节向左移一位

移位8次? Y 锁存数据

N

结束

6,C 语言程序 #include <REGX51.H> #include <intrins.h> /*控制引脚定义*/ sbit CLK = P1^0; sbit RCLK = P1^1; sbit SER = P1^2;

void delayms(unsigned char x) //////延时 x ms { unsigned char y=123; unsigned char j; while(x--) { for(j=0;j<y;j++); } }

误差 16us

void wr595(unsigned char wrdat) { unsigned char i; for(i=8;i>0;i--)//循环八次,写一个字节 { CLK=0; SER=wrdat&0x01; //发送 BIT0 位 wrdat=wrdat>>1; //要发送的数据左移,准备发送下一位 _nop_(); _nop_(); CLK=1;

_nop_(); _nop_(); } RCLK=0; _nop_(); _nop_(); RCLK=1; } void main() { wr595(0x08); delayms(100); }7,实验思考题 (1)请用户编写一段程序,来实现 8 位发光二极管流水灯的控 制.

实验四 数码管显示 1,实验任务 认识共阳和共阴 LED 数码显示管,知道怎样通过三极管来驱 动数码管,通过数码管来显示一个 00—59 的计数器.

2,实验原理图
+5V Q1 PNP VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 R26 2.2K R27 2.2K Q2 PNP R28 2.2K DIG3 Q3 PNP R29 2.2K DIG4 Q4 PNP

U1 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD

DIG 1

DIG 2

A8

A9

A10

A11

18 19 20

89C51 U4

3,硬件连线 将单片机的 J1 接口的 P0.0—P0.7 接到数码管区的 J32 接口 上,P0.0 对应 segA ,P0.1 对应 segB,…,P0.6 对应 segG,P0.7 对应 segDp,数码管的控制端 J31 接口的 Q1,Q2,Q3,Q4 分别接到 P2.0 ,P2.1, P2.2, P2.3. 4,程序设计的内容 编写一段程序, 使数码管 Q1 和 Q2 能显示从 00 到 59 的计数. 5,程序框图

DIG .1 A F DIG .2 DIG .3 B DIG .4 G C DP D E

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

12 11 10 9 8 7 6 5 4 3 2 1

A D4 A D3 A D7 A D2 A D6 D IG4 A D1 D IG3 D IG2 A D5 A D0 D IG1

6,C 语言程序

//00-59 的秒计数器 #include <REGX51.H> unsigned char code table[]={0xC0,0xF9,0xA4,0xB0,0x99,

0x92,0x82,0xF8,0x80,0x90}; 共阳笔段码 unsigned char count; unsigned long s; void delay(unsigned char time);

//

//编写主程序

void main(void) { count=0; while(1) { count++; //计数器加 1

if(count==60) { count=0; }

//判断计数器是否等于 60

for(s=0;s<50;s++) 示停留的时间 {

//用此代码是来控制二个数码管显

P0=table[count%10]; 位数 P2_0=0; delay(1);

//首先显示 count 的个

//选通第 1 个数码管

P2_0=1; P0=table[count/10]; P2_1=0; delay(1); P2_1=1; } }

//关闭第 1 个数码管 //显示 count 的十位数 //选通第 2 个数码管

//关闭第 2 个数码管

}

//延时程序 void delay(unsigned char time) { unsigned char a,b,c; for(a=0;a<=time;a++) for(b=0;b<=10;b++) for(c=0;c<=120;c++);

} 7,实验思考题 (1) 为什么数码管都用 P0 口来传送数据而肉眼不能分清楚数码 管的交替时间.

(2)怎样来让数码管显示 A,B,C,D,E,F. (3)怎样使用 4 段数码管显示 9999.

实验五 实验五 外部中断

实验六 总线实验 实验六 I2C 总线实验 1,实验任务 熟练掌握 I2C 总线的控制,熟悉 I2C 器件的使用,通过 I2C 器件 24C02 实现写和读出存储器,将写进 24C02 存储器中的数 据读出,然后通过发光二极管来检验是否读写一致. 2,实验原理图
J34 1 2 3 4 A0 A1 A2 GND VCC WP SCL SDA 8 7 6 5 R32 10K +5V P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

AT24C02

+5V

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3,硬件连线 把单片机 J2 接口的 P1.4 和 P1.5 分别连接到 AT24C02 区 J38

接口的 SCL 和 SDA 信号上,并把 WP 接地,同时把发光二极管 区的 J15 连接到单片机 J3 接口上,D1 连接 P2.0,D2 连接 P2.1,……,D8 连接 P2.7 上. 4,程序设计的内容 编写了一段程序能将数据写进 I2C 器件 AT24C02 中,同时将 写进 AT24C02 中的数据读出,然后把读出的数据放进单片机的 P2 口.P2 口的数据通过发光二极管来验证.

5,程序框图

6,C 语言程序

#include <REGX51.H>

#define uchar unsigned char #define uint unsigned int #define WriteDeviceAddress 0xa0 #define ReadDeviceAddress 0xa1 sbit SDA=P1^5; sbit SCL=P1^4;

//定时函数 void delay(uint number) { unsigned char temp; for(;number!=0;number--) { for(temp=112;temp!=0;temp--); } }

//开始总线 void Start() { SDA=1; SCL=1; //发送起始条件数据信号

SDA=0;

// 发送起始信号

SCL=0; // 箝位 }

//结束总线 void Stop() { SCL=0; SDA=0; SCL=1; SDA=1; } // 发送停止信号 // 发送停止条件的时钟信号 // 发送停止条件的数据信号

//发 ACK0 void NoAck() { SDA=1; SCL=1; SCL=0; }

//测试 ACK bit TestAck() { bit ErrorBit; SDA=0; SCL=1; ErrorBit=SDA; SCL=0; return(ErrorBit); }

//写 8 个 bit 到 24c02 uchar Write8Bit(uchar input) { uchar temp; for(temp=8;temp!=0;temp--) {

SDA=(bit)(input&0x80); //判断发送位 SCL=1; 据 SCL=0; //时钟线为高,通知从器件开始接收数

input=input<<1; //准备下一位 } return(input); }

//写一个字节到 24c02 uchar Write24c02( uchar ch,uchar address ) {

Start(); Write8Bit(WriteDeviceAddress); if(TestAck()) { Stop(); return 1; } Write8Bit(address); TestAck(); Write8Bit(ch); TestAck(); Stop(); delay(10);

return 0; }

//从 24c02 中读出 8 个 bit uchar Read8Bit() { unsigned char temp,rbyte; SDA=1; //置数据线为输入方式

for(temp=8;temp!=0;temp--) { SCL=1; rbyte=rbyte<<1; if(SDA==1)rbyte++; SCL=0; } return (rbyte); } //置时钟线为高,数据有效 //左移补 0 //当数据线为高时,加 1

//从 24c02 中读出 1 个字 uchar Read24c02(uchar address) { uchar ch;

Start(); Write8Bit(WriteDeviceAddress); TestAck(); Write8Bit(address); TestAck();

Start(); Write8Bit(ReadDeviceAddress); TestAck(); ch=Read8Bit(); NoAck(); Stop(); return(ch); }

//主程序 void main(void) { uchar c1; Write24c02(0xaa,0x03); c1=Read24c02(0x03); P2=c1;

while(1); } 7,实验思考题 (1) 请用户思考下, I2C 总线上发送 n 字节数据, 向 和读取 n 字 节数据的程序怎样编写. (2)请用户思考下,I2C 的从设备控制程序应该如何编写.

实验七 定时器实验 1,实验任务 学习 89C51 内部定时计数器的使用和编程方法,进一步掌握 中断处理程序的编写方法. 2,实验原理图. 该实验原理图同实验一. 3,硬件连线 将单片机 J2 接口的 P10 连接到发光二极管区 J15 接口的 D1 上. 4,程序设计的内容 首先编写一个单片机 1S 定时的程序,使 P1.0 所接发光二极 管隔一秒点亮一次,点亮时间为一秒. 5,程序框图

子程序框图 主程序框图

6,C 语言程序 //目标是定时器产生 1 秒 LED 灯亮和灭 #include <REGX51.H> unsigned int count; bit flag; sbit LED=P1^0;

//编写主程序 void main(void) {

TMOD=0x01;

//定时器 T0 设置工作方式 1 //设置 50ms 定时

TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; while(1);

// 启动 T0 // 定时器 T0 中断允许 // // 中断允许 等待中断

}

//编写定时程序,定时的时间为 1S void time0() interrupt 1 using 0 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; count++; if(count==20) { count=0; LED=~LED; } } // 状态取反 // // 设置 50ms //

计数值加 1

7,实验思考题 (1)如果系统的晶振频率为 12MHz,怎样设计在 P1.0 引脚上输 出周期为 100ms 的方波. (2)怎样利用定时器中断方式来做秒计数器.

实验八 串口通信 1,实验任务 利用单片机的 TXD, RXD 口, 使用户学会单片机的串行口的 使用. 2,实验原理图
+5V J28 1 6 T1OUT 2 7 R1IN 3 8 4 9 5 C5 1uF
+

U1 C4 1uF 1 2 3 4 5 6 7 8 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

+

U3 C1+ Vcc V+ GND C1T1OUT C2+ R1IN C2R1OUT VT1IN T2OUT T2IN R2IN R2OUT MAX232 16 15 14 13 12 11 10 9

+5V T1OUT R1IN R1OUT T1IN

+

C6 1uF C7 1uF

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3,硬件连线 单片机的 P3.0 和 P3.1 连到 MAX232 的 12 和 11 脚上,用串 口线连接 PC 机和 J28. 4,程序设计的内容 编写一段程序,利用单片机的串行口向 PC 机发送 MCS-51 字符,通过在 PC 机的接收软件上看到不停的显示 MCS-51.

+

5,程序框图

程序框图

6,C 语言程序 #include<reg51.h> #define uchar unsigned char #define uint unsigned int uchar idata trdata[10]={'M','C','S','-','5','1',0x0d,0x0a,0x00}; main() {

uchar i; uint j; TMOD=0x20; //设置波特率为 9600 的定时器 1 方式和初始值 TL1=0xfd; TH1=0xfd; SCON=0xd8; //定义方式 3 PCON=0x00; TR1=1; while(1) { i=0; while(trdata[i]!=0x00) { SBUF=trdata[i]; while(TI==0); TI=0; i++; } for(j=0;j<12500;j++); } } //延时 //发送字符串

7,实验思考题 (1)请用户考虑下怎样编写一个单片机串行口发送和接收的程 序. (2)请用户思考下,如果是单片机与单片机之间进行串行口通 讯应如何进行.

实验九 液晶显示

1,实验任务 主要了解 1602 液晶模块的控制方法,实现简单的字符显示. 2,实验原理图 3,硬件连线 用跳线依次将液晶模块区的 JP7 连接好. 4,程序设计的内容 通过编写一段程序,实现 1602 液晶模块上显示一段字符,从 而可以进一步进行人机交接操作. 5,程序框图

程序框图

6,C 语言

//用 1602 小液晶来显示 #include <REGX51.H> #define uchar unsigned char #define uint unsigned int

sbit LCM_E=P3^2 ; //定义接口 sbit LCM_RW=P3^1; sbit LCM_RS=P3^0; #define LCM_Data P0 //数据接口 void LCM_WriteData(uchar WDLCM); //写数据函数 void LCM_WriteCommand(uchar WCLCM,BuysC);//写指令函数 uchar LCM_ReadData(void); //读数据函数 uchar LCM_ReadStatus(void); //读状态 void LCM_Init(void); void DisplayOneChar(uchar X, uchar Y, uchar DData); void DisplayListChar(uchar X, uchar Y, uchar code *DData); void Delay5Ms(void); void Delay400Ms(void); void LCM_WriteCG(uchar dizhi,BuysC); void main(void) {

Delay400Ms();//启动等待,等 LCM 讲入工作状态 LCM_Init();//LCM 初始化 Delay5Ms();//延时片刻 DisplayListChar(3, 0, "HelloWorld"); DisplayListChar(5, 1, "MSC_51");

LCM_Data=255; while(1);

}

/****************************1602A **************************/











//函数原型:void LCM_WriteData(uchar WDLCM) //函数功能:1602A 写数据 //输入参数:要写入的数据 //输出参数:无 /****************************************************** ****************/ void LCM_WriteData(uchar WDLCM) { LCM_ReadStatus();//检测忙 LCM_Data = WDLCM; LCM_RS = 1; LCM_RW = 0; LCM_E = 0;//若晶振速度太高可以在这后加小的延时 LCM_E = 0;//延时 LCM_E = 1;

}

/****************************1602A **************************/











//函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC) //函数功能:1602A 写指令 //输入参数:要写入的指令 //输出参数:无 /****************************************************** ****************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC 为 0 时 忽略忙检测 { if(BuysC) LCM_ReadStatus();//根据需要检测忙 LCM_Data = WCLCM; LCM_RS = 0; LCM_RW = 0; LCM_E = 0; LCM_E = 0; LCM_E = 1; }

void LCM_WriteCG(uchar dizhi,BuysC)//BuysC 为 0 时忽略忙检测 { uchar m,n; if(BuysC) LCM_ReadStatus();//根据需要检测忙 LCM_WriteCommand(0x40,1); for(m=8;m>0;m--) { LCM_WriteData(dizhi); n++; }

} /****************************1602A **************************/ /*函数原型:uchar LCM_ReadData(void) /*函数功能:1602A 读数据 /*输入参数:无 /*输出参数:1602A 返回的数据 /****************************************************** ****************/ 读 数 据 函 数

uchar LCM_ReadData(void) { LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); }

/****************************1602A **************************/ /*函数原型:uchar LCM_ReadData(void) /*函数功能:1602A 读状态 /*输入参数:无 /*输出参数:1602A 返回的状态











/****************************************************** ****************/

uchar LCM_ReadStatus(void) {

LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & 0x80);//检测忙信号 return(LCM_Data); }

/****************************1602A **************************/ /*函数原型:void LCM_Init(void) /*函数功能:1602A 初始化 /*输入参数:无 /*输出参数:无











/****************************************************** ****************/

void LCM_Init(void) { LCM_Data = 0;

LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙 信号 Delay5Ms(); LCM_WriteCommand(0x38,0); Delay5Ms(); LCM_WriteCommand(0x38,0); Delay5Ms();

LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检 测忙信号 LCM_WriteCommand(0x08,1);//关闭显示 LCM_WriteCommand(0x01,1);//显示清屏 LCM_WriteCommand(0x06,1);// 显示光标移动设置 LCM_WriteCommand(0x0c,1);// 显示开及光标设置

}

/******************1602A 按 指 定 位 置 显 示 一 个 字 符 函 数 **********************/ /*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData) /*函数功能:1602A 按指定位置显示一个字符 /*输入参数:X 坐标 Y 坐标 要显示的字符

/*输出参数:无 /****************************************************** ****************/

void DisplayOneChar(uchar X, uchar Y, uchar DData) { Y &= 0x1; X &= 0xF;//限制 X 不能大于 15,Y 不能大于 1 if (Y) X |= 0x40;//当要显示第二行时地址码+0x40; X |= 0x80;// 算出指令码 LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码 LCM_WriteData(DData); }

/*******************1602A 按 指 定 位 置 显 示 一 串 字 符 函 数 *********************/ /*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData) /*函数功能:1602A 按指定位置显示一个字符 /*输入参数:X 坐标 Y 坐标 要显示字符串的首地址 /*输出参数:无 /******************************************************

****************/

void DisplayListChar(uchar X, uchar Y, uchar code *DData) { uchar ListLength; ListLength=0; Y &= 0x1; X &= 0xF;//限制 X 不能大于 15,Y 不能大于 1 while (DData[ListLength]>0x20)//若到达字串尾则退出 { if (X <= 0xF)//X 坐标应小于 0xF { DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符 ListLength++; X++; } }

}

/********************5ms ************************/









/*函数原型:void Delay5Ms(void) /*函数功能:5ms 延时 /*输入参数:无 /*输出参数:无 /****************************************************** ****************/

void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--);

}

/********************400ms ************************/ /*函数原型:void Delay400Ms(void) /*函数功能:400ms 延时延时 /*输入参数:无 /*输出参数:无













/****************************************************** ****************/

void Delay400Ms(void) { uchar TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); } }

7,实验思考题 (1)怎样来利用 1602 液晶模块显示汉字. (2)怎样来利用 1602 液晶模块显示图形.

实验十 译码器实验 1,实验任务 熟悉译码器的使用方法,灵活应用 74HC138 进行电路设计. 2,实验原理图

3,硬件连线 译 码 器 74LS138 的 J40 接 口 连 接 到 单 片 机 J2 接 口 的 P1.0—P1.5,A 对应 P1.0,B 对应 P1.1,C 对应 P1.2,G1 对应 P1.3,G2A 对应 P1.4,G2B 对应 P1.5,并且把 J37 接口的 Y0 到 Y7 分别连接到发光二极管 J15 接口的 D1 到 D8 上.

4,程序设计的内容 编写程序,通过单片机的 P1 口控制 74LS138 的数据输入端, 从而选通相应的数据输出位. 将译码器数据输出端口连接到 8 各 LED 指示灯,验证译码的正确性. 5,程序框图

主程序框图

6,C 语言程序 #include <REGX51.H> sbit A0 = P1^0; sbit B0 = P1^1; sbit C0 = P1^2; sbit G1 = P1^3; sbit G2A = P1^4; sbit G2B = P1^5;

//主程序 void main() { //设置译码器的使能 G2B=0; G2A=0; G1=1;

//译码器数据输入 A0=0; B0=0; C0=1; } 7,实验思考题 (1)请用户思考下,在单片机电路里面,74LS138 是如何产生 片选信号的.

第二篇 交通综合实验 实验一 称重实验 1,实验任务 , (1)掌握传感器称重检测的基本方法和检测电路. (2) 了解 A/D 转换基本原理和常用 A/D 转换芯片 ADC0809 的使用. (3)进一步熟悉 LED 数码管的编程方法.

2,设计方案 ,设计方案 首先利用由电阻应变式传感器组成的测量电路测出物质的 重量信号,以模拟信号的方式传送到 A/D 转换器.其次,由 A/D 转换电路把由差动放大器电路把传感器输出的微弱信号进行一 定倍数的放大,然后送 A/D 转换电路中.再由 A/D 转换电路把 接收到的模拟信号转换成数字信号,传送到显示电路,最后由显 示电路显示数据. 具体方案如下:

电阻应变 式传感器 输出信号

差 动 放 大电 路放大信号

A/D 转换电 显示电路 路(双积分) (LED)

(1)测量电路: )测量电路: 电阻应变式传感器就是将被测物理量的变化转换成电阻值 的变化 , 再经相应的测量电路而最后显示或记录被测量值的变 化.在这里,我们用电阻应变式传感器作为测量电路的核心.并 应根据测量对象的要求,恰当地选择精度和范围度. 电阻应变式传感器的组成以及原理: 电阻应变式传感器的组成以及原理 电阻应变式传感器简称电阻应变计. 当将电阻应变计用特殊 胶剂粘在被测构件的表面上时,则敏感元件将随构件一起变形, 其电阻值也随之变化, 而电阻的变化与构件的变形保持一定的线

性关系,进而通过相应的二次仪表系统即可测得构件的变形.通 过应变计在构件上的不同粘贴方式及电路的不同联接, 即可测得 重力,变形,扭矩等机械参数 电阻应变式传感器的测量电路: 电阻应变式传感器的测量电路: 电阻应变片的电阻变化范围为 0.0005—0.1 欧姆. 所以测量电 路应当能精确测量出很小的电阻变化, 在电阻应变传感器中做常 用的是桥式测量电路. 桥式测量电路有四个电阻,电桥的一个 对角线接入工作电压 E,另一个对角线为输出电压 Uo.其特点 是:当四个桥臂电阻达到相应的关系时,电桥输出为零,否则就 有电压输出,可利用灵敏检流计来测量,所以电桥能够精确地测 量微小的电阻变化. 测量电桥如图:
R5 E RP1 R6 R3 R4 R1

R2

称重传感器

它由箔式电阻应变片电阻 R1,R2,R3,R4 组成测量电桥, 测量电桥的电源由稳压电源 E 供给. 物体的重量不同, 电桥不平 衡程度不同,指针式电表指示的数值也不同.滑动式线性可变电

阻器 RP1 作为物体重量弹性应变的传感器,组成零调整电路,当 载荷为 0 时,调节 RP1 使数码显示屏显示零. (2)差动放大电路: 差动放大电路: 差动放大电路 本次设计中,要求用一个放大电路,即差动放大电路,主要 的元件就是差动放大器.在许多需要用 A/D 转换和数字采集的 单片机系统中,多数情况下,传感器输出的模拟信号都很微弱, 必须通过一个模拟放大器对其进行一定倍数的放大,才能满足 A/D 转换器对输入信号电平的要求,在此情况下,就必须选择一 种符合要求的放大器.仪表仪器放大器的选型很多,我们这里介 绍一种用途非常广泛的仪表放大器,就是典型的差动放大器.它 只需高精度 LM358 和几只电阻器,即可构成性能优越的仪表用 放大器.广泛应用于工业自动控制,仪器仪表,电气测量等数字 采集的系统中.本设计中差动放大电路结构图如下:
Vi1 A1 R8 Vi R7 I R8 Vo




A2 Vi2

推导过程:I=

Vi1 Vi 2 R7

Vo=(R8+R7+R8)I =(1+
2 R8 R7

)Vi,
2 R8 R7

则 Avf=1+

2,实验原理图 ,
ALE 1 2 3 4 5 6 7 RD1 D1 CP1 SD1 Q1 Q1 GND 74LS74 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 U2 AD2 15 16 AD0 17 AD4 18 AD5 19 AD6 20 AD7 21 22 23 24 25 OUT 26 27 传传传传传 28 D2 D1 VREF(-) GND D0 VREF(+) VCC D4 D5 CLOCK D6 OE D7 D3 ALE EOC START A2 A1 IN7 A0 IN6 IN0 IN5 IN1 IN4 IN2 IN3 ADC0809 14 AD1 13 12 11 10 9 8 7 6 5 4 3 2 1 CLK AD3 INT0 START X1A 1 2 SN74S02D (14) X1B 4 5 SN74ALS02D (14) WR 6 A15 3 RD VCC RD2 D2 CP2 SD2 Q2 Q2 14 13 12 11 10 9 CLK 8

U1 P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32

R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

+12V R10 20K 3 6 R11 20K 4 1 J6 5 4 3 2 1 OUT +5V GND R12 20K R16 1K R15 510K 2 6 -12V R17 510K +12V 4 1 R13 20K 2 R14 20K 7 6 3 UA741 5 U10 R19 5K R21 5K 3 UA741 7 OUT 5 2 UA741 7

U9 R18 5K R20 5K -12V 4 1 5 U11

接传传传

+12V

3,程序框图 , #include <reg51.h> #include <intrins.h> #include<absacc.h> #define uchar unsigned char #define uint unsigned int //管脚定义 sbit EOC=P1^0; uchar xdata *ad_adr; #define IN0 XBYTE[0x7FFF] uint datain; uchar datain; uint dataout,datac[4]={0}; float datamo;

uchar

code

tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9(共阳数码管) void delayms(unsigned char x) //////延时 x ms { unsigned char y=123; unsigned char j; while(x--) 误差 16us

{ for(j=0;j<y;j++); } }

void read() { *ad_adr=0; while(EOC==0) datain=*ad_adr; }

void Datapro(void) { datamo=(datain*5)/256.0;

//ADC0809 数据处理函数

dataout=(unsigned int)(datamo*1000); //////////强制转换 datac[3]=dataout%10;////////小数点后第三位/////四位数码管显示 datac[2]=dataout%100/10;/////////////第二位///////// datac[1]=dataout/100%10;//////////////第一位////////// datac[0]=dataout/1000;///////////////个位数/////

}

void Led(void) { P2_3=1; /////////////////P2 低四位控制数码管位选 P2_0=0; P3= tab[datac[0]]|0x80; //输出个位数和小数点 delayms(4); P2_0=1; P2_1=0; P3= tab[datac[1]]; delayms(4); P2_1=1; P2_2=0; P3= tab[datac[2]]; delayms(4); P2_2=1; P2_3=0; P3= tab[datac[3]]; delayms(4); //输出小数点后第三位 //输出小数点后第二位 //输出小数点后第一位

}

//主函数 main(void) { //初始化 uint count=50; datain=0; dataout=0; ad_adr=&IN0; *ad_adr=0; while(1) //读 ADC0809 和显示

{ count=count-1; if(count==0) { read(); count=50; } Datapro(); Led(); }

} 实验二 交通流检测仿真实验
+5V

8

U6 R TRIG GND CVolt VCC 4 C8 2 10pF C9 10pF 1 555 5 Q DIS THR 3 7

R23 150 J10 P10 1 2 3 CON3 +5V

Q6 1 6 D9

R25 100

GND R22 10k

R24 1.2K

+5V

实验三 电子时钟实验 1,实验目的 通过本次实验,更加熟练掌握 IIC 总线的变成方法,完成对 电子时钟的设计,进一步提高实际动手能力. 2,实验原理图
R30 10K U12 +5V Y2 1 2 3 4 Vcc2 Vcc1 X1 SCLK X2 I/O GND RST DS1302 R1OUT 10 T1IN11 INT012 INT113 T0 14 T1 15 WR 16 RD 17 18 19 20 8 7 6 5 SCLK IO RST P10 P11 P12 P13 P14 P15 P16 P17 1 2 3 4 5 6 7 8 9 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P1.7 RST/VPD VCC P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 40 39 38 37 36 35 34 33 32 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7

P3.0/RXD EA/VPP P3.1/TXD ALE/PROG P3.2/INT0 PSEN P3.3/INT1 P3.4/T0 P2.7 P3.5/T1 P2.6 P3.6/WR P2.5 P3.7/RD P2.4 P2.3 XTAL2 P2.2 XTAL1 P2.1 VSS P2.0

31 30 ALE 29 28 27 26 25 24 23 22 21 A15 A14 A13 A12 A11 A10 A9 A8

3,程序框图 4,实验程序

###########################DS1302 ############################## #ifndef _COLINLUAN_DS1302_H_ #define _COLINLUAN_DS1302_H_







#define uchar unsigned char

typedef struct systime { uchar cYear; uchar cMon; uchar cDay; uchar cHour; uchar cMin; uchar cSec; uchar cWeek; }SYSTIME;

extern void DS1302_Write(uchar ucData); extern uchar DS1302_Read(); extern void DS1302_Init(); extern uchar WDS1302(uchar ucAddr,uchar ucDar); extern uchar RDS1302(uchar ucAddr); extern void SetTime(SYSTIME sys); extern void GetTime(SYSTIME *sys);

#endif

###########################DS1302 ############################## #include <reg52.h> #define uchar unsigned char #define uint unsigned int





#define SECOND 0x80 #define MINUTE 0x82 #define HOUR #define DAY #define MONTH #define WEEK #define YEAR 0x84 0x86 0x88 0x8a 0x8c

//秒 //分钟 //小时 //天 //月 //星期 //年

sbit DS1302_RST=P1^7; sbit DS1302_SCLK=P1^4; sbit DS1302_IO=P1^5;

typedef struct systime { uchar cYear; uchar cMon;

uchar cDay; uchar cHour; uchar cMin; uchar cSec; uchar cWeek; }SYSTIME;

void DS1302_Write(uchar D) { uchar i; for(i=0;i<8;i++) { DS1302_IO=D&0x01; DS1302_SCLK=1; DS1302_SCLK=0; D=D>>1; } }

uchar DS1302_Read() { uchar TempDat=0,i;

for(i=0;i<8;i++) { TempDat>>=1; if(DS1302_IO) TempDat=TempDat|0x80; DS1302_SCLK=1; DS1302_SCLK=0;

} return TempDat; }

void WDS1302(uchar ucAddr, uchar ucDat) { DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); DS1302_Write(ucDat); DS1302_SCLK = 1; DS1302_RST = 0; } // 地址,命令 // 写 1Byte 数据

uchar RDS1302(uchar ucAddr) { uchar ucDat; DS1302_RST = 0; DS1302_SCLK = 0; DS1302_RST = 1; DS1302_Write(ucAddr); ucDat=DS1302_Read(); DS1302_SCLK = 1; DS1302_RST = 0; return ucDat; } // 地址,命令

void SetTime(SYSTIME sys) {

WDS1302(YEAR,sys.cYear); WDS1302(MONTH,sys.cMon&0x1f); WDS1302(DAY,sys.cDay&0x3f); WDS1302(HOUR,sys.cHour&0xbf); WDS1302(MINUTE,sys.cMin&0x7f); WDS1302(SECOND,sys.cSec&0x7f);

WDS1302(WEEK,sys.cWeek&0x07);

}

void GetTime(SYSTIME *sys) //讲 BCD 码转化为十进制数输出 { uchar uiTempDat; uiTempDat=RDS1302(YEAR|0x01); (*sys).cYear=(uiTempDat>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(0x88|0x01); (*sys).cMon=((uiTempDat&0x1f)>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(DAY|0x01); (*sys).cDay=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(HOUR|0x01); (*sys).cHour=((uiTempDat&0x3f)>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(MINUTE|0x01); sys->cMin=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(SECOND|0x01); sys->cSec=((uiTempDat&0x7f)>>4)*10+(uiTempDat&0x0f);

uiTempDat=RDS1302(MONTH|0x01); (*sys).cMon=uiTempDat&0x17;

uiTempDat=RDS1302(WEEK|0x01); sys->cWeek=uiTempDat&0x07;

########################### ############################## #include <reg52.h> #include "ds1302.h" uchar







code

tab[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0-9(共阳数码管)

//全局变量 SYSTIME time;

main()

{ P1=0xFF; P2=0xFF; //定时器 T0 初始化 TMOD=0x10; TH1=0xD8; TL1=0xF0; ET1=1; TR1=1; EA=1; //允许 T0 中断 //启动定时器 // 开中断 //定时器 T0(16 位定时/计数方式) //定时初值(10ms)

//设置时钟初值 time.cYear=0x88; time.cMon=0x05; time.cDay=0x25; time.cHour=0x10; //注意:初始化时用的是十进制,但

DS1302 是以 BCD 码的形式输出数据 time.cMin=0x30; time.cSec=0x00; time.cWeek=0x01; SetTime(time); while(1)

{ GetTime(&time); } }

//中断处理函数,用于数码管显示 void timer1(void) interrupt 3 using 1 { uchar MinL,MinH,HourL,HourH; TR1=0; TH1=0xD8; TL1=0xF0; //分钟两位 MinL=time.cMin%10; MinH=time.cMin/10; //定时初值(10ms)

//时钟两位

HourL=time.cHour%10; HourH=time.cHour/10;

//显示时 P2^3=1; P2^0=0; P0=tab[HourH]; delays(300);

P2^0=1; P2^1=0; P0=tab[HourL]; delays(300);

//显示分 P2^1=1; P2^2=0; P0=tab[MinH]; delays(300);

P2^2=1;

P2^3=0; P0=tab[MinL]; delays(300); TR1=1;

}


51单片机20个实验,代码详细.doc

51单片机20个实验,代码详细 - 单片机原理实验指导书 实验教学版本 第一章 单片机系统板说明 一、概述 单片机实验开发系统是一种多功能、高配置、高品质的 MCS-51...

单片机实验.doc

单片机实验 - 福州大学至诚学院 实验报告 《51 单片机原理与应用》 学姓系专

51单片机的20个实验_图文.pdf

单片机原理实验指导书 实验教学版本 第一章 单片机系统板说明一、概述 MCS-51 单片机教学与开发设 单片机实验开发系统是一种多功能、高配置、高品质的 备。适用于...

单片机实验内容.doc

单片机实验内容 - 单片机应用技术实验内容 实验一、仿真软件 Proteus 和

51单片机实验-实验六 简单IO口扩展实验.pdf

51单片机实验-实验六 简单IO口扩展实验 - 实验 6 一、实验目的 简单 I

单片机实验小结.doc

单片机实验小结 - 单片机实验小结 总结一:单片机实验小结 这周我们进行了单片机

单片机实验报告.doc

单片机实验报告 - ATM89C51单片机实验报告及其照片,设计中断电路,计数等实验现象... 单片机实验报告_学习总结_总结/汇报_实用文档。ATM89C51单片机实验报告及其照片,设...

单片机实验一.doc

单片机实验一 - 实验一 一、实验目的 熟悉使用 keil C 软件 二、实验内

单片机实验程序...doc

单片机实验程序.._职业技术培训_职业教育_教育专区。单片机实验程序.. 一1.

单片机实验1.doc

单片机实验1 - 学号 14142203527 序号 35 单片机原理与接口技术

单片机实验.doc

单片机实验_电脑基础知识_IT/计算机_专业资料。实验一 如图 1-1 所示,利

单片机实验程序.doc

单片机实验程序 - 北工大自动化单片机实验程序... 单片机实验程序_电子/电路_工程科技_专业资料。北工大自动化单片机实验程序 一1.修改例程一的源程序 (1)将 A 寄...

单片机实验PPT_图文.ppt

单片机实验PPT - 《单片机原理及应用》实验 信息学院 第一部分 51系统部分

单片机实验指导_59728.doc

单片机实验指导_59728 - 51 系列单片机 原理与应用实验 实验1 简单汇

单片机实验实验一_图文.doc

单片机实验实验一 - 单片机原理实验报告 学生姓名 所在班级 实验组成员 实验成

东南大学单片机实验报告测控技术与仪器.doc

单片机实验报告 2015/1/5 《单片机应用系统设计》 实验报告 姓院 名:

单片机实验4单片机实验DA转换实验.doc

单片机实验4单片机实验DA转换实验_计算机硬件及网络_IT/计算机_专业资料。单片机实验4单片机实验DA转换实验 实验报告? 课程名称: 实验项目: 专业班级: 姓名: 学 ...

单片机实验报告.doc

单片机实验报告 - 本科生实验报告 实验课程单片机原理及应用 学院名称核技术与自

单片机实验指导书201311003601_图文.doc

单片机实验指导书201311003601_调查/报告_表格/模板_实用文档。最新

单片机实验问题集锦_图文.ppt

单片机实验问题集锦 - 单片机实验中的主要问题 主要问题 1.联机下载 2.编程