单片机课设 数码管显示滚动控制.docx
- 文档编号:30432930
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:24
- 大小:652.59KB
单片机课设 数码管显示滚动控制.docx
《单片机课设 数码管显示滚动控制.docx》由会员分享,可在线阅读,更多相关《单片机课设 数码管显示滚动控制.docx(24页珍藏版)》请在冰豆网上搜索。
单片机课设数码管显示滚动控制
《单片机设计与实训》
设计报告
题 目:
数码管滚动显示控制
姓 名:
王伟杰
班 级:
自动化四班
学 号:
2014550430
指导老师:
张莹ﻩﻩ
提交日期:
2016年10月29日
一、设计题目与要求ﻩ3
1.1设计题目ﻩ3
二、系统方案设计3
2.1硬件电路设计ﻩ3
1.单片机最小系统简介3
2.数码管显示电路6
2.3硬件选型及说明ﻩ6
1. ST89C51单片机ﻩ6
2.四位一体七段共阴极显示数码管ﻩ8
三、系统原理图设计与仿真ﻩ9
3.1系统仿真图9
3.2系统仿真结果ﻩ10
四、程序设计11
4.2程序流程图ﻩ12
五、系统调试14
5.1系统硬件调试14
六、总结与体会ﻩ14
附录一ﻩ16
附录三27
一、设计题目与要求
单片机课程设计是一门实践课程,要求学生具有制作调试单片机最小系统及外设的能力,能够掌握单片机内部资源的使用。
单片机课程设计内容包括硬件设计、制作及软件编写、调试,学生在熟练掌握焊接技术的基础上,能熟练使用单片机软件开发环境KeilC51编程调试,并使用STCISP调试工具采用串口下载方式联调制作的单片机最小系统。
单片机课程设计题目包含基本部分及扩展部分,基本部分即单片机最小系统部分,扩展部分是对单片机内部资源及外部IO口的功能扩展,使制作的单片机系统具有一定的功能。
1.1设计题目
数码管滚动显示控制
1.2设计要求
自制一个单片机最小系统,包括串口下载、复位电路,采用两个四位一体数码管作为显示器件,通过按钮选择实现四种滚动显示模式,例如从左至右,从右至左,内缩,外扩等,滚动信息可以是数字或有意义的英文字符。
二、系统方案设计
2.1硬件电路设计
本设计的硬件电路主要包括的模块有:
单片机最小系统、七段数码管显示模块、
1.单片机最小系统简介
单片机最小系统,或者称为最小应用系统,是指用最少的元件组成的单片机可以工作的系统.对51系列单片机来说,最小系统一般应该包括:
单片机、晶振电路、复位电路。
结构图如下:
图2.1单片机最小系统
各部分的功能介绍如下:
复位电路:
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序。
除了进入系统的正常初始化之外,当由于程序运行出错或操作错误是系统处于死锁状态时,为摆脱困境,也需要按复位键以重新启动。
MCS-51单片机的复位电路由片内、片外两部分组成,进行复位操作时,外部电路需在复位引脚RST端产生大于两个机器周期的高电平信号,RST引脚通过片内施密特触发器与复位电路相连(施密特触发器的作用是脉冲整型和抑制噪声)。
MCS-51单片机的复位操作有两种方式:
上电复位和上电按钮复位。
图2.2复位电路图
晶振电路(时钟电路):
时钟电路是单片机的心脏,它用于产生单片机工作所需要的时钟信号。
单片机本身就是一个复杂的同步时序电路,为了保证同步工作方式的实现,电路应在唯一的时钟信号控制下严格地按时序进行工作。
单片机的时钟产生方法有内部时钟方式和外部时钟方式,大多数单片机应用系统采用内部时钟方式,本系统采用的亦是内部时钟方式。
在MCS-51芯片内部有一个高增益反相放大器,XTAL1、XTAL2引脚分别为该反相放大器的输入端和输出端,在芯片的外部通过这两个引脚跨接晶体振荡器和微调电容,形成反馈电路,就构成了一个稳定的自激振荡器。
图2.3时钟电路图
2.数码管显示电路
图2.4数码显示电路
2.3硬件选型及说明
1.ST89C51单片机
MCS-51把微型计算机的主要部件都集成在一块心片上,使得数据传送距离大大缩短,可靠性更高,运行速度更块。
由于属于芯片化的微型计算机,各功能部件在芯片中的布局和结构达最优化,抗干扰能力加强,工作亦相对稳定。
因此,在工业测控系统中,使用单片机是最理想的选择。
单片机属于典型的嵌入式系统,所以它是低端控制系统最佳器件。
8051是MCS-51系列单片机的典型产品。
8051单片机包含中央处理器、程序存储器(ROM)、数据存储器(RAM)、定时/计数器、并行接口、串行接口和中断系统等几大单元及数据总线、地址总线和控制总线等三大总线:
引脚介绍:
电源:
VCC- 芯片电源,接+5V;VSS -接地端;
时钟:
XTAL1、XTAL2-晶体振荡电路反相输入端和输出端
控制线:
⑴ ALE/PROG:
地址锁存允许/片内EPROM编程脉冲:
①ALE功能:
用来锁存P0口送出的低8位地址;②PROG功能:
片内有EPROM的芯片,在EPROM编程期间,此引脚输入编程脉冲。
⑵PSEN:
外ROM读选通信号。
⑶RST/VPD:
复位/备用电源:
①RST(Reset)功能:
复位信号输入端;② VPD功能:
在Vcc掉电情况下,接备用电源。
⑷EA/Vpp:
内外ROM选择/片内EPROM编程电源:
①EA功能:
内外ROM选择端;②Vpp功能:
片内有EPROM的芯片,在EPROM编程期间,施加编程电源Vpp。
I/O线:
4个8位并行I/O端口:
P0、P1、P2、P3口,共32个引脚。
P3口还具有第二功能,用于特殊信号输入输出和控制信号(属控制总线)。
图2.589c51引脚图
2.四位一体七段共阴极显示数码管
图2.6数码管引脚图
三、系统原理图设计与仿真
3.1系统仿真图
图3.1系统仿真图
3.2系统仿真结果
图3.2系统正在运行
图3.3系统正在运行
四、程序设计
4.1程序设计
数码管动态显示程序包含显示数字、部分字母符号、小数点、数码管闪烁、数码管消隐等。
其它程序输出到显示程序的数据既可以是BCD码、二进制码、ASCII码、自定义显示码等。
由硬件电路工作原理可知,为了显示稳定的数据,每秒必须显示数据50次以上,才能达到预期目的。
MCS-51单片机内部有两个16 位可编程的定时器/计数器T0和T1。
它们即可用作定时器方式,又可用作计数器方式。
其中T0由TH0和TL0计数器构成;T1 由TH1和TL1计数器构成。
工作于定时器方式时,通过对机器周期(新型51单片机可以对振荡周期计数)的计数,即每一个机器周期定时器加1,来实现定时。
故系统晶振频率直接影响定时时间。
如果晶振频率为12MHZ,则定时器每隔(1/12MHZ)×12=1us加1。
工作于计数器方式时,对P3.4 或P3.5管脚的负跳变(1→0)计数。
它在每个机器周期的S5P2 时采样外部输入,当采样值在这个机器周期为高,在下一个机器周期为低时,计数器加1。
因此需要两个机器周期来识别一个有效跳变,故最高计数频率为晶振频率的1/24。
特殊功能寄存器TMOD用于定时器/计数器的方式控制。
高4位用于设置T1,低4 位用于设置T0。
单片机内部定时器/计数器的使用,简而概之:
(1)如需用中断,则将EA和相关中断控制位置1;
(2)根据需要设置工作方式,即对TMOD设置;(3)然后启动计数,即对TR0或TR1置1。
(4)如使用中断,则计数溢出后硬件会自动转入中断入口地址;如使用查询,则必须对溢出中断标志位TF0或TF1进行判断。
4.2程序流程图
图4.1主程序图
五、系统调试
5.1系统硬件调试
在领完课程设计所需的元器件并检查是否是自己所需要,并且根据电路原理图进行电路板的焊制,在焊接过程中注意不要虚焊和短路。
焊接完成后首先对电路板上的线路进行检查是否有错漏和重复。
并且用万用表测试电路中有无虚焊短接的情况。
在测试无误后,向单片机烧录程序,并接通电源进行测试。
在第一次上电过程中,数码管并没有显示出如期的结果,用万用表对焊接点进行再一次的排查并对线路进行检查,发现单片机底座有几个虚焊点,并重新对其进行焊制。
5.2系统软件调试
在keil编译器下进行程序的编写,以子程序为单位进行调试,并且利用proteus软件进行仿真实验并结合电路板进行整机调试。
六、总结与体会
此次的课程设计是基于单片机的数码管滚动显示控制。
单片机是自动化的重要课程,学习的时候十分用心,也同时也为这次的课程设计打下了理论基础。
但是由于学习到的更多涉及于课本知识并没有灵活的掌握,所以说在设计的过程中也需要不断的翻阅书籍,以此来达到完成顺利完成课程设计任务,在这段学习与制作的过程中巩固了我在课堂上学习到的内容,而且锻炼到了我个人的自我学习能力及制作能力。
在课程设计最开始是做Proteus仿真,从最小系统开始做。
单片机最小系统是指用最少的元件组成的单片机可以工作的系统。
应该包括:
单片机、晶振电路、复位电路等。
我上学期做过数电的课程设计所以这次看到器件这么少电路图这么简单还觉得很高兴。
然而做完仿真开始焊接时才发现从单片机芯片出来的连接数码管的线路在仿真中隐藏了只留下了引脚,导致我在焊接的时候一下多了十多根线打乱我的节奏,好在最后还是踉踉跄跄地焊完了。
在第一次调试的时候并没有现象,这令我十分惶恐,仔细检查才发现仿真中21 20引脚的都略去了而这几个针脚正是连接vcc跟地的引脚,后来将它焊上了。
给我的启发是以后在做完仿真焊接的时候一定要每个引脚的过,因为仿真中它将芯片的引脚打乱了顺序而且有的引脚也省略了,仿真跟真实的焊接还是不同的。
还有就是拿到仿真先别急着焊接,还是要大致地考虑器件的布局跟正反面的走线,提前理清思路焊的时候才能游刃有余,不至于慌忙。
而且在制作仿真的过程中也有了瓶颈,大一学的c语言忘得差不多了好在同学的帮助下才解决了问题,另外焊接只是一方面,后续的检测诊断才是关键,不可能一下子焊好就可以使用,在焊接的过程中难免有一些焊点漏焊虚焊的。
每一次的课程设计对我都是一种拔高跟历练,在一次次的课程设计中我会不断地进步,提升自己的解决问题的能力,跟动手焊接能力,还有故障排查能力,做课程设计固然需要智慧然而坚持跟耐心也是很关键的,这几样缺一不可,否则很难做出成功的作品。
我相信我会一步步地慢慢变好变强。
附录一
元器件清单
器件名称
数量
Stc89c54单片机
1
电容
若干
七段共阴极数码管
2
电阻
若干
微动开关
2
芯片插座
3
驱动
1
晶振
1
附录二
#include
//--定义使用的IO口--//
#defineGPIO_DIG P2//段选
#defineGPIO_PLACEP0//位选
sbitk=P1^0;
//--定义全局变量--//
unsignedcharcodeDIG_PLACE[8]= {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
unsignedcharcodeDIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned charDisplayData[8];
//用来存放要显示的8位数的值
//--声明全局函数--//
void Displaykey();
voidRunkey();
void first();
void step1();
voidstep2();
voidstep3();
void step4();
signed chardelay;
signedchari;
unsigned char j;
signed chari1;
unsignedchar step=1;
/*******************************************************************************
*函 数 名 :
main
* 函数功能ﻩﻩ :
主函数
*******************************************************************************/
voidmain(void)
{
unsignedchara;
ﻩfor(a=0;a<8; a++)
{
DisplayData[a] =DIG_CODE[a];ﻩ
ﻩ}ﻩﻩﻩﻩﻩ //存放段码
ﻩfirst();//设置定时器初值和工作方式
ﻩwhile
(1)
{
ﻩDisplaykey();ﻩ//扫描按键
Runkey();ﻩ //执行相对应的按键步骤
ﻩ}ﻩﻩ
}
/*******************************************************************************
*函 数名 :
first()
*函数功能ﻩﻩ:
设置初值
*******************************************************************************/
voidfirst()
{
TMOD=0x01;ﻩﻩﻩ //设置T0为定时器工作方式0
TH0=(65536-20000)/256;
TL0=(65536-20000)%256; //设置计数器初值,定时时间为20ms
IE=0x82;ﻩ //允许定时器0中断
}
/*******************************************************************************
*函数名 :
Displaykey();
*函数功能ﻩ :
按键扫描
*******************************************************************************/
voidDisplaykey()
{
if(k==0)
TR0=1; //启动定时器0
}
/*******************************************************************************
*函数名 :
voidtime0()interrupt1using1
* 函数功能ﻩ :
定时器0
*******************************************************************************/
voidtime0() interrupt1 using 1
{
unsignedchar a;
TH0=(65536-20000)/256;
ﻩTL0=(65536-20000)%256; //方式1需要重置定时器的初值
if(k==0)ﻩ //定时20ms去除按键抖动
{
ﻩwhile
(1)
{
ﻩif(k==1)break;ﻩ//判断按键是否弹起
ﻩ }
step=step+1;ﻩﻩ//进入下一个工作方式
if(step==5)
step=1;
switch(step)
ﻩ{
ﻩcase 1:
i=0;break;//设置步骤1的初值
ﻩ case2:
i=7; break;//设置步骤2的初值
case 3:
i=0;i1=7;break;ﻩ//设置步骤3的初值
case4:
i=3;i1=4;break;ﻩ //设置步骤4的初值
ﻩﻩ}
}
a++;ﻩﻩ
while(a==20)ﻩﻩﻩﻩ//利用定时器进行延时延时时间为20ms*50=1s
ﻩ{
ﻩa=0;
ﻩdelay=1;ﻩﻩﻩﻩ//延时结束标志位
}
TR0=0;ﻩﻩﻩﻩ //关闭定时器
}
/*******************************************************************************
*函数名 :
Runkey();
*函数功能ﻩﻩ :
按键执行和选择
*******************************************************************************/
voidRunkey()
{
switch(step)
{
case1:
step1();break;
case 2:
step2();break;
ﻩcase 3:
step3();break;
case4:
step4();break;
}
}
/*******************************************************************************
*函数名 :
step1
*函数功能ﻩ:
右扫程序
*******************************************************************************/
voidstep1()
{
ﻩGPIO_PLACE=DIG_PLACE[i];//发送位选
ﻩﻩGPIO_DIG= DisplayData[i]; //发送段码
ﻩﻩj=10;ﻩﻩ//扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
ﻩﻩTR0=1;ﻩﻩﻩﻩ//开定时器延时
ﻩwhile(delay==1)ﻩﻩﻩ
ﻩ{
delay=0;
ﻩi=i+1;ﻩﻩﻩ//延时时间到,数码管位选移动
while(i==8)
ﻩi=0;
}
}
/*******************************************************************************
*函数名 :
step2
*函数功能ﻩﻩ :
左扫程序
*******************************************************************************/
voidstep2()
{
ﻩGPIO_PLACE=DIG_PLACE[i];ﻩ //发送位选
GPIO_DIG=DisplayData[i]; //发送段码
ﻩj=10;ﻩﻩ//扫描间隔时间设定
ﻩﻩwhile(j--);ﻩ
ﻩGPIO_DIG =0x00; //消隐
ﻩTR0=1;
ﻩﻩwhile(delay==1)
ﻩ{
ﻩﻩdelay=0;
ﻩi=i-1;ﻩﻩﻩ//延时时间到,数码管位选移动
ﻩﻩwhile(i==-1)
ﻩi=7;
ﻩﻩ}ﻩ
}
/*******************************************************************************
*函 数名 :
step3
* 函数功能ﻩﻩ :
内缩程序
*输 入 :
无
* 输出 :
无
*******************************************************************************/
voidstep3()
{
ﻩﻩGPIO_PLACE=DIG_PLACE[i];//发送位选
ﻩGPIO_DIG= DisplayData[i];//发送段码
ﻩﻩj=10;ﻩﻩﻩﻩ//扫描间隔时间设定
ﻩﻩwhile(j--);
ﻩﻩGPIO_DIG=0x00; //消隐
ﻩGPIO_PLACE=DIG_PLACE[i1];ﻩ//发送位选
ﻩﻩGPIO_DIG=DisplayData[i1]; //发送段码
ﻩj =10;ﻩﻩﻩ//扫描间隔时间设定
while(j--);ﻩ
ﻩﻩGPIO_DIG=0x00; //消隐
TR0=1;
while(delay==1)
ﻩ{
ﻩ delay=0;
ﻩi=i+1;
ﻩi1=i1-1;ﻩﻩﻩ//延时时间到,数码管位选移动
ﻩ while(i1==3)
{
ﻩﻩi=0;
ﻩﻩi1=7;
ﻩ}
}
ﻩ
}
/*******************************************************************************
*函数名 :
step4
* 函数功能ﻩ :
外扩程序
*******************************************************************************/
voidstep4()
{ﻩﻩ
ﻩGPIO_PLACE= DIG_PLACE[i];ﻩ//发送位选
ﻩGPIO_DIG =DisplayData[i]; //发送段码
ﻩﻩj= 10;ﻩ//扫描间隔时间设定
ﻩwhile(j--);
ﻩGPIO_DIG=0x00; //消隐
ﻩGPIO_PLACE =DIG_PLACE[i1];ﻩ //发送位选
ﻩGPIO_DIG=DisplayData[i1]; //发送段码
ﻩﻩj = 10;ﻩﻩﻩ//扫描间隔时间设定
while(j--);ﻩ
ﻩGPIO_DIG =0x00; //消隐
ﻩﻩTR0=1;
ﻩwhile(delay==1)
{
delay=0;
ﻩﻩi=i-1;
ﻩﻩi1=i1+1;ﻩﻩ //延时时间到,数码管位选移动
ﻩﻩ while(i1==8)
ﻩ{
i=3;
ﻩﻩ i1=4;
ﻩ }
}
}
附录三
图1硬件原理图
图2实物图(正面)
图3实物图(背面)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机课设 数码管显示滚动控制 单片机 数码管 显示 滚动 控制