单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
单片机课程设计
目录
摘要-1-
一、设计原理及功能-2-
1.1设计原理-2-
1.2实现功能-2-
二、硬件设计-3-
2.1原理介绍-3-
2.2硬件设计-4-
三、软件设计-8-
3.1程序流程图-8-
3.2程序清单-9-
四、心得体会-13-
参考文献-14-
定时器设计
摘要
本设计是使用单片机STC89C52芯片进行程序的存储与控制设计的一个定时器系统,主要使用MAX232串口转换芯片进行电平的转换。
本系统的主要功能是通过程序控制四个按键来实现定时器定时时间的设置,定时器的复位,以及定时开始与暂停等功能,定时时间则由一个两位一体共阳极数码管实时显示。
关键词:
定时器STC89C52LED数码管数码显示
一、设计原理及功能
1.1设计原理
本次定时器的设计是以单片机89C52为核心控制芯片,结合MAX232串口电平转换芯片来实现定时器的实时数码显示,定时时间由一两位一体共阳极数码管显示,通过四个控制按钮来设置定时时间和定时器清零、复位、开始计时与暂停计时。
定时器的程序则由C语言和汇编语言两种方案来实现定时器的相关功能。
1.2实现功能
将按键定义为设置键、上翻键、下翻键、开始/取消键。
数码管显当前设置时间与正在计时时间。
可通过按键在1-99秒之间设置,按开始键启动计时,计时完成后驱动蜂鸣器发声提示。
二、硬件设计
2.1原理介绍
设计的基本原理
本方案以STC89C52RC单片机作为主控核心,与晶振、数码管、蜂鸣器等构成3路抢答器,利用了单片机的延时电路、按键复位电路、时钟电路、定时/中断等电路,利用软硬件结合,实现抢答功能。
采用查询与中断的方式,先等待主持人按下按键,是否可以进行抢答,按下后则进行查询按键,是否有选手按下按键,谁先抢答数码管上显示哪个选手的号码同时对应的指示灯亮表示他抢答成功。
同时,在主持人按钮开始按下的时候,开启T0中断,使定时器开始定时,在10秒到达的时候,还没有人抢答的话就开始报警,宣布此题作废,主持人可以在按下开始键开始下一题的抢答,如此循环。
原理图如下。
图1-1硬件原理图
2.2硬件设计
2.1芯片STC89C52RC
选用STC系列芯的理由:
降低成本,提高性能,原有程序直接使用,硬件无需改动。
STC89C52RC具有以下标准功能:
8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,STC89C52RC可降至0Hz静态逻辑操作,时钟频率0-80MHz,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
8位微控制器8K字节在系统可编程。
芯片如图2-1所示:
图2-1STC89C52芯片
2.2电源电路
采用5V电源供电,电源指示灯LED1亮时,说明供电成功。
电源电路图如图2-2所示。
图2-2电源电路
2.3晶振电路
单片机必须在时钟的驱动下才能工作。
在单片机内部有一个时钟振荡电路,只需要外接一个振荡源就能产生一定的时钟信号送到单片机内部的各个单元,决定单片机的工作速度。
时钟电路如下图2-3所示。
图2-3晶振电路
2.4复位电路
单片机的第9脚RST为硬件复位端,只要将该端持续4个机器周期的高电平即可实现复位,复位后单片机的各状态都恢复到初始化状态,复位电路图如图2-4所示:
图2-4复位电路
2.5蜂鸣器电路
由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,在此使用三极管进行放大电流就可以了。
电路图如下图2-5:
图2-5蜂鸣器电路
2.6按键电路
KEY1为主持人按钮,KEY2、KEY3、KEY4分别为三位选手按钮,通过按钮的连接,实现抢答功能,当按键按下时,对应的发光二极管D2、D3、D4亮。
连接电路如图2-6所示,而二极管发光电路如图2-7所示。
图2-6按键电路
2.7数码管显示电路
选用的是两位一体的共阳数码管,将P0口分别接数码管的八段发光二极管,将电源VCC端口接经数码管位选三极管,构成显示电路。
电路图如图2-8所示
图2-8数码管显示电路
2.8电平转换与PC机接口电路
电平转换电路,实现芯片与PC机的电压相匹配,同时实现与PC机之间的连接。
电路图如图2-9所示
图2-9电平转换与PC机接口电路
三、软件设计
3.1程序流程图
程序流程图如图3-1所示
图3-1主程序流程图
3.2程序清单
主程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitgw=P1^4;//数码管各位位选
sbitsw=P1^5;//十位位选
sbitSPEAK=P1^6;//定义蜂鸣器
ucharnum,num1,tt,shi,ge,t;//tt为设定值,t为当前计数值
ucharcodetable[]={
0x88,0x9F,0xA4,0x85,
0x93,0xC1,0xC0,0x8F,
0x80,0x81,0x82,0xC8,
0xE8,0xA1,0x86,0x8E};//数码管显示段码
voiddelay(uintz);//延时子函数声明
voidplay(ucharaa);//数码管显示子函数声明
voidSPK_Test(void);//蜂鸣器控制子函数
voidInit();//初始化子函数声明
voidKeyScanf(void);//键盘扫描
voidmain()
{
Init();//初始化
for(num1=60;num1>0;num1--)
play(tt);
t=tt;
while
(1)
{
KeyScanf();
while(t==0)
{
TR0=0;//定时时间到停止定时器工作
SPK_Test();
t=60;
break;
}
play(t);//显示当前剩余定时时间
}
}
/**********************************************************
*名称:
voidInit()
*功能:
初始化定时器0等
***********************************************************/
voidInit()
{
EA=1;//开总中断
ET0=1;//开定时器0中断
tt=60;//设定默认定时时间(一分钟)
num=20;
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;//定时器0设定50ms定时初值
TL0=(65536-50000)%256;
SPEAK=0;
}
/*******************************************
函数名:
按键扫描
描述:
*******************************************/
voidKeyScanf(void)
{
if((P1&0x0f)!
=0x0f)//检查按键
{
delay(20);
if((P1&0x0f)!
=0x0f)//检查按键
{
delay(20);
if(!
(P1&0x01))
while
(1)
{TR0=0;
play(tt);
if(!
(P1&0x02))
{
tt++;
play(tt);
}
elseif(!
(P1&0x04))
{
tt--;
play(tt);
}
if(!
(P1&0x08))
{
TR0=1;
t=tt;
break;
}
}
if((TR0==1)&&(!
(P1&0x08)))
{
if(!
(P1&0x08))
{
TR0=0;//停止
delay(20);
}
}
if((TR0==0)&&(!
(P1&0x08)))
{
{
TR0=1;//启动
delay(20);
}
}
}
}
}
/**************************************************************
*名称:
Delay_NS()
*功能:
长软件1ms延时
***************************************************************/
voiddelay(uintms)
{
uchari;
while(ms--)//ms毫秒软件延时
{
for(i=63;i>1;i--);
}
}
/************************************************************
函数名称:
定时器0中断服务子程序
功能:
重装初并重启定时器值,
定时中断满20次(1s),计数减1
************************************************************/
voidtime0()interrupt1//定时器0中断子函数
{
if(num>0)
{
num--;
}
elseif(num==0)
{
t--;
num=20;
}
TH0=(65536-50000)/256;//重装定时器初值
TL0=(65536-50000)%256;
ET0=1;
TR0=1;//重新启动T0
}
/**************************************************************
*名称:
voidplay(uchar)
*功能:
LED数码管显示0-F字符,
同时控制2个数码管显示对应的十六进制数
***************************************************************/
voidplay(ucharaa)//数码管显示子函数
{
shi=aa/10;
ge=aa%10;
P0=table[ge];
gw=0;
delay(20);//延时显示
gw=1;
P0=table[shi];
sw=0;
delay(20);//延时显示
sw=1;
}
/*******************************************
函数名:
SPK_test()
描述:
蜂鸣器控制
*******************************************/
voidSPK_Test(void)
{
unsignedinti=0;
unsignedcharj,k,m=14;
for(j=0;j<8;j++)
{
m-=1;
for(i=0;i<1000;i++)
{
SPEAK=~SPEAK;
for(k=m;k>1;k--);
}
delay(15);
}SPEAK=0;
}
四、心得体会
通过本次课程设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。
既让我们懂得了怎样将理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。
在设计过程中,总是会遇到这样或那样的问题。
有时一个问题可能会需要大家集体去查阅资料,做大量的工作,花大量的时间才能解决。
通过不断地发现问题,解决问题,自然而然,我的发现问题和解决问题的能力便在其中建立起来了。
这都为以后的工作积累了经验,同时也增强了我们解决问题的能力。
总之,在设计过程中,我不仅学到了以前从未接触过的新知识,而且学会了独立的去发现,面对,分析,解决新问题的能力,不仅学到了知识,又锻炼了自己的能力,使我受益非浅。
参考文献
[1]李鸿.单片机原理及应用[M].长沙:
湖南大学出版社,2005.
[2]南京伟福实业有限公司.LAB6000U(USB接口)单片机/微控制器仿真实验系统
[3]胡汉才.单片机原理及其应用[M].北京:
清华大学出版社,2004.
[4]何立民.单片机应用技术选编[M].北京:
北京航空航天大学出版社,2006.
[5]何立民.单片机应用文集1-8[M].北京:
北京航空航天大学出版社,2000.