物理机电学院课程设计报告
课程名称: 单片机数字时钟设计 专业班级: 学号: 学生姓名
指导教师:
完成时间: 2014.06.13 报告成绩:
数字时钟设计报告
一、设计任务与要求
1、用单片机设计一数字时钟: 设计基本要求:
(1)以24h (小时)计时方式;
(2)分别用四位或六位LED 数码管显示时、分、(秒); (3)使用按键开关可实现时、分调整; (4)能整点声光提示,能设置闹钟
二、方案设计与论证
根据要求数码管能显示一天的时间和闹铃时分,调整时间和设置闹铃,当时
间超过我们设置好的闹铃时间,闹铃铃声响起还有灯光闪烁。 方案一
我们可以用一个四位共阳数码管显示时钟时、分、秒以及闹铃时、分、秒,在调整时间或设置闹铃时间时候数字会闪烁,调试某个时、分就闪烁两个数字。 方案二
我们可以设置四个按键来调整数字时钟。其中两个按键能实现时、分的加减,一个按键能选择时间显示或是闹铃时间,最后一个按键实现闹铃开启和关闭及查看设定的闹铃时间及监视闹铃是否开启。
三、硬件电路设计
3.1总体描述
(1)单片机采用AT89C51型;
(2)时间显示电路:采用4个共阳极数码管,P0口驱动显示数字位码控制数码管显示位,P1口作数字段码控制0到9数字的显示;
(3)时间设置电路:P3.4、P3.5、P3.6、P3.7分别连接4个按键,实现调模式, 时间加和时间减;
(4)闹钟:P1.5口接扬声器。P0.7口小数点DP 3.2系统总框架图
四、软件设计
4.1程序流程图
4-3时分秒计时流程图如下图
4.2 函数模块及功能 (1)int main() 主函数
(2)void delay(int time) 延时
(3)void init() 初始化程序 (4)void time0() interrupt 1 定时器TO 中断,实现时分秒的计时 (5)void time1() interrupt 3 定时器T1中断,实现时分调整时闪烁 (6)void showshi()
四位共阳数码管显示,显示小时、分钟 (7)int GetKey()
获取按键,设定三个按键,赋给第四个按键查看闹铃功能 (8)void key(int KeyNum)
按键调整时间功能,实现时间和闹铃时、分的加减 (9)Int NaoZhong()
闹铃,设定时间到就蜂鸣器报警
五、仿真过程与仿真结果
5.1Proteus
仿真电路图
五、安装与调试
在KeiluVision4软件中编写数字时钟源程序,进行修改然后进行编译,把
编译好的程序通过STC_ISP软件下载进单片机开发板中的AT89C52RC 芯片,换到实验焊接的简易单片机电路板中,进行最后调试。
在调试过程中,经常碰到数字时钟数码管没显示数字,原因可能是用了共阴数码管的显示代码,头次就碰到。其他情况大多是是在位码段码时候设置错位选,还有就是要注意消隐及PI=0XFF。
四个按键实现选择时间和闹铃、加、减、闹铃开关查看设置闹铃。经常出现按键错乱或者不能用。主要是因为在设置按键口还有功能时候出现不匹配,还有闹铃没发时间到蜂鸣器报警,反而是灯亮,是因为定义XCLOCK 初始化XCLOCK 没等于0.
在修改程序时候常常出现修改错地方还有添加错位置,或者掉了一些符号数字。
调试后,实现实验要求: (1)以24h (小时)计时方式; (2)分别用四位或六位LED 数码管显示时、分、(秒); (3)使用按键开关可实现时、分调整; (4)能整点声光提示,能设置闹钟
六、结论与心得
本学期的课程设计巩固了我们上学期单片机所学内容,而且让我们对生活中的常见的单片机开发板以及AT89C52芯片的结构、功能和性能有了更准确地认识。将生活中的一些用品和书本知识联系在了一起,使我们的书本知识和生活常识方面都有了增长。
在 设 计 之 前 ,我 们 要 对 所 用 单 片 机 的 内 部 结 构 有 一 个 系 统 的 了 解 , 知 道 该 单 片 机 内 有 哪 些 资 源 ; 要 有 一 个 清 晰 的 思 路 和 一 个 完 整 的 的 软 件 流 程 图 ;在 设 计 程 序 时 ,不 能 妄 想 一 次 就 将 整 个 程 序 设 计 好,反 复 修 改、不 断 改 进 是 程 序 设 计 的 必 经 之 路 ;要 养 成 注 释 程 序 的 好 习 惯,一 个 程 序 的 完 美 与 否 不 仅 仅 是 实 现 功 能,而 应 该 让 人 一 看 就 能 明 白 你 的 思 路 ,这 样 也 为 资 料 的 保 存 和 交 流 提 供 了 方 便 ;在 实 习 过 程 中 遇 到 问 题 是 很 正 常 的 ,但 我 们 应 该 将 每 次 遇 到 的 问 题 记 录 下 来 ,并 分 析 清 楚 ,以 免 下 次 再 碰 到 同 样 的问 题。但是 从 中 学 到 的 知 识 会 让 我 受 益 终 身 。发 现 、提 出、分 析、解 决 问 题 和 实 践 能 力 提 高 都 会 受 益 于 我 在以 后 的 学 习 、 工 作 和 生 活 中 。
七、参考文献
[1]、周润景. 基于Proteus 的电路及单片机设计以仿真[M].北京. 北京航空航天大学出版社,2006.
[2]、谭浩强.C 程序设计[M].北京:清华大学出版社,1991.
[3]、刘守义. 单片机应用技术[M]西安:西安电子科技大学出版社,2002.
[4]孙涵芳2.MCS-51/96系列单片机及应用[M].北京. 北京航空航天大学出版社,1988. [5]51单片机原理与实践(C 语言版)[M].北京. 北京航空航天大学出版社,2011.
附:源程序代码
/*************************************** 课题:电子时钟设计(数码管)
数码管:段码为:P0接段 a-g 位码分别为:P1 蜂鸣器:P1.5
***************************************/ #include #define duanma P0 #define weima P1
sbit smg1=P1^0;/sbit smg2=P1^1; sbit smg3=P1^2; sbit smg4=P1^3; sbit dp=P0^7; sbit BEEP=P1^5; sbit key1=P3^7; sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4;
int ArgTimer[6]={0,0,0,0};
int Argtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 0~9 int SetTime;
int miao,fen,shi; int Nmiao,Nfen,Nshi; int tt;
int shan,tsshan; int nao; //ling int clockkg; int FZWnao; int xclock; int seeclock; int Dp;
/*********************************************************** 延时
***********************************************************/ void delay(int time) { int x,y;
for(x=time;x>0;x--) for(y=110;y>0;y--); }
/*********************************************************** 初始化
***********************************************************/ void init()
{ nao=0; clockkg=0; FZWnao = 0; seeclock = 0; xclock = 0; shan = 0;tsshan = 0; SetTime = 0;
miao = 0; shi=13; fen=16; Nmiao = 0; Nshi=7; Nfen=30; Dp =0;tt = 0; EA = 1;
ET0 = 1; //T0 TMOD = 0x11; TH0 = 0x03c; TL0 = 0x0b0; TR0 = 1;
ET1 = 1; //T1 TH1 = 0x03c; TL1 = 0x0b0; TR1 = 0; }
/*********************************************************** 定时器T0中断
***********************************************************/ void time0() interrupt 1 {
TH0 = 0x03c; TL0 = 0x0b0;
tt++; //50ms*20=1s if(tt == 20) {
Dp=~Dp;
if(FZWnao != 0 && clockkg!=0) BEEP=~BEEP; tt=0; miao++;
if(miao>=60) {
miao=0; fen++;
if(fen>=60) {
fen=0; shi++;
if(shi>=24) shi=0;
} } } }
/*********************************************************** 定时器T1中断
***********************************************************/ void time1() interrupt 3 {
TH1 = 0x03c; TL1 = 0x0b0; tsshan++;
if(tsshan == 10) {
shan=~shan; tsshan = 0; } }
void showshi() {
if(nao == 0)
{ ArgTimer[0] = shi/10; ArgTimer[1] = shi%10; ArgTimer[2] = fen/10; ArgTimer[3] = fen%10; } if(nao != 0||seeclock != 0) {
ArgTimer[0] = Nshi/10; ArgTimer[1] = Nshi%10;
ArgTimer[2] = Nfen/10; ArgTimer[3] = Nfen%10; }
// weima = 0x01; //第一位 smg1=0;smg2=1;smg3=1;smg4=1;
if(shan != 0 && (SetTime == 2||SetTime == 4)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[0]]; delay(3); duanma=0xff;
// weima = 0x02; //第二位 smg1=1;smg2=0;smg3=1;smg4=1;
if(shan != 0 && (SetTime == 2||SetTime == 4)) duanma = 0xff;//weima = 0;
else
duanma = Argtable[ArgTimer[1]]; if(Dp!=0) dp = 0; delay(3); duanma=0xff;
// weima = 0x04; //第三位 smg1=1;smg2=1;smg3=0;smg4=1;
if(shan != 0 && (SetTime == 1||SetTime == 3)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[2]]; delay(3); duanma=0xff;
// weima = 0x08; //第四位 smg1=1;smg2=1;smg3=1;smg4=0;
if(shan != 0 && (SetTime == 1||SetTime == 3)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[3]]; if(clockkg!=0) dp= 0; delay(3); duanma=0xff;}
//***************************************// int GetKey() {
if(key1==0) {
while(key1==0) showshi(); // if(key1==0) return 1; }
if(key2==0) {
while(key2==0) showshi(); // if(key2==0) return 2; }
if(key3==0) {
while(key3==0) showshi(); // if(key3==0) return 3; }
物理机电学院课程设计报告
课程名称: 单片机数字时钟设计 专业班级: 学号: 学生姓名
指导教师:
完成时间: 2014.06.13 报告成绩:
数字时钟设计报告
一、设计任务与要求
1、用单片机设计一数字时钟: 设计基本要求:
(1)以24h (小时)计时方式;
(2)分别用四位或六位LED 数码管显示时、分、(秒); (3)使用按键开关可实现时、分调整; (4)能整点声光提示,能设置闹钟
二、方案设计与论证
根据要求数码管能显示一天的时间和闹铃时分,调整时间和设置闹铃,当时
间超过我们设置好的闹铃时间,闹铃铃声响起还有灯光闪烁。 方案一
我们可以用一个四位共阳数码管显示时钟时、分、秒以及闹铃时、分、秒,在调整时间或设置闹铃时间时候数字会闪烁,调试某个时、分就闪烁两个数字。 方案二
我们可以设置四个按键来调整数字时钟。其中两个按键能实现时、分的加减,一个按键能选择时间显示或是闹铃时间,最后一个按键实现闹铃开启和关闭及查看设定的闹铃时间及监视闹铃是否开启。
三、硬件电路设计
3.1总体描述
(1)单片机采用AT89C51型;
(2)时间显示电路:采用4个共阳极数码管,P0口驱动显示数字位码控制数码管显示位,P1口作数字段码控制0到9数字的显示;
(3)时间设置电路:P3.4、P3.5、P3.6、P3.7分别连接4个按键,实现调模式, 时间加和时间减;
(4)闹钟:P1.5口接扬声器。P0.7口小数点DP 3.2系统总框架图
四、软件设计
4.1程序流程图
4-3时分秒计时流程图如下图
4.2 函数模块及功能 (1)int main() 主函数
(2)void delay(int time) 延时
(3)void init() 初始化程序 (4)void time0() interrupt 1 定时器TO 中断,实现时分秒的计时 (5)void time1() interrupt 3 定时器T1中断,实现时分调整时闪烁 (6)void showshi()
四位共阳数码管显示,显示小时、分钟 (7)int GetKey()
获取按键,设定三个按键,赋给第四个按键查看闹铃功能 (8)void key(int KeyNum)
按键调整时间功能,实现时间和闹铃时、分的加减 (9)Int NaoZhong()
闹铃,设定时间到就蜂鸣器报警
五、仿真过程与仿真结果
5.1Proteus
仿真电路图
五、安装与调试
在KeiluVision4软件中编写数字时钟源程序,进行修改然后进行编译,把
编译好的程序通过STC_ISP软件下载进单片机开发板中的AT89C52RC 芯片,换到实验焊接的简易单片机电路板中,进行最后调试。
在调试过程中,经常碰到数字时钟数码管没显示数字,原因可能是用了共阴数码管的显示代码,头次就碰到。其他情况大多是是在位码段码时候设置错位选,还有就是要注意消隐及PI=0XFF。
四个按键实现选择时间和闹铃、加、减、闹铃开关查看设置闹铃。经常出现按键错乱或者不能用。主要是因为在设置按键口还有功能时候出现不匹配,还有闹铃没发时间到蜂鸣器报警,反而是灯亮,是因为定义XCLOCK 初始化XCLOCK 没等于0.
在修改程序时候常常出现修改错地方还有添加错位置,或者掉了一些符号数字。
调试后,实现实验要求: (1)以24h (小时)计时方式; (2)分别用四位或六位LED 数码管显示时、分、(秒); (3)使用按键开关可实现时、分调整; (4)能整点声光提示,能设置闹钟
六、结论与心得
本学期的课程设计巩固了我们上学期单片机所学内容,而且让我们对生活中的常见的单片机开发板以及AT89C52芯片的结构、功能和性能有了更准确地认识。将生活中的一些用品和书本知识联系在了一起,使我们的书本知识和生活常识方面都有了增长。
在 设 计 之 前 ,我 们 要 对 所 用 单 片 机 的 内 部 结 构 有 一 个 系 统 的 了 解 , 知 道 该 单 片 机 内 有 哪 些 资 源 ; 要 有 一 个 清 晰 的 思 路 和 一 个 完 整 的 的 软 件 流 程 图 ;在 设 计 程 序 时 ,不 能 妄 想 一 次 就 将 整 个 程 序 设 计 好,反 复 修 改、不 断 改 进 是 程 序 设 计 的 必 经 之 路 ;要 养 成 注 释 程 序 的 好 习 惯,一 个 程 序 的 完 美 与 否 不 仅 仅 是 实 现 功 能,而 应 该 让 人 一 看 就 能 明 白 你 的 思 路 ,这 样 也 为 资 料 的 保 存 和 交 流 提 供 了 方 便 ;在 实 习 过 程 中 遇 到 问 题 是 很 正 常 的 ,但 我 们 应 该 将 每 次 遇 到 的 问 题 记 录 下 来 ,并 分 析 清 楚 ,以 免 下 次 再 碰 到 同 样 的问 题。但是 从 中 学 到 的 知 识 会 让 我 受 益 终 身 。发 现 、提 出、分 析、解 决 问 题 和 实 践 能 力 提 高 都 会 受 益 于 我 在以 后 的 学 习 、 工 作 和 生 活 中 。
七、参考文献
[1]、周润景. 基于Proteus 的电路及单片机设计以仿真[M].北京. 北京航空航天大学出版社,2006.
[2]、谭浩强.C 程序设计[M].北京:清华大学出版社,1991.
[3]、刘守义. 单片机应用技术[M]西安:西安电子科技大学出版社,2002.
[4]孙涵芳2.MCS-51/96系列单片机及应用[M].北京. 北京航空航天大学出版社,1988. [5]51单片机原理与实践(C 语言版)[M].北京. 北京航空航天大学出版社,2011.
附:源程序代码
/*************************************** 课题:电子时钟设计(数码管)
数码管:段码为:P0接段 a-g 位码分别为:P1 蜂鸣器:P1.5
***************************************/ #include #define duanma P0 #define weima P1
sbit smg1=P1^0;/sbit smg2=P1^1; sbit smg3=P1^2; sbit smg4=P1^3; sbit dp=P0^7; sbit BEEP=P1^5; sbit key1=P3^7; sbit key2=P3^6; sbit key3=P3^5; sbit key4=P3^4;
int ArgTimer[6]={0,0,0,0};
int Argtable[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; // 0~9 int SetTime;
int miao,fen,shi; int Nmiao,Nfen,Nshi; int tt;
int shan,tsshan; int nao; //ling int clockkg; int FZWnao; int xclock; int seeclock; int Dp;
/*********************************************************** 延时
***********************************************************/ void delay(int time) { int x,y;
for(x=time;x>0;x--) for(y=110;y>0;y--); }
/*********************************************************** 初始化
***********************************************************/ void init()
{ nao=0; clockkg=0; FZWnao = 0; seeclock = 0; xclock = 0; shan = 0;tsshan = 0; SetTime = 0;
miao = 0; shi=13; fen=16; Nmiao = 0; Nshi=7; Nfen=30; Dp =0;tt = 0; EA = 1;
ET0 = 1; //T0 TMOD = 0x11; TH0 = 0x03c; TL0 = 0x0b0; TR0 = 1;
ET1 = 1; //T1 TH1 = 0x03c; TL1 = 0x0b0; TR1 = 0; }
/*********************************************************** 定时器T0中断
***********************************************************/ void time0() interrupt 1 {
TH0 = 0x03c; TL0 = 0x0b0;
tt++; //50ms*20=1s if(tt == 20) {
Dp=~Dp;
if(FZWnao != 0 && clockkg!=0) BEEP=~BEEP; tt=0; miao++;
if(miao>=60) {
miao=0; fen++;
if(fen>=60) {
fen=0; shi++;
if(shi>=24) shi=0;
} } } }
/*********************************************************** 定时器T1中断
***********************************************************/ void time1() interrupt 3 {
TH1 = 0x03c; TL1 = 0x0b0; tsshan++;
if(tsshan == 10) {
shan=~shan; tsshan = 0; } }
void showshi() {
if(nao == 0)
{ ArgTimer[0] = shi/10; ArgTimer[1] = shi%10; ArgTimer[2] = fen/10; ArgTimer[3] = fen%10; } if(nao != 0||seeclock != 0) {
ArgTimer[0] = Nshi/10; ArgTimer[1] = Nshi%10;
ArgTimer[2] = Nfen/10; ArgTimer[3] = Nfen%10; }
// weima = 0x01; //第一位 smg1=0;smg2=1;smg3=1;smg4=1;
if(shan != 0 && (SetTime == 2||SetTime == 4)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[0]]; delay(3); duanma=0xff;
// weima = 0x02; //第二位 smg1=1;smg2=0;smg3=1;smg4=1;
if(shan != 0 && (SetTime == 2||SetTime == 4)) duanma = 0xff;//weima = 0;
else
duanma = Argtable[ArgTimer[1]]; if(Dp!=0) dp = 0; delay(3); duanma=0xff;
// weima = 0x04; //第三位 smg1=1;smg2=1;smg3=0;smg4=1;
if(shan != 0 && (SetTime == 1||SetTime == 3)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[2]]; delay(3); duanma=0xff;
// weima = 0x08; //第四位 smg1=1;smg2=1;smg3=1;smg4=0;
if(shan != 0 && (SetTime == 1||SetTime == 3)) duanma = 0xff;//weima = 0; else
duanma = Argtable[ArgTimer[3]]; if(clockkg!=0) dp= 0; delay(3); duanma=0xff;}
//***************************************// int GetKey() {
if(key1==0) {
while(key1==0) showshi(); // if(key1==0) return 1; }
if(key2==0) {
while(key2==0) showshi(); // if(key2==0) return 2; }
if(key3==0) {
while(key3==0) showshi(); // if(key3==0) return 3; }