单片机实训报告心得.docx

上传人:b****8 文档编号:9606962 上传时间:2023-02-05 格式:DOCX 页数:30 大小:267.83KB
下载 相关 举报
单片机实训报告心得.docx_第1页
第1页 / 共30页
单片机实训报告心得.docx_第2页
第2页 / 共30页
单片机实训报告心得.docx_第3页
第3页 / 共30页
单片机实训报告心得.docx_第4页
第4页 / 共30页
单片机实训报告心得.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

单片机实训报告心得.docx

《单片机实训报告心得.docx》由会员分享,可在线阅读,更多相关《单片机实训报告心得.docx(30页珍藏版)》请在冰豆网上搜索。

单片机实训报告心得.docx

单片机实训报告心得

广东轻工职业技术学院

实训报告

 

实训项目单片机实训

 

系别:

电子通信工程系

专业:

应用电子技术

班级:

嵌入式091班

姓名:

11222

学号:

16

指导老师:

丁向荣、赵慧

实训地点:

第三实训楼C309

实训时间:

2011年1月10日至1月14日

 

前言

 

单片机应用技术是现代电子设计的核心技术,学习单片机只是就是要将单片机应用到电子产品中,以单片机为控制核心实现电子系统所需实现的功能。

单片机的应用能力很多程度上决定了电子类专业学生电子设计与电子应用的水平与能力,尤其是高职学生更是如此。

本项目要求设计一个简单的电子时钟,用六位LED数码管实现电子时钟的功能,显示方式为时、分、秒,采用24h(小时)计时方式,使用按键开关可实现时分调整。

通过电子闹钟项目的课题设计,让同学们体验项目设计的要点,了解项目设计的流程,加深对单片机应用知识的学习,体会团队协作的力量所在。

为日后的嵌入式专业学习巩固基础。

目录

 

1.概述…………………………………………………………

1.1系统的作用………………………………………………………………

1.2系统的功能要求……………………………………………………………

2.系统硬件设计………………………………………………..

2.1系统的电路原理……………………………………………………………

2.2电路原理图………………………………………………………………

2.3各控制按钮控制功能说明……………………………………………….

3.系统软件设计……………………………………………….

4.系统调试…………………………………………………….

5.总结…………………………………………………………

 

1.概述

1.1系统的作用

本系统是利用AT89C51单片机结合6个七段显示器以24时制“时时分分秒秒”格式显示时间的电子定时闹铃,系统可以设置8组定时闹铃和1组倒计时功能;当定时闹铃和倒计结束时,该电子时钟通过蜂鸣器发出嘀嘀嘀响声;本系统还具有半点和整点报时功能,当现在时间为半点时会发出嘀的一声响,当现在时间为整点时报整点数响声。

由于该电子定时闹铃有强大功能可以在多种场合下使用,利用七段显示器发光也可以在夜晚和黑暗场合下使用。

1.2系统的功能要求

(1)使用6位七段显示器显示24时制时间。

(2)时间显示格式为“时时分分秒秒”。

(3)定时闹铃功能。

(4)倒计时功能。

(5)半点报时功能:

当现在时间为半点时,蜂鸣器发出“嘀”一声响。

(6)整点报时功能:

当现在时间为整点时,蜂鸣器发出现在时间整点数响声。

(7)当任一闹铃时间到时发出连续“嘀嘀嘀”响声,七段显示器显示“XHHMM”。

(8)当倒计时时间到时发出嘀嘀嘀响声,七段显示器显示“”。

(9)定时闹铃、倒计时和现在时间模式可以互相切换而不影响各自功能。

(10)具有4个按键来进行功能设置,可以设置当前时间、8组闹铃的时间设置和开关及倒计时的时间设置。

(11)通过复位按键可以重启系统。

 

2.系统的硬件设计

2.1系统的电路原理

(1)系统以AT89C51单片机为本电路的核心元件,通过单片机的P0.0~P0.7引脚和A102J排阻加上拉电压来驱动七段显示器段显示数字。

(2)通过单片机的P2.2~P2.7引脚连接A103J排阻拉升电压信号,控制6个8050NPN三极管使共阴极七段显示器连通接地来循环点亮6位七段显示器。

(3)在七段显示器供电的同时由P0脚驱动显示不同数字。

根据人眼的视觉暂留特点,调整延迟时间使所观察到时间数字是稳定的数字。

(4)系统使用了HYDZ蜂鸣器,通过单片机P3.7引脚连接8550PNP三极管推动发声。

(5)电路通过4个按键连接单片机P1.0~P1.3引脚低电平控制系统功能设置。

(6)单片机的复位电路,采用传统上电复位,通过Reset按键控制。

(7)电路可以通过+5V和+12V直流电供电,当使用+12V直流供电时,电路通过1个7805三端稳电器、2个35v100μF电解电容和1个50v10μF电解电容转换成+5V直流电供电。

(8)系统通过一个发光二极管指示电路供电是或正常。

2.2电路原理图

图示为数码管显示电路

 

 

图示为主程序电路图

