《单片机原理与应用》课程实验报告格式

更新时间:2024-04-26 21:26:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

(2010—2011学年第二学期)实验报告

课程名称 《单片机原理及应用》

专业班级 电子信息工程101班

姓名学号

指导教师 黄震梁 骆克静

所在学院 信息科技学院

2011年 6月

目 录

实验项目一 输入/ 输出端口的基本应用 实验项目二 定时/计数器的基本应用 实验项目三 中断系统的基本应用 实验项目四 LED实验项目五 实验项目六 实验项目七 ADC0808实验项目把 数码管的基本应用 单片机键盘的基本应用 单片机串口通讯实验 的基本应用

基于AT89C51的简单电子万年历

实验项目一 输入/ 输出端口的基本应用

1.实验目的

⑴了解MCS-51单片机的输入/输出端口的基本工作原理与使用方法;

⑵掌握MCS-51单片机的延时函数的时间估算方法。

2. 实验内容

实现与单片机某一端口相连的发光二极管的闪烁控制,要求点亮0.2s,熄灭0.2s;

3. 实验电路框图

U119XTAL1P0.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/RD39383736353433322122232425262728101112131415161718XTAL29RST293031+5vPSENALEEAR1330D1LED-BIGY12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51

4.实验任务分析

⑴硬件电路说明

Led阳极接有+5v电压,当阴极为低电平(p1.0输出低电平时)led的点

亮,当阴极为高电平(p1.0输出高电平时)led的熄灭,从而实现闪烁。

⑵软件设计说明

单片机的指令的执行时间很短,数量大多在微妙级级。因此,我们在执

行某一指令时,运用c语言,插入延时程序来达到我们的要求。

1

5.实验流程框图

p1.0输出“1”;L1熄灭 开始

6.实验过程记录

⑴实验过程

首先设置延时函数(void delay02s(void) ),其次:输入控制(使p1.0端口相

隔一段时间分别输出高低电平)

延时0.2秒 p1.0输出“0”;L1亮 延时0.2秒 ⑵问题及解决方法

问题1:p1.0端口的led灯闪烁不明显,猜想原因是延迟函数设置的时间太短。解决方法:增大延时函数for循环里的数值。

问题2:程序正确,led灯不亮。解决方法:所接电阻值太大,调低到330欧。

2

7.实验总结

⑴程序正确时led灯不亮应该注意led所接电阻的主值。

⑵注意延时函数的时间。

8.成绩评定

附录 实验源程序

#include sbit P1_0=P1^0; void delay02s(void)

{

unsigned char i,j,k; for(i=20;i>0;i--) for(j=20;j>0; for(k=248;k>0;k--); }

void main(void) { while(1)

3

{

P1_0=0; //p1_0口输出高电平,是灯点亮 delay02s();

P1_0=1; //p1_0口输出为低电平,是灯熄灭 delay02s(); }

}

实验项目二 定时/计算器的基本应用 1.实验目的

⑴掌握MCS-51定时/计数器的基本工作原理与使用方法;

⑵了解MCS-51单片机的中断服务程序的基本设计方法。

2. 实验内容

用定时器T0实现与P1.0端口相连的发光二极管以1Hz的频率闪烁,用定时器T1实

现与P1.1端口相连的发光二极管以2Hz的频率闪烁。

3. 实验电路框图

U119XTAL1P0.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/RD39383736353433322122232425262728101112131415161718XTAL29RST293031+5vPSENALEEAR1330D1LED-BIGY12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51

4. 实验任务分析

4

⑴硬件电路说明

Led阳极接有+5v电压,当阴极输出为低电平(p1.0输出低电平时)与当

阴极为高电平(p1.0输出高电平时)的时间周期为1s时,led实现1hz闪烁。同理,在p1.1端口实现周期为0.5秒的闪烁。

⑵软件设计说明

用定时器T0实现与P1.0端口相连的发光二极管以1Hz的频率闪烁,用定时器T1实现与

P1.1端口相连的发光二极管以2Hz的频率闪烁。

5. 实验流程框图

5

开始 设置T0工作方式,置初值 进入中断 开启定时器中断 两个计数器加一 NO 0.5s?返回 Led状态取反 NO 1s到? 等待中端 另一个led状态取反

6. 实验过程记录

⑴实验过程

采用中断方法,设置T0工作方式和初始值,开启定时中断,由于时间

超出最大值,故采用循环,用if来判断。最后采用中断使目的端口隔时输出高低电平就可实现目的。

⑵问题及解决方法

问题: 所设定的时间值超出了计数器的最大值,解决方法:故采用if判断语句来实现多次循环来增加时间

7. 实验总结

⑴可通过if等循环语句来解除定时器的最大时间设定。

⑵了解并掌握了在TMOD 在各个方式工作下的方式 8. 成绩评定

附录 实验源程序 #include

#define uchar unsigned char sbit P1_0=P1^0; sbit P1_1=P1^1; uchar i,n; void main() {

TMOD=0x01;

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

if(i>=10) { i=0;

6

P1_0=!P1_0; }

if(n>=5) { n=0;

P1_1=!P1_1; } } }

