《单片机原理及应用》课程设计
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
-LED数字显示电子时钟
《单片机原理及应用》
课程设计报告
专 业: 电子信息工程 班 级: 0901 姓 名:
指导教师:
二0 XX年 XX 月 XX 日
0
任务书:
一、设计
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
目
LED数字显示电子时钟
二、设计要求
1、
方案
气瓶 现场处置方案 .pdf气瓶 现场处置方案 .doc见习基地管理方案.doc关于群访事件的化解方案建筑工地扬尘治理专项方案下载
论证,确定总体电路原理图。
2、元器件选择,设计PCB图(或用万能电路实验板搭线)。 3、绘制程序流程图,编写汇编语言源程序(或C语言源程序)。 4、安装调试,实现数字时钟的基本功能,即能正确显示时、分、秒;可调整时
间;秒闪功能。
i
目录
一( 电路原理图和设计程序流程图 .................................................... 1
1. 单片机芯片选择方案 ................................................................... 1
2. 时钟主程序流程图 ....................................................................... 2
3. 按键扫描程序流程图 ................................................................... 2
4. 时钟程序流程图 ........................................................................... 3 二( 设计方案分析 ............................................................................... 3
1. 时钟电路 ...................................................................................... 3
2. 复位电路 ...................................................................................... 4
3. 按键电路 ...................................................................................... 4
4. 显示电路 ...................................................................................... 5
5. LED的结构与原理 ....................................................................... 5 三( 程序仿真 ....................................................................................... 6 四(
心得
信息技术培训心得 下载关于七一讲话心得体会关于国企改革心得体会关于使用希沃白板的心得体会国培计划培训心得体会
体会 ....................................................................................... 7 附一:参考书目 ..................................................................................... 8 附二:源程序 ......................................................................................... 8
ii
一( 电路原理图和设计程序流程图
电 源
模
按块 键单驱 模片动块 机模
模块
块
时钟模块 LED显示模块
图一 流程图
系统由51系列单片机AT89C51、按键、数码管显示、电源等部分构成。单片机部分包括时钟电路、复位电路;按键部分能够实现对时间的调整、设定。三个按键的功能分别为:小时的调整,分钟的调整,复位。电源部分(USB充电器)可输出5V电压,给系统供电。
1. 单片机芯片选择方案
方案一:AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器。主要性能有:与MCS-51单片机产品兼容、全静态操作:0Hz,33Hz、 三级加密程序存储器、32个可编程I/O口线、三个16位定时器/计数器、八个中断源、全双工UART串行通道、掉电后中断可唤醒、看门狗定时器、双数据指针、掉电标识符、易编程。
方案二:AT89C52是一个低电压,高性能CMOS 8位单片机,片内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM)。主要性能有:兼容MCS51指令系统、32个双向I/O口、256x8bit内部RAM、3个16位可编程定时/计数器中断、时钟频率0-24MHz、2个串行中断、可编程UART串行通道、2个外部中断源、6个中断源、2个读写中断口线、3级加
1
密位、低功耗空闲和掉电模式、软件设置睡眠和唤醒功能。
从单片机芯片主要性能角度出发,本数字电子钟单片机芯片选择设计采用方案一。
2. 时钟主程序流程图
时钟主程序流程图如图二所示。进入系统后首先实现程序的初始化,然后进入主程序,定时器开始计时,当定时器发生中断时刷新数码管同时显示,之后实现中断与显示的循环。
图二 时钟主程序流程图
3. 按键扫描程序流程图
按键扫描程序流程图如图三所示。主程序进入键盘扫描程序后判断是否按下了P1.0。若是按下了P1.0为了去除抖动再进行确认是否按下P1.0,当确认按下了P1.0后判断按下P1.0的次数,若按了一次则进行秒调整,若按了两次则进行分调整,若按了三次则进行时调整。然后进入显示程序段进行显示刷新。
图三 按键扫描流程图
2
4. 时钟程序流程图
时钟程序流程如图四所示。设计中,采用51单片机的定时器的方式一定时,所以如图所示,当程序产生定时溢出中断时要重新赋初值。然后进行是否到一秒的判断,若到一秒则秒加一,若未到则直接退出中断。一秒到了加一以后进行是否秒到六十的判断,若秒到六十则秒清零,同时分加一,若秒未到六十则退出中断。分加一以后进行分是否到六十的判断,若未到六十则退出中断,若分到六十则分清零,同时小时加一。小时加一后进行小时是否到二十四的判断,若未到二十四则退出中断,若到二十四则清零,然后退出中断。
图四 时钟程序流程图
二( 设计方案分析
1. 时钟电路
时钟电路由外接谐振器的时钟振荡器、时钟发生器及关断控制信号等组成。时钟振荡器是单片机的时钟源,时钟发生器对振荡器的输出信号进行二分频。
CPU 的时钟振荡信号有两个来源:一是采用内部振荡器,此时需要在 XTAL1 和XTAL2 脚连接一只频率范围为0—33MHZ 的晶体振荡或陶瓷振荡器及两只 30pf 电容。二是采用外部振荡,此时应将外部振荡器的输出信号接至 XTAL1 脚,将XTAL2 脚浮空。
3
利用单片机内部的定时功能来实现时钟的走时,通过编程实现每 50 毫秒产生一次中断,中断20 次后,秒单元加1,秒单元加到60 时,跳回到零再继续加,同时分单元加1;当分单元加到60 时,跳到零再继续加,同时时单元的个位加1,以次类推,从而实现秒、分、小时的走时。
本次设计中采用的是内部振荡器,频率为 12MHZ 的晶体振荡器及 30pf 瓷片电容 。
2. 复位电路
复位是指在规定的条件下,单片机自动将CPU 以及与程序运行相关的主要功能部件、I/O 口等设置为确定初始状态的过程。如果电路参数不符合规定的条件或干扰导致单片机不能正确的复位,系统将无法进行正常的工作,因此,复位电路除了要符合厂家规定的参数外,还要滤除可能的干扰。
AT89S51 单片机内部有一个由施密特触发器等组成的复位电路。复位信号是从其9 脚,即RST 脚输入的。AT89S51单片机规定,当其处于正常工作基于51 单片机的数字时钟的设计状态,且振荡器工作稳定后,在RST 端有从高电平到低电平,且高电平时间大于两个机器周期的复位信号时,CPU 将完成对系统的复位。有两点需要注意:一、复位信号是高电平有效,二、高电平的保持时间
必须大于两个机器周期,可见高电平保持时间与振荡频率有关。
上电复位是指在系统上电时,RST 端自动产生复位所需要的信号将单片机复位。上电时,RST 端高电平的维持时间取决于R(1k)和C(22uF)的值。要使单片机可靠的复位,设计中使其维持的时间足够长。
3. 按键电路
方案一:采用阵列式键盘 此类键盘是采用行列扫描方式,当按键较多时可以减少占用单片机的 I/O口数目。
方案二:采用独立式按键电路 每个键单独占有一根I/O接口线,每个I/O口的工作状态互不影响,此类键盘采用端口直接扫描方式。但是当按键较多时占用单片机的I/O数目较多。 本系统只需三个按键,因此选择方案二。
如果按键采用中断的话,可以使单片机工作更加灵活、效率更高。由于该系统要用到 3 个按键,考虑到单片机的中断资源不够,所以就只用P1.0及P1.2 和P1.3 口。
4
4. 显示电路
方案一:采用动态显示 这种工作方式是分时轮流选通数码管的公共端,使得各个数码管轮流导通。当所有数码管依次显示一遍后,软件控制循环,使每位显示器分时点亮,外接7407组成显示电路。这种方式不但能提高数码管的发光效率,并且由于各个数码管的字段线是并联使用的,因而大大简化了硬件线路。 各个数码管虽然是分时轮流通电,但由于发光数码管具有余辉特性及人眼具有视觉暂留作用,所以适当选取循环扫描频率时,看上去所有数码管是同时点亮的,察觉不出有闪烁现象。
方案二:采用静态显示 数码管工作在静态显示方式下,共阴极或共阳极点连接在一起接地或高电平。每位的段选线与一个8 位并行口相连。只要在该位的段选线上保持段选码电平,该位就能保持相应的显示字符。该工作方式常采用串行口设定方式0 输出,外接74LS164 移位寄存器构成显示电路。
综合考虑,采用动态显示,采用一片7407芯片作为缓冲,分时选中三片数码管,从编程和提供的硬件等方面综合考虑后,决定采用动态显示的方法,
图五 显示电路 LED 显示器的结构与原理 5. LED的结构与原理
一般数码管内部有共阴和共阳两种连接方式。共阴就是将各个发光二极管的阴极接地,共阴极数码管如图 所示。图中一个发光二极管就相当于一个数码段。若给某段加上高电平,那么相对的段就会亮。根据要想显示的数值给各段数码管加上相应的高电平就可以显示不同的数值了。 共阳就是将各个发光二极管的阴极一起接在高电平上。 从图 中可以看出共阳的显示器与共阴的显示器有一点区别,就是它将阳极连接在一起接到高电平上。这样在想显示某个数的时候,各个
发光二极管赋低电平而不是在共阴时的高电平了,这就是共阴共阳的区别。
5
图六 LED的引脚图
由于它内部构造不同,在显示时代码也有所不同,共阴七段LED 段选码表 。
共阴七段LED段选码
显示字符 数显代码 显示字符 数显代码
0 0x3f 5 0x6d
1 0x06 6 0x7d
2 0x5b 7 0x07
3 0x4f 8 0x7f
4 0x66 9 0x6f 三(程序仿真
在proteus中画出原理图导入.hex文件,画出原理电路图。
图七 proteus仿真电路图
6
四( 心得体会
在程序调试过程当中,出现了以下几个问题:
首先在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。我们是在做单片机实习,我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
最后,在设计之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题
记录
混凝土 养护记录下载土方回填监理旁站记录免费下载集备记录下载集备记录下载集备记录下载
下来,并分析清楚,以免下次再碰到同样的问题。但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。
7
附一: 参考书目
[1] 刘同法,《单片机基础与最小系统实践》,北京,北京航空航天大学出版社,2007
[2] 蒋辉平,《单片机原理与应用设计》,北京,北京航空航天大学出版社,2007 [3] 谭丙煜,怎样撰写科学论文[M],2版,沈阳,辽宁人民出版社,1982 [4] 陈正义,单片机控制实习[D]
附二:源程序
#include
unsigned char
led[12]={0x3f,0x09,0xb3,0x9b,0x8d,0x9e,0xbe,0x0b,0xbf,0x9f,0x80,0x00};
//用一维数组定义0-9、横杠、全灭
unsigned char a[6];
unsigned char second=0,minute=0,hour=12; //初始值 unsigned char hour1=0,minute1=0; //闹钟初始值 unsigned char b[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //扫描 unsigned char k=0;
unsigned int temp; // 记录毫秒为秒的变量 unsigned char M,Shanshuo; //M模式、Shanshuo闪烁标志 sbit Miaoshan=P1^0;
sbit K1=P3^2;
sbit K2=P3^3;
sbit K3=P3^5;
sbit Beep=P3^6;
void delay(unsigned n) //延时,可根据n调节
{ int x,y;
for(x=0;x7&&hour<23&&minute==0&&second<1)||(hour1==hour&&minute1=
=minute&&second<10&&temp%500==0))
Beep=!Beep; //整点报时 、闹钟响铃
if(k==6)
k=0;
P0=a[k];
P2=b[k++];
delay(1);
P2=0x3f;
}
void display()
{ switch(M)
{
case 0:
{ a[0]=led[hour/10];
a[1]=led[hour%10];
9
a[2]=led[minute/10];
a[3]=led[second%10];
a[4]=led[second/10];
a[5]=led[minute%10];
}break;
case 1:
{ if(Shanshuo==1)
{ a[0]=led[hour/10];
a[1]=led[hour%10];
}
else
{ a[0]=led[11];
a[1]=led[11];
}
a[2]=led[minute/10];
a[5]=led[minute%10];
a[4]=led[second/10];
a[3]=led[second%10];
}break;
case 2:
{ a[0]=led[hour/10];
a[1]=led[hour%10];
if(Shanshuo==1)
{ a[2]=led[minute/10];
a[5]=led[minute%10];
}
else
{ a[2]=led[11];
a[5]=led[11];
}
a[4]=led[second/10];
a[3]=led[second%10];
}break;
case 3:
{ a[0]=led[hour/10];
a[1]=led[hour%10];
a[2]=led[minute/10];
a[5]=led[minute%10];
if(Shanshuo==1)
{ a[4]=led[second/10];
a[3]=led[second%10];
}
else
{ a[4]=led[11];
10
a[3]=led[11];
}
}break;
case 4:
{ if(Shanshuo==1)
{ a[0]=led[hour1/10];
a[1]=led[hour1%10];
}
else
{ a[0]=led[10];
a[1]=led[10];
}
a[2]=led[minute1/10];
a[5]=led[minute1%10];
}break;
case 5:
{ a[0]=led[hour1/10];
a[1]=led[hour1%10];
if(Shanshuo==1)
{ a[2]=led[minute1/10];
a[5]=led[minute1%10];
}
else
{ a[2]=led[10];
a[5]=led[10];
}
}break;
}
}
void key_prc() //按键扫描模块 { if(K1==0)
{ delay(10); //延时去抖
if(K1==0) //按K1进行模式切换
{ M++;
if(M==6)
M=0;
}
while(!K1); //等待按键释放
}
if(M!=0)
{ switch(M)
{ case 1: //模式--调时
11
{ if(K2==0)
{ delay(10); //延时去抖
if(K2==0) //加键按下
{ if(hour<23) hour++;
else hour=0;
}
while(!K2); //等待按键释放
}
if(K3==0)
{ delay(10);
if(K3==0)
{ if(hour> 0) hour--;
else hour=23;
}
while(!K3);
}
} break;
case 2: //模式--调分
{ if(K2==0)
{ delay(10);
if(K2==0)
{ if(minute<59) minute++;
else minute=0;
}
while(!K2);
}
if(K3==0)
{ delay(10);
if(K3==0)
{ if(minute>0) minute--;
else minute=59;
}
while(!K3);
}
} break;
case 3: //模式--调秒
{ if(K2==0)
{ delay(10);
if(K2==0)
{ if(second<59) second++;
else second=0;
}
while(!K2);
}
12
if(K3==0)
{ delay(10);
if(K3==0)
{ if(second>0) second--;
else second=59;
}
while(!K3);
}
} break;
case 4: //模式--闹钟调时
if(K2==0) {
{ delay(10);
if(K2==0)
{ if(hour1<23) hour1++;
else hour1=0;
}
while(!K2);
}
if(K3==0)
{delay(10);
if(K3==0)
{if(hour1>0) hour1--;
else hour1=23;
}
while(!K3);
}
} break;
case 5: //模式--闹钟调分
{ if(K2==0)
{ delay(10);
if(K2==0)
{if(minute1<59) minute1++;
else minute1=0;
}
while(!K2);}
if(K3==0)
{ delay(10); //延时去抖
if(K3==0) //减键按下
{ if(minute1>0)
minute1--;
else minute1=59;
}
while(!K3);
}
13
} break;
}
}
}
void main() //主函数 { init();
while(1)
{ key_prc();
display();
}
}
14