2.3各控制按钮控制功能说明

KEY0(按键INT0):

调时向左移一位数——接P3.0

KEY1(按键INT1):

当前位加1——接P3.1

KEY2(按键T0):

当前位减1——接P3.2

KEY3(按键T1):

确定调时时间——接P3.3

S1:

切换闹钟调时模式(高电平)——接P3.4

S2:

中断程序(高电平),中断当前的闹钟或整点报时的响应——接P3.5

S3:

暂停和开始计时(高电平)——接P3.6

BELL:

蜂鸣器——接P3.7

——当整点报时和闹钟响应的时候会响。

LED灯——当整点报时和闹钟响应的时候会亮。

P1.0~P1.3分别接LED灯的高四位,P1.4~P1.7分别接灯的低四位。

P0.0~P0.7分别口接数码管的段选的a~h位

P2.0~P2.5口分别接数码管的位选的6~1位

3.软件设计

表一程序内存资源分配表

内存地址

变量名称

作用说明

20H

存放50毫秒计时

21H

存放0.5秒计时

22H

SECON

存放1秒计时

23H

MIN

存放1分计时

24H

HOUR

存放1小时计时

25H

用于中断1(#6H)

26H

用于显示中的闪烁

27H.0

闹钟标志位

27H.1

允许响铃

27H.2

用于标志分、秒(1为秒),闹钟功能时也一样

27H.3

闹钟总开关(1为开)

27H.4

用于闪烁标志

27H.5

用于闪烁

27H.6

秒表标志

27H.7

两组闹钟的标志位,默认值为0

28H-29H

用于保存闪烁时的调时区地址

30H-35H

存放调时区地址

36H

DISP

用于存放要显示的首字(例如秒)

37H-39H

第一组闹钟的时分

40H

SP

栈底

50H-52H

秒表

53H-55H

第二组闹钟的时分

56H

存放闹钟调分地址

57H

存放闹钟调时地址

2AH.0

闹钟组的切换标志(默认值为0)

2AH.1

切换(默认值为0)

2AH.2

闹钟第二组开关(默认值为0)

表二芯片端口资源分配表

芯片端口

变量名称

作用说明

P1.0

K1

操作键K1

P1.1

K2

操作键K2

P1.2

K3

操作键K3

P1.3

K4

操作键K4

P1.7

SPK

压电喇叭控制信号

P0

七段显示器数数字形状控制

P2.2

控制时间小时的十位七段显示器亮灭

P2.3

控制时间小时的个位七段显示器亮灭

P2.4

控制时间分钟的十位七段显示器亮灭

P2.5

控制时间分钟的个位七段显示器亮灭

P2.6

控制时间秒钟的十位七段显示器亮灭

P2.7

控制时间秒钟的个位七段显示器亮灭

P3.0

BELL

蜂鸣器

P3.1

LED半秒闪烁

P3.2

LED显示第一组闹钟是否开启

P3.3

LED显示第二组闹钟是否开启

表三寄存器资源分配表

寄存器

作用说明

 

0

R0

存放秒显示地址

R1

显示首址

R2

#06H

R3

#0FEH

R4

#3H

R6、R7

延时初始值

1

R0

用于keyB、C

R5

用于中断

流程图显示如下:

 

 

源程序清单:

#include

#defineucharunsignedchar

#defineled_dataP0//P0显示数码管当前位的数字

#defineled_bitP2//P2控制当前数码管显示的位数

intb;

ucharconls=0x00;//记录秒分时的个位数

ucharcons=0x00;//记录秒分时的十位数

ucharcon=0x00;//记录调时程序当前位数

ucharx=0x00;//记录闹钟

sbitkey0=P3^0;//key0控制调时位左移以一位

sbitkey1=P3^1;//key1控制挑时当前位数字+1

sbitkey2=P3^2;//key1控制挑时当前位数字-1

sbitkey3=P3^3;//确定当前挑时中断程序

sbitstop=P3^4;//用来暂时计时和启动计时

sbitbaojing=P3^5;//用以响应整点报时和闹钟

sbitnaozhong=P3^6;//用来开启闹钟调时程序

sbitbeep=P3^7;//用来终止当前整点报时或闹钟响应

ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//数码管当前位0~9的显示码

uchardatascan_con[6]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF};//数码管左到右6个位的显示

uchardatadis[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x0a,0x00};//数码管的显示码

uchardatatimedata[6]={0x00,0x00,0x00,0x00,0x00,0x00};//电子钟的初始时间:

00:

00:

00

uchardatasecclock[6]={0x00,0x00,0x00,0x00,0x00,0x00};//闹钟调时的初始时间:

00:

00:

00

uchari;

display();//显示数码管函数申明

keyscan();//调时按钮函数声明

//alarmcolk();

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

/*1ms延时显示程序*/

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

voiddelay(intz)

