单片机课程设计电子跑表.docx
- 文档编号:11171376
- 上传时间:2023-02-25
- 格式:DOCX
- 页数:18
- 大小:19.72KB
单片机课程设计电子跑表.docx
《单片机课程设计电子跑表.docx》由会员分享,可在线阅读,更多相关《单片机课程设计电子跑表.docx(18页珍藏版)》请在冰豆网上搜索。
单片机课程设计电子跑表
电子跑表
一.个人任务
在本次课程设计中,本人负责跑表的C语言程序编程部份和开发板调试。
另一人负责proteus仿真。
二.设计要求
以51开发板为核心设计一个多功能电子表。
利用AT89C52作为主控器组成一个具有跑表功能的4位LED显示器的电子跑表。
跑表的-999.9秒并具有跑表启动和跑表复位功能键。
跑表的显示范围:
;当按下启动按钮跑表开始计时,按下停止按停止计时,当按下复位按钮跑表回零。
三.设计思路
1.计时单元由单片机内部的按时器/记数器来实现。
2.跑表的显示功能是由LED数码管动态扫描来实现。
这能够利用专用的键盘/显示器接口芯片来实现对键盘/显示器的动态扫描。
3.跑表的启动/复位/清零功能由软件来实现。
P1.0接启动键,P1.1接停止键,P1.2接清零键。
四.设计方案
在单片机中,按时功能既能够由硬件实现,也可通过软件按时实现。
硬件按时是利用单片机内按时器按时,启动以后按时器可与CPU并行工作,不占用CPU时刻,CPU有较高的工作效率。
采纳硬件按时和软件按时并用的方式,即用T0出中断功能实现50ms按时,通过软件延时程序实现1s按时。
按时器的有关的寄放器有工作方式寄放器TMOD和操纵寄放器TCON。
依照设计要求和设计思路,硬件电路有两部份组成,即单片机按键电路,LED显示器电路,以下图为系统电路设计流程图。
入口
按键电路
89C52
LCD显示电路
外围设备相连
返回
图1电路设计流程图
依照课程设计要求,决定计时单元由单片机内部的按时器/记数器89C52芯片来实现。
跑表显示功能通过LED数码管动态扫描来实现。
能够利用专用的键盘/显示器接口芯片可实现对键盘/显示器的动态扫描。
五.硬件设计
1.单片机型号选择
由于咱们利用的单片机开发板上的单片机的型号是SCT89C52,因此咱们只能选择这款型号的单片机。
可是这款单片机和SCT89C51是一样的,也是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处置器,器件采纳ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
2.键盘电路设计
在单片机开发板上的键盘是4×4键盘,该键盘能够实现电子跑表上的暂停、清零等各类功能。
图2按键
3.数码管显示原理
码管是一种把多个LED显示段集成在一路的显示设备。
有两种类型,一种是共阳型,一种是共阴型。
共阳型确实是把多个LED显示段的阳极接在一路,又称为公共端。
共阴型确实是把多个LED显示段的阴极接在一路,即为公共商。
阳极即为二极管的正极,又称为正极,阴极即为二极管的负极,又称为负极。
通常的数码管又分为8段,即8个LED显示段,这是为工程应用方便如设计的,别离为A、B、C、D、E、F、G、DP,其中DP是小数点位段。
数码管显示方式可分为静态显示和动态显示两种。
静态显示确实是数码管的8段输入及其公共端电平一直有效。
动态显示的原理是各个数码管的相同段连接在一路,一起占用8位段引管线;每位数码管的阳极连在一路组成公共端。
利用人眼的视觉暂留性,依次给出各个数码管公共端加有效信号,在此同时给出该数码管加有效的数据信号,当全段扫描速度大于视觉暂留速度时,显示就会清楚显示出来。
图3数码管
六.软件设计
鉴于对汇编语言的把握度远没有C语言来得扎实,又因为时刻有限,不可能在有限的两周时刻内,设计出汇编语言编写的电子跑表程序,故我选择了用C语言实现其功能。
那个设计进程主若是围绕了51系列单片机中的89C52单片机为核心设计思路,制作一个符合要求的电子跑表。
第一我设置按时器89C52初始值,采纳硬件按时和软件按时并用的方式。
和按时器有关的寄放器有工作方式寄放器TMOD和操纵寄放器TCON。
TMOD用于设置按时器/计数器的工作方式,并确信誉于按时仍是用于计数。
TCON要紧功能是为按时器在溢出时设定标志位,并操纵按时器的运行或停止。
然后我采纳芯片进行单片机与各类外围设备相连的接口电路这种方式进行相连。
如此既可实现对键盘/显示器的自动扫描,而且大节省CPU对键盘/显示器的操作时刻,从而减轻CPU的负担,而且显示稳固,程序简单,可不能显现误动作。
电子跑表的启动/复位/清零功能能够由软件来实现。
P1.0接启动键,P1.1接停止键,P1.2接复位键。
S-S。
当咱们按下启动按钮时跑表开始计时,按下停止那么停止计时,当按下复位按钮跑表回零。
程序总流程图:
主程序
芯片初始化
存储单元赋初值
跑表显示单元清0
调跑表显示
跑表显示单元
调时钟显示
C语言程序:
#include
#include<>
#include<>
#defineucharunsignedchar
#defineuintunsignedint
#definePAXBYTE[0x7cff]
#definePBXBYTE[0x7dff]
#definePCXBYTE[0x7EFF]
#defineCONXBYTE[0x7fff]
sbitswtch=P1^0;
sbitstt=P1^1;
sbithc=P1^2;
//sbitmin=P1^3;
//sbitsts=P3^4;
//sbitstates=P3^5;
Codeuchardis_7[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
codeucharscan[4]={0x01,0x02,0x04,0x08};
Uintdisp=0x00,time[4]={0x01,0x01,0x02,0x02},pb[4]={0x00,0x00,0x00,0x00},miao=0x00,dsp[4]={0x02,0x02,0x02,0x02},base0=0x00,base1=0x00;
bitstate;
bitstop;
bitstime;
bitk1lock;
bitk2lock;
bitk3lock;
bitk4lock;
voiddelay1ms(uinti);
voiddisplay();
voidpcount();
voidntime();
voidclr();
main()
{
inti;
delay1ms(10);
TMOD=0x0101;
CON=0x80;
TH1=0x36;
TL1=0xb0;
TH0=0xff;
TL0=0xf0;
TR0=1;
TR1=0;
TF0=0;
TF1=0;
state=0;
stop=1;
k1lock=0;
k2lock=0;
k3lock=0;
k4lock=0;
while
(1)
{
pcount();
ntime();
if(swtch==0)
{if(k1lock==0)
{
delay1ms(10);
if(swtch==0)
{state=~state;
k1lock=1;}
else
state=state;
}
}
else
k1lock=0;
if(state==0)
{
if(stime==1)
{
if(hc==0)
{if(k3lock==0)
{
delay1ms(10);
if(hc==0)
{k3lock=1;
if(time[3]==2)
if(time[2]==3)
{time[3]=0;
time[2]=0;}
else
time[2]++;
else
if(time[2]==9)
{time[2]=0;
time[3]++;}
else
time[2]++;
}
}
}
else
k3lock=0;
if(min==0)
{if(k4lock==0)
{
delay1ms(10);
if(min==0)
{k4lock=1;
if(time[0]==9)
{time[0]=0;
if(time[1]==5)
time[1]=0;
else
time[1]++;}
else
time[0]++;
}
}
}
else
k4lock=0;
}
if(stt==0)
{if(k2lock==0)
{
delay1ms(10);
if(stt==0)
{stime=~stime;
k2lock=1;}
}
}
else
k2lock=0;
for(i=0;i<4;i++)
dsp[i]=time[i];
}
else
{
if(stop==1)
{
if(stt==0)
{if(k2lock==0)
{
delay1ms(10);
if(stt==0)
{stop=0;
TR1=1;
k2lock=1;}
}
}
else
k2lock=0;
if(hc==0)
{if(k3lock==0)
{
delay1ms(10);
if(hc==0)
{clr();
k3lock=1;}
}
}
else
k3lock=0;
}
else
{if(stt==0)
{if(k2lock==0)
{
delay1ms(10);
if(stt==0)
{stop=1;
TR1=0;
k2lock=1;}
}
}
else
k2lock=0;
}
for(i=0;i<4;i++)
dsp[i]=pb[i];
}
display();
sts=~stime;
states=~state;///////////////////
}
}
voiddelay1ms(uintt)
{
uinti,j;
for(i=0;i for(j=0;j<500;j++); } voiddisplay() {uinti; for(i=0;i<4;i++) {PB=0; if(i==1&&state==1) disp=dis_7[dsp[i]]&0x7f; else disp=dis_7[dsp[i]]; PA=disp; PB=scan[i]; delay1ms (1); } } voidpcount() { if(TF1) {TF1=0; if(base1==2) {base1=0; if(pb[0]==9) {pb[0]=0; if(pb[1]==9) {pb[1]=0; if(pb[2]==9) {pb[2]=0; if(pb[3]==9) pb[3]=0; else pb[3]++;} else pb[2]++;} else pb[1]++;} else pb[0]++;} else base1=base1+1; } } voidntime() {if(stime==0) if(TF0==1) {TF0=0; if(base0==1) {base0=0; if(miao==59) {miao=0; if(time[0]==9) {time[0]=0; if(time[1]==5) {time[1]=0; if(time[3]==2) if(time[2]==3) {time[3]=0; time[2]=0;} else time[2]++; else if(time[2]==9) {time[2]=0; time[3]++;} else time[2]++; } else time[1]++;} else time[0]++;} else miao++;} else base0=base0+1; } } voidclr() {uinti; TH1=0x36; TL1=0xb0; TF1=0; TR1=0; for(i=0;i<4;i++) pb[i]=0x00; } 七.安装调试 (1)其操作进程为: 开始之前应把和、开关全都拨到低电平位置,接通电源,开始运行,显示器显示000.0。 把置为高电平常,那么开始计数; 当为高电平常,那么跑表停止计数,并保留所停止时刻的时刻不变。 假设要继续计数,那么把置0; 假设要从头计数,那么先把置1,显示清零,再把置1即可。 (2)此设计产品一共给出3个开关。 一个开关标示启动跑表,另一个标示暂停,另一个标示跑表/时钟。 三个开关的启始位置是关的状态。 当咱们按动跑表时,才开始跑表。 这时当按下暂停时,跑表暂停读数。 (3)仿真 本次仿真,将由同组的另一名同窗来负责其,进程和详细情形将在他的报告里描述。 八.总结与体会 通过两周的单片机课程设计,使我对单片机理论知识有了进一步的熟悉和了解。 它不仅让咱们使讲义上的知识在实际中取得了专门好的运用,从而对讲义上的知识有了更深刻的熟悉,更系统的了解。 第二,在这次课程设计中,咱们运用到了以前没有学到的知识。 最后,要做好一个课程设计,就必需做到: 在设计程序之前,对所用单片机的内部结构有一个系统的了解,明白该单片机内有哪些资源;要有一个清楚的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改良是程序设计的必经之路;在设计课程进程中碰到问题是很正常德,但咱们应该将每次碰到的问题记录下来,并分析清楚,以避免下次再碰着一样的问题。 另外,这次课程设计让我感到了团队合作的重要性,只有彼此合作才是唯一成功途径。 桂林航专电子工程系 单片机课程设计与制作说明书 设计题目: 专业年级: 电子信息工程技术08级 学号: 姓名: 同组姓名: 指导教师: 2020年月日 单片机技术课程设计成绩评定表 设计题目: 学号: 姓名: 项目 评语内容 评定等级 设计 表现 (20%) 基本要求评价: 掌握基础理论,设计过程中的学习态度,文献查阅能力,设计思路可行性能力评价设计任务量、设计过程中参与情况 A B C D E 设计 说明书 (30%) 调试过程中运用理论分析与解决问题的能力;报告格式规范性、全面性、逻辑性、表达能力综合评价 A B C D E 调试 仿真 (30%) 开发板调试情况 Proteus仿真情况 A B C D E 答辩 (20%) 答辩时,回答老师提出的软硬件问题情况 A B C D E 综合成绩 教师签名 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 电子 跑表