void time0_int(void) interrupt 1 {

TH0=(65536-50000)/256; TL0=(65536-50000)%6; i++; n++; }

实验项目三 中断系统的基本应用

1.实验目的

⑴掌握MCS-51中断系统的基本工作原理与使用方法;

⑵掌握MCS-51单片机的中断服务程序的基本设计方法。 2. 实验内容

基本部分:在P2端口接8个LED灯,用定时器T0,采用中断

方式,每隔1s使点亮的LED增加1个;当8个LED全部点亮后,重新开始下一个循环。

7

提高部分:在P3.2端口接一个按键开关,由它来控制以上LED

的循环点亮,要求也采用中断控制方式。

3. 实验电路框图

+5vU119XTAL1P0.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/RD393837363534333221222324252627281011121314151617D8LED-BLUED7R133018R2330XTAL2LED-BLUED59R3330RSTLED-BLUED1R4330293031PSENALEEALED-BLUED2R533012345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51LED-BLUED3R6330D4D6LED-BLUER7330LED-BLUER8330LED-BLUE 4. 实验任务分析

⑴硬件电路说明

在89c51的p2端口依次接入led灯并接上限流电阻

⑵软件设计说明

在定时器方式一下运用if函数来实现时间间隔为1秒,当时间经过9秒

来实现p2端口的取反。

5. 实验流程框图

8

开始 设置T0工作方式,置初值 NO 发光二极管增加1个点亮 等待中断 返回 1s到? 开启定时器中断 两个计数器加一 进入中断 8个都亮 8个二极管取反

6. 实验过程记录

⑴实验过程

编写程序导入89c51中运行,每经过一秒相对应端口led灯点亮,在全

部点亮后全部熄灭从新进入下一个循环。

⑵问题及解决方法

问题:如何在led全部点亮后再熄灭从新进入下一个循环。 解决方案:定时器在循环十次才点亮一盏led灯的,故经过80次后全部

9

点亮,在90次后就全部熄灭,进入下一个循环。

7. 实验总结

⑴在时间的设置上,应该准确计算出来才可以更好的来实现相应的目的

8. 成绩评定 附录 实验源程序

#include

unsigned int i,j;

void main(void) {

TMOD=0X01;

TH0=(65536-50000 )/256; TL0=(65536-50000 )%6; EA=1; ET0=1; TR0=1; P2=0XFF; while(1) {

if(i==10) { i=0; P2=P2<<1; } if(j==90) { j=0;

P2=~P2; } } }

void time0_int(void) interrupt 1 {

TH0=(65536-50000 )/256; TL0=(65536-50000 )%6; i++; j++; }

10

实验项目四 LED数码管的基本应用

1.实验目的

⑴了解LED数码管的基本工作原理与使用范围;

⑵掌握LED数码管静态显示程序的基本设计方法; ⑶掌握LED数码管动态显示程序的基本设计方法;

2. 实验内容

基本部分:用LED数码管设计一个0—99秒的计数器,LED

的显示方式可以采用静态显示方式实现;

提高部分:用LED数码管设计一个0—99.99秒的计数器,LED

的显示方式采用动态显示方式实现。

3. 实验电路框图

U119XTAL1P0.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/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51 4. 实验任务分析

11

⑴硬件电路说明

在89c51中在p0端口分别连接对应的数码管管脚,然后把它们两个共阳

端连接到p2.0,p2.1.

⑵软件设计说明

首先根据共阳端写入共阳的数组。运用中断,根据switch条件语句,来

显示十位和显示个位。从固定时间内+1直到99跳变为0.

