资源描述
学号
成绩
‘
沈阳城市建设学院
基于51单片机得电子时钟系统设计
课程名称 《单片机原理及应用》
专 业
班 级 16- 1 班
姓 名
2017 年 12 月 18日
目录
一、方案设计ﻩ3
1、1、单片机得选择方案ﻩ3
1.2、数码管得选择方案 3
1.3、上拉电阻得选择方案ﻩ3
1.4、总体设计框图 3
二、程序ﻩ5
三、硬件模块程序设计 5
3、1、单片机最小系统 5
3。2数码管显示模块ﻩ5
四、软件模块设计ﻩ6
五、系统硬件电路得设计 6
六、课程设计总结ﻩ7
七、参考资料 8
摘 要
数字钟已成为人们日常生活中不可少得必需品,给人们得生活,学习,工作带来极大得方便。本文介绍得数字钟就是一种利用数字电路来显示时、分、秒得装置,与传统得机械钟相比,它具有走时准确,性能稳定,显示直观,无机械传动装置等特点。
数字电子钟由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路等组成。秒信号产生器就是整个系统得时基信号,它直接决定计时系统得精度,将标准秒脉冲信号送入“秒计数器",该计数器采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”得时钟脉冲。“分计数器”也采用60进制计数器,每累计60分,发出一个“时脉冲"信号,该信号将被送到“时计数器”。“时计数器"采用24进制计数器,可以实现一天24h得累计。电路就是来对“时、分、秒"显示数字进行校对调整。
关键词:计数器;单片机;数码管; 上拉电阻
一、方案设计
1。1、单片机得选择方案
1、2、数码管得选择方案
1、3、上拉电阻得选择方案
1。4、总体设计框图
1、1、AT89C51就是美国ATMEL公司生产得低电压,高性能CMOS8位单片机,片内含4k bytes得可反复擦写得只读程序存储器(PEROM)与128 bytes得随机存取数据存储器(RAM),器件采用ATMEL公司得高密度、非易失性存储技术生产,兼容标准MCS—51指令系统,片内置通用8位中央处理器(CPU)与Flash存储单元,功能强大AT89C51单片机可为您提供许多高性价比得应用场合,可灵活应用于各种控制领域。如图1。1、1:
图 1。1。1
1.2、共阴极数码管就是一类数字形式得显示屏,通过对其不同得管脚输入相对得电流,会使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示得参数。由于它得价格便宜、使用简单、在电器,特别就是家电领域应用极为广泛,空调、热水器、冰箱等等。绝大多数热水器用得都就是数码管,其她家电也用液晶屏与荧光屏。如图1。2、1:
图1。2、1
1、3、上拉电阻(排阻,上拉就就是将不确定得信号通过一个电阻嵌位在高电平,电阻同时起限流作用、上拉就是对器件注入电流,下拉就是输出电流;弱强只就是上拉电阻得阻值不同,没有什么严格区分;对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流与电压得能力就是有限得,上拉电阻得功能主要就是为集电极开路输出型电路输出电流通道。所以根据本次课设设计选择上拉电阻。如图1。3.1:
图1、3.1
二、程序
见附页1
三、硬件模块程序设计
3、1、单片机最小系统
51单片机最小系统复位电路得极性电容C1得大小直接影响单片机得复位时间,一般采用10~30uF,51单片机最小系统容值越大需要得复位时间越短。51单片机最小系统起振电容C2、C3一般采用15~33pF,并且电容离晶振越近越好,晶振离单片机越近越好,P0口为开漏输出,作为输出口时需加上拉电阻,阻值一般为10k。其她接口内部有上拉电阻,作为输出口时不需外加上拉电阻、
3。2数码管显示模块
1、3、6位共阴数码管显示所示
四、软件模块设计
本次设计使用得软件就是Keil软件,它能够使用简单易懂得高级C语言对单片机进行软件开发,还就是C52系列兼容单片机C语言软件开发系统。
五、系统硬件电路得设计
系统得硬件主要包括单片机芯片,数码管显示,按键开关电路,它得硬件电路如下图所示,单片机采用广泛使用得AT89C51,系统采用12MHz得晶振,采用6位共阴数码管显示。
操作方法:对照原理图,按下SW2按键第一次设置小时数据,SW3按键加,SW4按键减,按下SW2按键第二次设置分钟,SW3按键加,SW4按键减,SW2按键第三次设置秒,SW3按键加,SW4按键减,SW2第四次退出设置。单独得一个按键SW1就是复位按键
硬件电路图如图所示图5。1
图5。1
六、课程设计总结
经过一周得时间以及对整本教材得知识总结,把课程设计分成了硬件与软件两大模块、总得来说,硬件部分很好入手,电路也教简单,主要涉及得就是简单得按键、电容、电阻、晶振与数码管。在软件部分,细分为了按键模块、显示模块、定时/计数模块,最后把几个模块整合在主程序模块中,使得程序简单明了。整个设计过程中遇到得最大问题就是软件得编写,由于采用得就是汇编语言,其间使用到得各种寄存器、存储器地址、变量很多,很难对程序得整体把握、通过电子钟得设计,对单片机得原理、结构、外围电路进一步得了解。在整个设计过程中学到了团体精神与独立解决问题得重要性、为以后得求职之路打下了基础。
七、参考资料
[1]《单片机原理与应用》 谢维成 杨加国 编著
[2] 《单片机应用与仿真调试》 严天峰 编著
[3]《模拟电子技术(第三版)》 胡宴如 耿苏燕 编著
[4]《数字电子技术(第三版)》 杨志忠 卫桦林 编著
附页1
#include〈reg51。h> //头文件 定义单片机内部寄存器
#define uchar unsigned charﻩ//宏定义 缩写成uchar
#define uint unsigned int//宏定义 缩写成uint
//数码管位端口定义
sbit w1=P2^2;
sbit w2=P2^3;
sbit w3=P2^4;
sbit w4=P2^5;
sbit w5=P2^6;
sbit w6=P2^7;
////////按键/////////////////////
sbit key1=P3^5;//设置时间
sbit key2=P3^6;//加
sbit key3=P3^7;//减
/////共阴数码管段信号编码////////
uchar code table[10]=//0—-—9
{0xFC,0x60,0xDA,0xF2,0x66,
0xB6,0xBE,0xE0,0xFE,0xF6};//
uchar num,miao,fen,shi;//计时 时分秒变量
uchar fen1,shi1;//闹钟变量
uchar d1,d2,d3,d4,d5,d6;//显示拆分数据
void delay(uint ms)//1ms 延时函数 数据保持用得 括号里面就是几大概就延时多少ms
{
uchar x;
ﻩfor(ms;ms>0;ms——)
ﻩ for(x=110;x>0;x——);
}
void display()//显示函数
{
ﻩd1=shi/10;//小时
ﻩd2=shi%10;//
d3=fen/10;//
d4=fen%10;//分钟
d5=miao/10;//
d6=miao%10;//秒
ﻩw1=0;P0=table[d1];delay(10);//第1位显示数据
P0=0x00;w1=1;//关闭显示消除动态扫描阴影
w2=0;P0=table[d2]|0x01;delay(10);//第2位显示数据
P0=0x00;w2=1;//关闭显示消除动态扫描阴影
w3=0;P0=table[d3];delay(10);//第3位显示数据
P0=0x00;w3=1;//关闭显示消除动态扫描阴影
ﻩw4=0;P0=table[d4]|0x01;delay(10);//第4位显示数据
P0=0x00;w4=1;//关闭显示消除动态扫描阴影
w5=0;P0=table[d5];delay(10);//第5位显示数据
P0=0x00;w5=1;//关闭显示消除动态扫描阴影
ﻩw6=0;P0=table[d6];delay(10);//第6位显示数据
P0=0x00;w6=1;//关闭显示消除动态扫描阴影
}
void keyscan()//调时按键扫描函数
{
uchar k_flag;
if(key1==0)//按键按下ﻩ 一下所有按键执行得模式都就是一样得
{
ﻩ delay(10);//延时消除按键抖动
ﻩﻩif(key1==0)//确定按键按下
ﻩ k_flag=1;
ﻩ while(key1==0);//等待按键松手
}
while(k_flag==1)//开始调整小时数据
{
ﻩdisplay();
ﻩ if(key1==0)
{
ﻩdelay(10);//延时消抖
ﻩ if(key1==0)
ﻩ ﻩk_flag=2;
ﻩﻩwhile(key1==0);
ﻩﻩ}
ﻩﻩif(key2==0)
ﻩ {
ﻩﻩ delay(10);
ﻩ if(key2==0)
{
ﻩ ﻩﻩshi++;
ﻩ ﻩif(shi==24)shi=0;
ﻩ }
ﻩ while(key2==0);
ﻩﻩ}
ﻩﻩif(key3==0)
ﻩﻩ{
ﻩﻩﻩdelay(10);
ﻩﻩif(key3==0)
ﻩﻩ {
ﻩﻩﻩ if(shi==0)shi=24;
ﻩ shi--;ﻩ
ﻩﻩ }
ﻩ while(key3==0);
ﻩ }ﻩ
ﻩ}
while(k_flag==2)//开始调整分钟数据
{
ﻩdisplay();
ﻩ if(key1==0)
{
ﻩ delay(10);//延时消抖
ﻩ ﻩif(key1==0)
ﻩﻩﻩ{
ﻩ ﻩk_flag=3;
ﻩ}
ﻩﻩ while(key1==0);
}
ﻩif(key2==0)
ﻩ {
ﻩﻩdelay(10);
ﻩﻩ if(key2==0)
ﻩ{
ﻩﻩﻩ fen++;
ﻩﻩif(fen==60)fen=0;
ﻩﻩﻩ}
ﻩﻩ while(key2==0);
ﻩﻩ}
ﻩif(key3==0)
{
ﻩ delay(10);
if(key3==0)
ﻩ{
ﻩ ﻩif(fen==0)fen=60;
ﻩﻩ fen-—;ﻩ
ﻩ }
ﻩﻩ while(key3==0);
}ﻩ
ﻩ}
while(k_flag==3)//开始调整秒数据
ﻩ{
ﻩ display();
if(key1==0)
{
ﻩ delay(10);//延时消抖
ﻩﻩ if(key1==0)
{
ﻩﻩﻩﻩk_flag=0;
ﻩﻩﻩ}
while(key1==0);
ﻩ }
if(key2==0)
ﻩﻩ{
ﻩdelay(10);
ﻩ if(key2==0)
ﻩ {
ﻩmiao++;
ﻩﻩﻩif(miao==60)miao=0;
ﻩﻩﻩ}
ﻩﻩ while(key2==0);
}
ﻩ if(key3==0)
ﻩ{
ﻩ ﻩdelay(10);
ﻩ if(key3==0)
ﻩ {
ﻩﻩﻩ if(miao==0)miao=60;
miao--;ﻩ
ﻩﻩ}
ﻩwhile(key3==0);
ﻩ }
}
}
void main()
{
TMOD=0x01;//定时器0 16位计时模式
TH0=(65536—50000)/256; //50ms定时
TL0=(65536-50000)%256; //50ms定时
EA=1;//开启总中断
ﻩET0=1;//开启定时器中断
ﻩTR0=1;//开启定时器
while(1)
{
ﻩﻩdisplay();//显示函数
ﻩkeyscan();//按键扫描函数
}
}
void T0_time() interrupt 1
{
ﻩTH0=(65536—50000)/256; //50ms定时
TL0=(65536—50000)%256; //50ms定时
ﻩnum++;//加一次50ms定时
if(num==20)//1S
{
ﻩnum=0;
ﻩﻩmiao++;
if(miao==60)
ﻩﻩ{
ﻩﻩ miao=0;
ﻩ ﻩfen++;
ﻩif(fen==60)
{
ﻩﻩ fen=0;
ﻩshi++;
ﻩﻩif(shi==24)shi=0;
ﻩﻩﻩ}
ﻩ}
}
}
展开阅读全文