{

intx,y;

for(x=0;x

for(y=0;y<120;y++);

}

initializa();

 

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

/*主函数*/

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

voidmain()

{

initializa();

while

(1)

{

display();

keyscan();

//alarmcolk();

}

}

 

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

/*显示子程序*/

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

display()

{

uchark;

for(k=0;k<6;k++)

{

led_data=table[dis[k]];led_bit=scan_con[k];delay

(1);P2=0x00;

}

}

 

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

/*初始化子程序*/

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

initializa()

{

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

{

dis[i]=timedata[i];

}

TH0=0X3C;TL0=0XB0;

TH1=0x3c;TL1=0XB0;

TMOD=0X11;

ET0=1;

ET1=1;

TR0=1;

TR1=0;

EA=1;

}

 

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

/*调时按钮处理子程序*/

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

keyscan()

{

inta=0,j;

for(i=0,j=0;i<6;i++)//分别比较电子钟与闹钟时分秒

{

if(timedata[i]==secclock[5-i]&&timedata[0]!

=0)

j++;

}

if(j==6)

{

if(beep==0)//若都相等,且没关闭响应

{

for(i=1;i<10;i++)

{

baojing=0;

P1=0x00;

delay(500);

baojing=1;

P1=0xff;

delay(500);

}

}

}

if(key3==0){con=0;x=0;TR1=0;ET1=0;TR0=1;ET0=1;}//关闭调时按钮中断,继续显示电子钟的时间

elseif(naozhong==0)//开启调时按钮中断

{

EA=0;

if(key0==0)

{

delay(10);

while(key0==0);

if(dis[con]==10)

{

dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];

}

con++;TR0=0;ET0=0;TR1=1;ET1=1;

if(con>=6)//若左移位数超过6,则关闭调时按钮中断,继续显示电子钟的时间

{

con=0;TR1=0;ET1=0;TR0=1;ET0=1;

}

}

if(con!

=0)

{

if(key1==0)

{

delay(10);

while(key1==0);

timedata[con]++;//当前位数据+1

switch(con)

{

case1:

case3:

if(timedata[con]>=6)//1、3位满6进一

{

timedata[con]=0;

}break;

case2:

case4:

if(timedata[con]>=10)//2、4位满10进一

{

timedata[con]=0;

}

break;

case5:

//5位满2清零

if(timedata[con]>=3)

{

timedata[con]=0;

}

break;

default:

;

}

dis[con]=timedata[con];

dis[6]=0x0a;

}

}

if(con!

=0)

{

if(key2==0)

{

delay(10);

while(key2==0);

switch(con)

{

case1:

case3:

if(timedata[con]==0)

{

timedata[con]=0x05;//1、3位为0时的减1处理

}

else

{

timedata[con]--;//当前位数据-1

}break;

case2:

case4:

if(timedata[con]==0)

{

timedata[con]=0x09;//2、4位为0时的减1处理

}

else

{

timedata[con]--;//当前位数据-1

}break;

case5:

if(timedata[con]==0)

{

timedata[con]=0x02;//5位为0时的减1处理

}

else

{

timedata[con]--;//减1处理

}

break;

default:

;

}

dis[con]=timedata[con];dis[6]=0x0a;//送显示数据

}

}

EA=1;

}

elseif(naozhong!

=0)//开启调时按钮中断,功能类似上面

{

EA=0;

if(key0==0)

{

delay(10);

while(key0==0);

if(dis[x]>=10)

{

dis[7]=dis[x];dis[x]=dis[6];dis[6]=dis[7];

}

x++;TR0=0;ET0=0;TR1=1;ET1=1;

if(x>=6)

{

x=0;TR1=0;ET1=0;TR0=1;ET0=1;

}

}

if(x<=9)

{

if(key1==0)

{

delay(10);

while(key1==0);

secclock[x]++;

switch(x)

{

case1:

case3:

if(secclock[x]>=6)

{

secclock[x]=0;

}break;

case2:

case4:

if(secclock[x]>=10)

{

secclock[x]=0;

}

break;

case5:

if(secclock[x]>=3)

{

secclock[x]=0;

}

break;

default:

;

}

dis[x]=secclock[x];

dis[6]=0x0a;

}

}

if(x>=0)

{

if(key2==0)

{

delay(10);

while(key2==0);

switch(x)

{

case1:

case3:

if(secclock[x]==0)

{

secclock[x]=0x05;

}

else

{

secclock[x]--;

}break;

case2:

case4:

if(secclock[x]==0)

{

secclock[x]=0x09;

}

else

{

secclock[x]--;

}break;

case5:

if(secclock[x]==0)

{

secclock[x]=0x02;

}

else

{

secclock[x]--;

}

break;

default:

;

}

dis[x]=secclock[x];dis[6]=0x0a;

}

}

EA=1;

}

}

 

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

/*0.3s闪烁中断小程序*/

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

voidtime_intt1(void)interrupt3

{

EA=0;TR1=0;TH1=0X3C;TL0=0XB0;TR1=1;

cons++;

if(cons==6)//50msx6=300ms=0.3s

{

cons=0x00;

dis[7]=dis[con];dis[con]=dis[6];dis[6]=dis[7];

}

EA=1;

}

 

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

/*电子钟显示进位处理程序*/

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1