资源描述
基于C单片机的数字时钟课程设计(完整资料)
(可以直接使用,可编辑 优秀版资料,欢迎下载)
单片机技术课程设计
数字电子钟
学院:
班级:
姓名:
学号:
教师:
摘 要
电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。具有时间显示、整点报时、校正等功能。走时准确、显示直观、运行稳定等优点.具有极高的推广应用价值.
关键词:
电子钟 AT89C52 硬件设计 软件设计
目 录
一、数字电子钟设计任务、功能要求说明及方案介绍4
1.1 设计课题设计任务4
1。2 设计课题的功能要求说明4
1.3 设计课的设计总体方案介绍及工作原理说明4
二、设计课题的硬件系统的设计5
2。1硬件系统各模块功能简要介绍5
2.1.1 AT89C52简介5
2.1。2 按键电路6
三、设计课题的软件系统的设计6
3。1 使用单片机资源的情况6
3.2 软件系统个模块功能简要介绍7
3.3 软件系统程序流程框图7
3。4 软件系统程序清单7
四、设计课题的设计结论、仿真结果、误差分析9
4.1 设计结论及使用说明9
4。2 仿真结果10
结 束 语12
参考文献12
附 录13
附录A:程序清单13
一、数字电子钟设计任务、功能要求说明及方案介绍
1.1 设计课题设计任务
设计一个具有特定功能的电子钟。具有时间显示,并有时间设定,时间调整 功能。
1。2 设计课题的功能要求说明
设计一个具有特定功能的电子钟。该电子钟上电或按键复位后能自动显示系统提示符“d.1004—22”, 进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态.
1。3 设计课的设计总体方案介绍及工作原理说明
本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:
图1—1总体设计方案图
本电子钟的所有的软件、参数均存放在AT89C52的FlashROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
二、设计课题的硬件系统的设计
2.1硬件系统各模块功能简要介绍
2.1。1 AT89C52简介
(1) 兼容MCS51指令系统;
(2)8kB可反复擦写(大于1000次)Flash ROM;
(3)32个双向I/O口;
(4)256x8bit内部RAM;
(5)3个16位可编程定时/计数器中断;
(6)时钟频率0-24MHz;
(7)2个串行中断,可编程UART串行通道;
(8)2个外部中断源,共8个中断源;
(9)2个读写中断口线,3级加密位;
(10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;
(11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。
它的价格便宜,功能强大,能耗低。很大程度上减少总电路的复杂性,提高了所设计系统的稳定性。其芯片引脚图如图2-1所示。
图2-1 单片机AT89S52引脚图
2。1.2按键电路
图2—2 按键图
三、设计课题的软件系统的设计
3.1 使用单片机资源的情况
设计课题使用单片机资源的情况如下:
P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;调整选择键KEY1:P1.0;通过选择键选择调整位,选中位闪烁;增加键KEY2:P1.1;按一次使选中位加1;减少键KEY3:P1.2;按一次使选中位减1;此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下:
(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-59—00,且控制闹钟状态的的红色led灯为亮的状态;
(2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节;
(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节;
(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节;
(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节;
(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态;
(7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。闹铃状态默认为开启。
3.2 软件系统个模块功能简要介绍
本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。
主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制.
中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。
键盘输入程序模块:主要是用于确定按键并得到特定的键码值。
数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。
延时模块:程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。
3。3 软件系统程序流程框图
系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous 进行仿真,读出显示数据。
3.4 软件系统程序清单
本电子钟实现24小时制,8位数码管显示时分秒,显示式:12-59—00。
通过4只按键来调整时间:
KEY1(P1.0):调整选择键,选中位闪烁;
KEY2(P1.1):增加键,按一次使选中位加1;
KEY3(P1。2):减少键,按一次使选中位减1;
Bear(P3。1):到了整点和闹钟就会响;
Led (P1。2):闪烁;
P0口输出数码管段选信号,P2口输出数码管位选信号;
晶振12MHz。
图3-1主程序流程框图
图3-2显示时钟数组子程序 图3—3中断服务程序程序
四、设计课题的设计结论、仿真结果、误差分析
4.1 设计结论及使用说明
本设计为基于单片机的电子钟的设计。刚开始,我们很多地方理不清头绪,无从下手,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。
本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;设计中有三个按键,其中KEY1为启动键,KEY2为加控制键 KEY3为减控制键 。
图4—1 结果图
4。2 仿真结果
在Proteus ISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图所示。
实现功能:
可调整运行的电子钟具有三种工作状态:“d。1004—22"状态、运行状态、调整状态.
图4—2“d。1004-22”上电初始化运行状态仿真结果
图4—3时钟正常运行状态仿真结果
图4—4闹钟定时调整状态仿真结果
图4-5小时调整状态仿真结果
图4-6分钟调整状态仿真结果
结 束 语
单片机课程设计是一门很实用,很复杂的设计。这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。
完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、完成几个过程。刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有.可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。经过一天的努力,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。埋头苦干的过程是痛苦的,在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终于最后完善了程序.其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,就在这样的痛与快乐的交换中,我学到了知识。
通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距.知道了很多元器件有什么功效,在仿真仪器中是什么代码。有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。我遇到了不少问题,花费了很多的时间。这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性.理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时。最大的收获是:对键盘,显示器,C51语言的应用有了深刻的了解.
参考文献
[1]百度文库,基于C51单片机的程序设计.
[2] 百度百科,AT89C52简介
附录
附录A 程序清单
#include <reg51.h〉
#include〈absacc.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit KEY1=P1^1; //切换键
sbit KEY2=P1^2;ﻩ //minute ,hour调整加1定义
sbit KEY3=P1^7; //minute ,hour调整减1定义
sbit bear=P3^1; //闹铃
sbit led=P1^2;ﻩ //闹钟,整时灯闪烁
code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21}; //段码控制
char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar ms[8]={2,2,10,4,0,0,1,14};
uchar StrTab[8];
uchar minute=59,hour=12,second=0; //正常时钟秒,分,时定义
uchar minute1=00,hour1=00; second1=00; ﻩ//闹钟时钟秒,分,时 定义
uchar flag=0, flag1=0; //切换标志
uchar num=0;
uint count=0; ﻩﻩ //定时器计数,定时50ms,count满20,秒加1
/***********子函数声明*******************************************/
void xianshishuzu(); //显示数组子程序
void alarm(); //闹钟子程序 ﻩ ﻩ
/********************** 延时子程序*****************************/
void delay(uint z)
{
uint x,y;
for(x=0;x<z;x++)
for(y=0;y〈110;y++);
}
/**********************显示时钟子函数***************************/
void dispaly(uchar w[8])
{
unsigned int i,j,aa;ﻩ ﻩ
aa=0xfe; //位选初值1111 1110
for(i=0;i〈8;i++) //依次将数组w中八个数取出,并显示
ﻩ{
P2=aa; ﻩ //位选
ﻩﻩj=w[i];ﻩ //取出要显示的数码
ﻩ P0=tab[j]; ﻩ //取出段选编码
ﻩaa=_crol_(aa,1); //位选信号循环右移
ﻩdelay(1); ﻩ //显示延时
ﻩﻩP0=0xff; //消影
}ﻩ ﻩ
}
/***********************显示时钟数组子程序***********************/
void xianshishuzu()ﻩ ﻩ
{
ﻩ StrTab[1]=second/10;ﻩ //秒个位
StrTab[0]=second%10;ﻩﻩ //秒十位
StrTab[2]=10;ﻩﻩﻩﻩ //间隔符 -
StrTab[4]=minute/10;ﻩ //分个位
StrTab[3]=minute%10;ﻩﻩ //分十位
StrTab[5]=10; //间隔符 —
StrTab[7]=hour/10;ﻩﻩ //时个位
StrTab[6]=hour%10; ﻩ //时十位
ﻩ}
/**********************键盘扫描子程序*************************/
void keycan()
{
if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{
delay(10);ﻩ //按键1去抖以及动作
if(KEY1==0) //确认按键是否按下
{
flag++;//切换标志
}ﻩﻩ
ﻩ while(!KEY1);//释放按键
}
if(flag==1)
{ﻩ
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
hour++;//正常时间 小时 加1
if(hour==24)hour=0;
}ﻩ
ﻩ while(!KEY2) //释放按键
{
dispaly(StrTab);
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
hour—-;//正常时间小时 减1
if(hour==0)hour=23;
dispaly(StrTab);
}
ﻩ while(!KEY3)
{
dispaly(StrTab);
}
}
ﻩ }
if(flag==2)
{
if(KEY2==0) //按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute++;//分加1
if(minute==60)minute=0;
}ﻩ
while(!KEY2)
{ ﻩ
dispaly(StrTab);
}ﻩ
}
ﻩif(flag==3)ﻩﻩ //秒表的加1
{
if(KEY3==0)
{
delay(10);
ﻩ if(KEY3==0)
{
second++;//秒加1
if(second==0)second=59;
}
while(!KEY3)
{
dispaly(StrTab);
}
}
}
}
if(flag==3)ﻩ ﻩﻩ //闹钟对时
{
if(KEY2==0)
ﻩ {
delay(10);
if(KEY2==0)
{
hour1++;
if(hour1==24)hour1=0; //闹钟时间 小时 加1
}
while(!KEY2)
{
alarm();ﻩ
} ﻩ
ﻩ }
if(KEY3==0)
ﻩ {
delay(10);
if(KEY3==0)
{
hour1-—;
if(hour1==0)hour1=23; //闹钟时间 小时 减
}
while(!KEY3)
ﻩ {
alarm();
}
}
}
ﻩif(flag==4)
{
if(KEY2==0) //按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute1++;
if(minute1==60)minute1=0; //闹钟分加1
}
while(!KEY2)
{
alarm(); ﻩ
}
}
if(KEY3==0)//按键去抖以及动作
{
delay(10);
if(KEY3==0)
{
minute1—-;
if(minute1==0)minute1=59; //闹钟分减1
} ﻩ
}
while(!KEY3)
{
alarm();
}
}
}
/*******************蜂鸣器子程序****************************/
void beng()
{
bear=1;
ﻩ P3=0xfd;
ﻩﻩdelay(100);
ﻩ bear=0;
ﻩP3=0XFf;
ﻩﻩdelay(100);
}
/*****************整点报警子程序***************************/
ﻩvoid zhengdian (void)
{
ﻩﻩuchar i=0;
if((second==0)&(minute==0)) //整点报时
ﻩ{
ﻩ for(i=0;i<10;i++)
ﻩ ﻩ {
ﻩﻩ TR0=1; beng();dispaly(ms);
ﻩﻩ }
ﻩ }
ﻩ}
/********************************定时闹钟*******************************/
void alarm()
{
uint i;
if((hour==hour1&&second1==minute1&&(second>=second1&&second〈second1+5))||(minute==0&&second〈1))
for(i=0;i<3;i++)
{ beng();}
ﻩ ﻩ StrTab[1]=second1/10; ﻩ //闹钟秒个位
ﻩ StrTab[0]=second1%10; //秒十位
ﻩ StrTab[2]=10;ﻩ ﻩ //间隔符 -
ﻩ StrTab[4]=minute1/10; ﻩ //分个位
ﻩ StrTab[3]=minute1%10;ﻩﻩ //分十位
ﻩ StrTab[5]=10;ﻩﻩ ﻩ //间隔符 —
StrTab[7]=hour1/10;ﻩﻩ //时个位
ﻩﻩ StrTab[6]=hour1%10; ﻩ //时十位
ﻩ ﻩ TR0=0;
ﻩﻩ dispaly(StrTab);
ﻩﻩ xianshishuzu();ﻩ ﻩﻩ
}ﻩﻩ
/**************************中断子程序*********************************/
void time_() interrupt 1 //中断程序
{
ﻩ count++;
ﻩ TH0=(65536—50000)/256; ﻩ //0。5ms重新送初值
ﻩ TL0=(65536-50000)%256;
ﻩ if(count==20) ﻩ //定时器计数,定时50ms,count满20,秒加1
{
second++; count=0;
if(second==60) ﻩ //秒值等于60,秒清零,分加1
{
second=0;minute++;
if(minute==60)ﻩ ﻩ//分值等于60,分清零,时加1
ﻩﻩ {
minute=0; hour++;
if(hour==24) ﻩﻩ //时值等于24,时清零,返回,全部归零
{
hour=0;
}
}
}
}
xianshishuzu();
}
/***********************数字电子钟主函数***************************/
void main()
{
ﻩP1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=(65536-50000)/256; //预置计数初值,50ms
TL0=(65536-50000)%256;
EA=1; //总中断开
ﻩET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while(1) //主循环
{
if(flag==0)
{
TR0=0; dispaly(ms);//上电初始化就显示bad.1004-22
}
if(P1!=0XFF)
{
keycan();//按键提前扫描
}
if(flag>0)
{
if(flag==1||flag==2) { TR0=1; dispaly(StrTab); zhengdian ();}
//KEY1按第二次或第二次定时器开始,电子钟和整点报时正常显示
if(flag==3||flag==4) { TR0=0;alarm(); }
//按KEY1第三或第四次闹钟开始显示,分时的调整
ﻩif(flag==5){dispaly(StrTab); }
//按KEY1第五次返回电子钟正常显示
if(flag==6) {TR0=0; flag=0; dispaly(ms); }
//按KEY1第六次定时器关闭,切换标志请零,显示d。1004-22
}
}
}
课程设计报告
课程名称:单片机课程设计
报告题目:8位竞赛抢答器的设计
学生姓名:
所在学院:信息科学与工程学院
专业班级:
学生学号:
指导教师:
2013 年12月25日
课程设计任务书
报告题目
8位竞赛抢答器的设计
完成时间
12.15-12.29
学生姓名
专业班级
指导教师
职称
讲师
总体设计要求和技术要点
设计一个数字式电容测量仪电路,要求如下:
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示。
设置一个系统清除和抢答控制开关S,开关由主持人控制.
抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止.当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0。5s左右.
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止。
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00
工作内容及时间进度安排
第17周:
周一、周二:选题,明确任务,指导教师对课题进行讲解,资料检索
周三:硬件设计,硬件仿真
周四、周五:软件设计
第18周:
周一:综合调试
周二、周三、周四:书写课程设计报告
周五:答辩评分
课程设计成果
1.与设计内容对应的软件程序
2.课程设计总结报告
摘要
抢答器作为一种工具,已广泛应用于各种智力和知识竞赛场合。但抢答器的使用频率较低,且有的要么制作复杂,要么可靠性低.作为一个单位,如果专门购一台抢答器虽然在经济上可以承受,但每年使用的次数极少,往往因长期存放使(电子器件的)抢答器损坏,再购置的麻烦和及时性就会影响活动的开展,因此设计了本抢答器.
本设计是以八路抢答为基本理念。考虑到依需设定限时回答的功能,利用AT89C52单片机及外围接口实现的抢答系统,利用单片机的定时器/计数器定时和记数的原理,将软、硬件有机地结合起来,使得系统能够正确地进行计时,同时使数码管能够正确地显示时间。用开关做键盘输出,扬声器发生提示。同时系统能够实现:在抢答中,只有开始后抢答才有效,如果在开始抢答前抢答为无效;抢答限定时间和回答问题的时间可在1—30s设定;可以显示是哪位选手有效抢答,正确按键后有5s的音乐提示(即扬声器发出响声);抢答时间和回答问题时间倒记时显示,满时后系统计时自动复位及主控强制复位;按键锁定,在有效状态下,按键无效非法。
关键词:89c52;电路;显示;按键
目录
一、概述…………………………………………………………………………1
二、方案设计………………………………………………………………1
三、硬件电路设计…………………………………………………………2
1、抢答器的电路框图…………………………………………………………2
2、单元电路………………………………………………………………………………3
2。1、抢答器电路………………………………………………………………………3
2.2、时序控制电路……………………………………………………………………3
2.3、复位电路…………………………………………………………………………3
3、时钟震荡电路………………………………………………………………3
4、报警电路…………………………………………………………………3
四、软件设计………………………………………………………………4
1、系统主程序…………………………………………………………4
2、系统程序…………………………………………………………5
五、结论与心得………………………………………………………………………10
六、参考文献……………………………………………………………………10
一、概述
本实验电路由抢答电路、译码显示电路、主持人控制电路、定时电路、报警电路组成.通过复位按键FW,电路进入准备就绪状态。将抢答时间设定在30S,然后按下开始键开始抢答.,在电路中“S0-S7”为8路抢答器的8个按键,当有键按下,程序锁定信号,从P2口输出抢答者号码的七段码值,送到数码管显示,并封锁按键,保持刚才按键按下时刻的时间,禁止其他人按键的输入,从而实现了抢答的功能。当设定的抢答时间结束,仍然没有抢答键被按下,则产生已经超时的报警信号,结束抢答。当要进行下一次的抢答时,首先按一下复位按键,电路复位.
该设计是以MCS51为基础,结合单片机汇编语言知识,设计而成的8位竞赛抢答器。在伟福试验箱上实现仿真.
主持人按下“开始抢答键"既单脉冲键后,喇叭响0。5秒给出提示信号,并立刻进入抢答倒计时(预设30秒抢答时间)此时,数码显示管上显示倒计时时间:有选手抢答,停止计时,八段数码显示抢答时间和选手号;无选手抢答,倒计时30秒后,显示00。然后选手等待主持人按下按钮开始新一轮抢答。
注意:
(1)由于设计的局限性,如果在无人抢答期间,30秒还未到,主持人不能按下重新下一轮抢答按钮。
(2)由于试验箱上按钮数量有限,故选用开关代替按钮,供8位选手抢答使用。鉴于开关与按钮动作过程的差异,所以每次当选手抢答,拨下开关时必须将开关复位。
(3)当系统出现错误的时候,停止操作,重新编译开始。
二、方案设计
方案:该系统采用51系列单片机AT89C51作为控制核心,该系统可以完成运算控制、信号识别以及显示功能的实现.由于用了单片机,使其技术比较成熟,应用起来方便、简单并且单片机周围的辅助电路也比较少,便于控制和实现。整个系统具有极其灵活的可编程性,能方便地对系统进行功能的扩张和更改.MCS-51单片机特点如下: 〈1>可靠性好:单片机按照工业控制要求设计,抵抗工业噪声干扰优于一般的CPU,程序指令和数据都可以写在ROM里,许多信号通道都在同一芯片,因此可靠性高,易扩充。
<2〉单片机有一般电脑所必须的器件.
<3> 控制功能强:单片机指令除了输入输出指令,逻辑判断指令外还有更丰富的条件分支跳跃指令.
三、硬件电路设计
1、抢答器的电路框图
如图3。1。1所示为电路框图。其工作原理为:接通电源后,主持人按下开关即为“开始”状态,宣布“开始”抢答器工作。编号显示器灭灯,定时器显示设定时间。定时器倒计时,扬声器给出5s声响提示。选手在定时时间内抢答时,抢答器完成:优先判断、编号锁存、编号显示。当一轮抢答之后,定时器停止、禁止二次抢答、定时器显示剩余时间。如果再次抢答必须由主持人再次操作"开始、停止”状态按键。
抢答按扭
优先编
码电路
锁存器
译码电路
译码显示
主持人控制开关
控制电路
报警电路
秒脉冲产生电路
定时电路
译码电路
显示电路
图3.1。1电路框图
2、单元电路
3。2。1、抢答器电路
该电路完成两个功能:一是判断出选手按键的先后,并锁存优先抢答者的编号,同时译码显示电路显示编号;二是禁止其他选手按键操作无效。如有再次抢答需由主持人将S开关重新置,“清除"然后再进行下一次抢答。
3.2。2、时序控制电路
时序控制电路是抢答器设计的关键,它要完成以下功能:a.主持人将控制开关拨到"开始”位置时,扬声器发声,抢答电路和定时电路进人正常抢答工作状态。 b。当参赛选手按动抢答键时,扬声器发声,抢答电路和定时电路停止工作。
3.2.3、复位电路设计
外部中断和内部中断并存,单片机硬件复位端,只要持续4个机器周期的高电平即可实现复位,硬件复位后的各状态可知寄存器以及存储器的值都恢复到了初始值,因为本设计中功能中有倒计时时间的记忆功能,所以不能对单片机进行硬件复位,只能用软件复位,软件复位实际上就是当程序执行完之后,将程序通过一条跳转指令让它完成复位。
3、时钟震荡电路
时钟震荡电路单片机必须在89C52驱动下才能工作,在单片机内部有一个时钟震荡电路,只需要外接一个振荡器就能产生一定的时钟信号送到单片机内部的各个单元。
4、报警电路
报警电路用于报警,当遇到报警信号时,发出警报。8952动喇叭的信号为各种频率的脉冲。因此,最简单的喇叭驱动方式就是利用达林顿晶体管,或者以两个常用的小晶体管连接成达林顿架势。在右图中电阻R为限流电阻,在此利用晶体管的高电流增益,以达到电路快速饱和的目的。不过,如果要由P0输出到此电路,还需要连接一个10K的上拉电阻.
图3硬件电路图
四、软件设计
1、系统主程序
为了能够达到抢答的公平、公正、合理,应该在主持人发布抢答命令之前必须先设定抢答的时间,因而在编开始抢答前的程序得先编写设定时间的程序,当时间设好了之后,主持人发布抢答命令按下s1按键,程序开始打开定时中断开始倒计时,然后调用键盘扫描子程序,编写键盘扫描程序。当在扫描到有人按下了答题键,马上关闭T0、调用显示程序、封锁键盘。
以单片机为核心,设计一个8位竞赛抢答器:同时供8名选手或8个代表队比赛,分别用8个按钮S0~S7表示.
设置一个系统清除和抢答控制开关S,开关由主持人控制。
抢答器具有锁存与显示功能。即选手按按钮,锁存相应的编号,并在优先抢答选手的编号一直保持到主持人将系统清除为止。当主持人启动“开始”键后,定时器进行减计时,同时扬声器发出短暂的声响,声响持续的时间为0.5s左右。
参赛选手在设定的时间内进行抢答,抢答有效,定时器停止工作,显示器上显示选手的编号和抢答的时间,并保持到主持人将系统清除为止.
如果定时时间已到,无人抢答,本次抢答无效,系统报警并禁止抢答,定时显示器上显示00。
主程序
设置抢答时间和回答问题时间
定时器及并行口初始化
将时间计数器及启动标志值1
开中断
采并行口数据为0吗?
启动标志=1吗?
判断抢答组号
将抢答组发光二极管点亮
判断哪一组为抢答组
将抢答组号送显示
抢答时间到了吗?
输出响铃信号提示超时
N
Y
N
Y
Y
Y
N
抢答时间到了吗?
继续抢答比赛吗?
系统返回
N
Y
Y
Y
N
Y
N
图4.1主程序方框图
2、系统程序
#include〈reg52.h〉
#define uint unsigned int
#define uchar unsigned char
sbit s1=P3^0;
sbit we=P3^6;
uchar h[]={0xe0,0xd0,0xb0,0x70};
uchar code table[]
={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar num,co
展开阅读全文