5. 实验流程框图

进入中断 判断i末尾的值 等于1 设置定时器和建立数组 进入中断 开始 个位运行 i++ 等于十位运行 I=250? y 0 Second++;i=0

12

6. 实验过程记录

⑴实验过程

编写程序,画出模拟电路图,在89c51中导入程序后,开始仿真模拟

⑵问题及解决方法

问题:只调用一个两位的数码管,如何实现同时显示个位和十位并进行计数。解决方法:运用switch条件语句来实现

7. 实验总结

⑴一开始自己试验时采用的是静态显示方法(两个独立的数码管),故很

容易的完成了。当课上采用动态显示方式时,虽然变成复杂了些,但对于多个数码管的技术,显而易见这种方法是最好的。

8. 成绩评定 附录 实验源程序

#include unsigned char i,second;

unsigned char seg_t[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void main() {

TMOD=0x01;

TH0=(65536-4000)/256; TL0=(65536-4000)%6;

13

EA=1; ET0=1; TR0=1; second=0; while(1) {

switch(i&0x01) //i取1,2,3..转换16进制与0x01与,既然实现十位个位数码管

长亮

{

case 0 :{ P0=0xff; P0=seg_t[second]; P2=0x00; P2=0x02;};break; case1:{ P0=0xff; P0=seg_t[second/10]; P2=0x00; P2=0x01;};break; default: break; } } }

void time_int() interrupt 1 { TH0=(65536-4000)/256; TL0=(65536-4000)%6; i++;

if(i==250) //一秒钟 second++; if(second==99) second=0; }

14

实验项目五 单片机键盘的基本应用

1.实验目的

⑴了解独立式键盘的基本工作原理与使用范围;

⑵掌握独立式键盘的识别方法、软件消抖的原理; ⑶掌握独立式键盘程序的基本设计方法。

2. 实验内容

基本部分:在MCS-51的P3.2管脚接一独立按键,再P1端口

接8个LED,要求用按键来控制LED的循环点亮;

提高部分:将基本部分中LED的点亮方式改为闪烁。

3. 实验电路框图

15

R1R2220220R3220R4220R5220R6220R7220R8220D1D2D3D4D6D5D7D8LED-BLUEU119XTAL1P0.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/RD393837363534333221222324252627281011121314151617LED-BLUELED-BLUELED-BLUELED-BLUELED-BLUELED-BLUELED-BLUE18XTAL29RST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51

4. 实验任务分析

⑴硬件电路说明

8个接限流电阻的led灯分别接在p1端口,在p3.2处接入控制的按钮,

每按一下,led点亮的一个往下移动。

⑵软件设计说明

采用查询的方式,分别编写延时函数,按键判断函数,led灯向左移函

数和主函数。提高部分则增加闪烁函数。

16

5. 实验流程框图 有键按下? 有键按下? 寄存器初始化,I/O端口初始化 开始 延时10ms 执行代码处理送p1口显示 6. 实验过程记录

⑴实验过程

编写程序,画出模拟电路图,在89c51中导入程序后,开始仿真模拟。

⑵问题及解决方法

问题:按键按下有抖动。解决方法:在按键按下后增加延时函数,经过10ms左右再去检验。

7. 实验总结

17

⑴除了用查询的方法外还可以运用中断的方法来实现目的。

⑵在p3.3端口再接一个按钮,并在原来的key()程序中增加按键相反

的程序可以实现向右的移动。(两个按键实现左右移动的程序见下方的程序2)

8. 成绩评定 附录 实验源程序 1: #include

sbit button=P3^2; unsigned char count; unsigned char temp; unsigned char a,b; void delay10ms( ) { unsigned char i,k; for(i=0;i<20;i++) for(k=248;k>0;k--); } key() {if(button==0) { delay10ms( ); if(button==0)

{ count=count+1; if(count==8) while(button==0); } move()

{ a=temp<>(8-count);

18

{ count=0;}} }

P1=a|b; } void main() {count=0; temp=0xfe; P1=0xff; P1=temp; while(1) { key();

move();} }

2: /*********预处理部分*******/ #include

/*********变量定义部分*******/ sbit button=P3^2; sbit button1=P3^3; unsigned char count; unsigned char temp; unsigned char a,b;

/*********子函数部分*******/ void delay10ms( ) {

19

unsigned char i,k; for(i=0;i<20;i++) for(k=248;k>0;k--); } key() {

if(button==0) {

delay10ms( ); if(button==0) {

count=count+1;

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

while(button==0); if(button1==0) {

delay10ms( ); if(button1==0) {

20

count=count-1;

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

while(button1==0); }

move() {

a=temp<>(8-count); P1=a|b;

} void main() {

count=0; temp=0xfe; P1=0xff; P1=temp; while(1) {

21

key(); move();

} }

实验项目六 单片机串口通讯实验

1.实验目的

⑴了解MCS-51单片机串口的基本工作原理与使用范围;

⑵掌握MCS-51单片机串口通讯程序的基本设计方法。 2. 实验内容

基本部分:在PROTEUS软件中采用串口虚拟终端,编写一个

发送程序,将自己的学号发送到虚拟终端显示;

提高部分:在单片机甲的P1口接8个开关,再单片机乙的

P1口接8个LED,编写程序,将单片机甲的开关状态再单片机乙上显示出来。

3. 实验电路框图

22

U119XTAL1P0.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/RD39383736353433322122232425262728101112131415161718XTAL29RXDTXDRTSCTSRST293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51 RP1RESPACK-819U1XTAL1P0.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/RD39383736353433322122232425262728101112131415161719U2XTAL1P0.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/RD39383736353433322122232425262728101112131415161718123456789XTAL218XTAL29RST9RST293031PSENALEEA293031PSENALEEA12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C5112345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.780C51D9D8D7D6D5D4D3D2LED-BLUELED-BLUELED-BLUELED-BLUELED-BLUELED-BLUELED-BLUELED-BLUE

4. 实验任务分析

⑴硬件电路说明

在单片机甲的P1口接8个开关,再单片机乙的P1口接8个LED;甲的输出端和

乙的输入端相连,甲的输入端与乙的输出端相连。

⑵软件设计说明

发射时: 串行口的初始化,设置波特率选择查询方式;接收时:在满足

23

ren=1和ri=0的条件下,开始接收。再次接受时,ri必须清零。

5. 实验流程框图

6. 实验过程记录

⑴实验过程

编写程序,画出模拟电路图,在89c51中导入程序后,开始仿真模拟。

TI=0 RI=0 发送数据 接收数据 波特率.串行口方式设置 波特率,串行口方式设置 甲 乙 开始 开始 ⑵问题及解决方法

24

问题:在实验中甲机能够发射数据,但乙机不能显示目的。解决方案:一开始ren=1与ri=0未满足。首先要满足这个才行。

7. 实验总结

⑴发射机与接收机两者的波特率相同才能够正常接收。

⑵数据发射过程中,再次发送数据时,TI必须清零。在数据接收过程中:

必须满足REN=1和RI=0.

8. 成绩评定 附录 实验源程序 发射部分

/**********预处理部分**********/ #include

#define uchar unsigned char #define uint unsigned int

/**********主函数部分**********/ void main(void) {

SCON=0x40; //控制寄存器工作方式1 PCON=0x00;

TMOD=0x20; //定时器T0工作方式2 TH1=0xf3; //波特率为1200 TL1=0xf3; TR1=1; while(1) { SBUF=P1; //将P1数据存入寄存器 while(!TI){;} //等待数据存入完毕 TI=0; //发送中断标志软件清零 } }

25

接受部分

/**********预处理部分**********/ #include

#define uchar unsigned char #define uint unsigned int

/**********变量定义部分**********/

/**********子函数部分**********/

/**********主函数部分**********/ void main(void) {

SCON=0x40; //控制寄存器工作方式1,允许数据接收 PCON=0x00;

TMOD=0x20; //定时器T0工作方式2 TH1=0xf3; //波特率为1200 TL1=0xf3; TR1=1; while(1) { P1=SBUF; //将P1接收寄存器中的数据 while(!RI){;} //等待数据接收完毕 RI=0; //接收中断标志软件清零 } }

26

实验项目七 ADC0808的基本应用

1.实验目的

⑴了解ADC0808基本工作原理与使用方法;

⑵掌握MCS-51单片机ADC程序的基本设计方法。 2. 实验内容

基本部分:利用AT89C51和ADC0808设计一个简单的数字电

压表,测量范围0-4.99V,采用3位LED数码管将采样后的结果进行显示;

提高部分:错误!未找到引用源。将数字电压表的测量范围

改为0-9.99V;

错误!未找到引用源。将基本部分的单通道数字电压表设计成一个8通道的数字电压表。

3. 实验电路框图

27

+5vU1U2(CLOCK)19XTAL1P0.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/RD393837363534333221222324252627281011121314151617RV126272812345252423221216100XTAL2U2IN0IN1IN2IN3IN4IN5IN6IN7ADD AADD BADD CALEVREF(+)VREF(-)ADC0808CLOCKSTARTEOCOUT1OUT2OUT3OUT4OUT5OUT6OUT7OUT810672120191881514179RST1k+5.00Volts293031PSENALEEAOE912345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51

4. 实验任务分析

⑴硬件电路说明

在AD通道0中输入一定电压值,输出端连接c51的P0端口,P2端的数码

管显示相应的数值。

⑵软件设计说明

进行AD转换时,采用查询EOC的标志信号来检测AD转换是否完毕,若完

毕则把数据通过P0端口读入,经过数据处理之后在数码管上显示。进行AD装换之前要启动装换。

5. 实验流程框图

显示AD数据 开始

启动AD数据 读取AD数据

分出百,十,和个位 28

6. 实验过程记录

⑴实验过程

编写程序,画出模拟电路图,在89c51中导入程序后,开始仿真模拟。

⑵问题及解决方法

读取ad数据时并在数码管上显示时的数值不正确。解决方法:按比例来计算数值。

7. 实验总结

⑴一开始读取AD数据时应该先选择某一特定的通道

⑵在数码管的显示百位十位个位时,应该按照比例来计算出来,否则显示

的数值不正确

8. 成绩评定 附录 实验源程序

#include #include

#define uint unsigned int #define uchar unsigned char unsigned char

0x80,0x90,0x40,0x79,0x24,0x30,0x19,0x12}; sbit ST_adc=P1^0; sbit OE_adc=P1^2; sbit EOC_adc=P1^1; void delay (void) {

unsigned char q,j; for(j=0;j<=10;j++)

for(q=0;q<=150;q++);

Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

29

}

void display(uint k1,uint k2, uint k3) {

P3=0x04; P2=Tab[k1]; delay(); P3=0x02; P2=Tab[k2]; delay(); P3=0x01;

P2=Tab[k3+10]; delay(); } void main() {

uint k,k1,k2,k3,dat; while(1) {

ST_adc=0; ST_adc=1; ST_adc=0;

while(!EOC_adc) OE_adc=1; P0=0xff; P2=P0;

dat=1.96*P0;

k1=(dat); //个位 k2=((dat/10));//十位 k3=(dat/100); //百位 for(k=10;k>0;k--)

{ display(k1,k2,k3); } }}

实验项目八 1.实验目的

基于AT89C51的简单电子万年历30

⑴了解电子万年历的基本工作原理与使用方法;

⑵掌握AT89C51设计电子万年历的基本方法。 2. 实验内容

基本部分:利用AT89C51和7段LED数码管设计一个简单的

电子万年历,能显示时间、星期、年、月、日,并能进行设置;

提高部分:错误!未找到引用源。将电子万年历增加一个闹

钟功能;

错误!未找到引用源。当设定的闹钟时间到时,让单片机演奏一段音乐。

3. 实验电路框图

年RP1RESPACK-7月R1220日R2220星期D1LED-REDD3LED-REDD2LED-REDD4LED-RED8765432U119XTAL1P0.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/RD39383736353433322122232425262728101112131415161718XTAL29RST293031PSENALEEA1C31nF12345678P1.0P1.1P1.2P1.3P1.4P1.5P1.6P1.7AT89C51BAT13VU281VCC1X1VCC22C16pf576X1RSTSCLKI/ODS1302CRYSTALX23C26pf 4. 实验任务分析

31

⑴硬件电路说明

DS1302三个口线分别连接C51的P3.4,P3.4,P3.6端口。P0,P1分别为

各个数码管的地址位.P2则为数码管的I/O口。

⑵软件设计说明

1:设置D1302的初始化时间;2:读取D1302的实时时间,设计函数D1302

—get1302(gettime);3:将DS1302的实时时间在数码管上显示。

5. 实验流程框图 DS1302串口发 输出一位数据 SCLK产生正 脉 冲 传输8位? Y N 返回 时间日期设置 发写多字节命令

写一个多字节 数据指针加1

3字节 Y N 返回 DS1302串口收 SCLK高电平 读 数 据,SCLK低 传输8位? Y N 返回 读时间日期 发读多字节命令 读一个多字节 数据指针加1 3字节 Y N 返回 32

6. 实验过程记录

⑴实验过程

编写程序,画出模拟电路图,在89c51中导入程序后,开始仿真模拟。

⑵问题及解决方法

问题:如何来调节年月日和星期。方法:uchar settime[]数组是用来初始化时间的。

7. 实验总结

⑴DS1302是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、

周日、时、分、秒进行计时。

⑵DS1302采用三线串行口通迅,占用IO口少。数据在SCLK的上升沿有效。每个

SCLK正脉冲锁存一位数据。

8. 成绩评定 附录 实验源程序

/**********预处理部分**********/ #include

#define uchar unsigned char #define uint unsigned int

/**********变量定义部分**********/ sbit T_CLK=P3^5; sbit T_IO=P3^4; sbit T_RST=P3^6;

uchar gettime[]={0,0,0,0,0,0,0};

uchar settime[]={0x50,0x59,0x13,0x01,0x06,0x05,0x12};//用于设置秒,分,时,日,月,星期,年

33

/**********子函数部分**********/ void delay_ms() {

uchar i,j;

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

for(j=0;j<248;j++); }

void DS1302_InputByte(uchar ucDa) //写入1byte数据 {

uchar i; uchar temp; temp=ucDa; for(i=8;i>0;i--) {

T_IO=temp&0x01; T_CLK=1; T_CLK=0;

temp=temp>>1; } }

uchar DS1302_OutputByte(void) //读取1byte数据 {

uchar i; uchar temp; temp=0;

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

T_CLK=0;

if(T_IO!=0)temp|=(1<

return(temp); }

void DS1302_W1302(uchar ucAddr,uchar ucDa) //写入数据,输入 :据 {

T_RST=0; T_CLK=0; T_RST=1;

DS1302_InputByte(ucAddr); DS1302_InputByte(ucDa); T_CLK=1; T_RST=0;

ucAddr:地址, ucDa:数34

}

uchar DS1302_R1302(uchar ucAddr) //读取DS1302某地址的数据 {

uchar ucDa; T_RST=0; T_CLK=0; T_RST=1;

DS1302_InputByte(ucAddr); ucDa=DS1302_OutputByte(); T_CLK=1; T_RST=0; return(ucDa); }

void DS1302_Get1302(uchar ucCurtime[]) {

uchar i;

uchar ucAddr=0x81; for(i=0;i<7;i++) {

ucCurtime[i]=DS1302_R1302(ucAddr); ucAddr+=2; } }

void DS1302_Set1302(uchar *pSecDa) {

uchar i;

uchar ucAddr=0x80;

DS1302_W1302(0x8e,0x00); for(i=7;i>0;i--) {

DS1302_W1302(ucAddr,*pSecDa); pSecDa++; ucAddr+=2; }

DS1302_W1302(0x8e,0x80); }

void BCD_Num(uchar BCD,uchar ptasc[]) {

uchar num;

num=(BCD&15)+((BCD>>4)*10); ptasc[0]=num/10; ptasc[1]=num; }

void display(uchar time[])

35

{

uchar i,asc[2];

uchar line[15]={2,0,0,0,0,0,0,0,0,0,0,0,0,0,0};

uchar led[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; uchar

table[15]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x01,0x02,0x04,0x08,0x10,0x20,0x40};//数码管地址为的选择 for(i=0;i<5;i++) {

BCD_Num(time[i],asc); line[12-2*i]=asc[0]; line[13-2*i]=asc[1];

} BCD_Num(time[6],asc); line[2]=asc[0]; line[3]=asc[1];

BCD_Num(time[5],asc); line[14]=asc[1]; for(i=0;i<15;i++) {

P2=0xff;

P2=led[line[i]]; if(i<=7){P1=table[i];P0=0x00;} else{P1=0x00;P0=table[i];} delay_ms(); } }

/**********主函数部分**********/ void main(void) {

DS1302_W1302(0x80,0x00); DS1302_Set1302(settime); while(1) {

DS1302_Get1302(gettime); delay_ms(); display(gettime); } }

36

本文来源:https://www.bwwdw.com/article/9vup.html

Top