微机原理课程设计论文.docx

上传人:b****7 文档编号:10005132 上传时间:2023-02-07 格式:DOCX 页数:16 大小:108.63KB
下载 相关 举报
微机原理课程设计论文.docx_第1页
第1页 / 共16页
微机原理课程设计论文.docx_第2页
第2页 / 共16页
微机原理课程设计论文.docx_第3页
第3页 / 共16页
微机原理课程设计论文.docx_第4页
第4页 / 共16页
微机原理课程设计论文.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

微机原理课程设计论文.docx

《微机原理课程设计论文.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计论文.docx(16页珍藏版)》请在冰豆网上搜索。

微机原理课程设计论文.docx

微机原理课程设计论文

1课程设计的内容

(1)编程语言为C语言;

(2)基于单片机的硬件电路设计与调试;

(3)从键盘上输入当前时间,格式为“XX(小时):

XX(分):

XX(秒),以此为起点,每秒刷新一次,1秒钟延迟方式采用软件方式并用子程序编写或者定时器实现,主程序用于显示时间结果和调用子程序,由于软件延迟产生的误差每小时调整一次,保证每小时误差不超过0.1秒。

2设计思想

要完成本实验任务要求的功能,可以将系统分为以下几个部分来设计:

定时器/计数器电路、时间及功能设置电路、时间显示电路等。

其中,定时器/计数器电路是整个电子钟设计的基础。

一般都是用定时/计数器来产生定时中断信号(例如定时时间间隔为1/100s),然后通过软件计数器来相继获得实时时钟的秒、分、时等时间值。

实现电子钟的软件主要由主程序和中断服务程序两模块组成。

在主程序中,除了完成对系统的初始化和中断向量的设置外,需要对各种软件时间计数器进行查询、比较和判断,并根据判断结果发出各种控制信号,以完成时钟的显示操作。

在定时中断服务程序中,需要设计1/100s计数器,秒个位、秒十位计数器,分个位、分十位计数器,时个位、时十位计数器以及由键盘设置的各定时时间计数器和各作息时间计数器等等,并对各计数器酌情作加1计数。

然后,由主程序来完成对各种计数器内容的查询。

注意事项:

向定时器通道写计数初值时,无论以二进制还是十进制形式写入,如果其值超过255,需分两次分别写入计数器的高、低字节,否则只需写一次。

究竟写一次还是两次,要在写初值之前通过写控制字来设置。

3.1 单片机连线。

1、电源:

这当然是必不可少的了。

单片机使用的是5V电源,其中正极接40管脚,负极(地)接20管脚。

2、振蒎电路:

单片机是一种时序电路,必须供给脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。

只要买来晶体震荡器,电容,连上就能了,按图1接上即可。

3、复位管脚:

按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。

4、EA管脚:

EA管脚接到正电源端。

至此,一个单片机就接好,通上电,单片机就开始工作了。

 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个管脚相连,不然单片机就没法控制它了,那么和哪个管脚相连呢?

单片机上除了刚才用掉的5个管脚,还有35个,我们将这个LED和1脚相连。

(见图1,其中R1是限流电阻)

 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。

因此要1脚我们要能够控制,也就是说,我们要能够让1管脚按要求变为高或低电平。

即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?

叫它什么名字呢?

设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不能由我们来更改。

3.2MAX7219及其功能说明

首先应该有数码管来显示相应的时间,这要用到一片7219芯片来驱动所用到的数码管。

下面我们就7219的功能做一些简单的介绍。

MAX7219是MAXIM公司生产的串行输入/输出共阴极数码管显示驱动芯片,一片MAX7219可驱动8个7段(包括小数点共8段)数字LED、LED条线图形显示器、或64个分立的LED发光二级管。

该芯片具有10MHz传输率的三线串行接口可与任何微处理器相连,只需一个外接电阻即可设置所有LED的段电流。

它的操作很简单,MCU只需通过模拟SPI三线接口就可以将相关的指令写入MAX7219的内部指令和数据寄存器,同时它还允许用户选择多种译码方式和译码位。

此外它还支持多片7219串联方式,这样MCU就可以通过3根线(即串行数据线、串行时钟线和芯片选通线)控制更多的数码管显示。

MAX7219的外部引脚分配

各引脚的功能为:

DIN:

串行数据输入端

DOUT:

串行数据输出端,用于级连扩展

LOAD:

装载数据输入

CLK:

串行时钟输入

DIG0~DIG7:

8位LED位选线,从共阴极LED中吸入电流

SEGA~SEGGDP7段驱动和小数点驱动

ISET:

通过一个10k电阻和Vcc相连,设置段电流

MAX7219有下列几组寄存器:

(如图3)

MAX7219内部的寄存器如下图,主要有:

译码控制寄存器、亮度控制寄存器、扫描界限寄存器、关断模式寄存器、测试控制寄存器。

编程时只有正确操作这些寄存器,MAX7219才可工作。

4.1流程图及其说明整个程序的流程图如下所示:

4.2.1MAX7219驱动

对于时钟电路的设计我们首先做的是数码管驱动芯片7219。

通过7219的驱动,是数码管能显示通过软件设置的时间。

电路原理图如下图,MAX7219与单片机的连接只需要3条线:

LOAD(CS)片选引脚、CLK串行时钟引脚、DIN串行数据引脚。

其中C1为电源滤波电容,R1用来设置段电流。

电路原理图

通过上面的原理和相应的程序使数码管完成显示功能,具体程序将在下面的章节分析。

4.2.2时钟运行进位规则

这一部分主要完成时钟的进位和正常的时间显示问题。

我们定义了一个长度为六的数组,分别用来表示时钟的时、分、秒的个位和十位。

这当中主要考虑的就是时间的进位问题以及十、分、秒十位和各位的进制问题。

其中时、分、秒的个位都是十进制。

而十位是六进制。

当分、秒的十位为六而个位为零的时候要同时清零,已达到时、分整体六十进制。

这对于软件编程来说还是比较简单的,只需要用if语句就可以完成。

这主要需要注意的就是时分秒的同时清零问题,让它完成时钟的具体功能。

具体的程序后面源程序清单中会有介绍。

4.3源程序及注释

#include

#defineDECODE_MODE0x09//译码控制寄存器

#defineINTENSITY0x0A//亮度控制寄存器

#defineSCAN_LIMIT0x0B//扫描界限寄存器

#defineSHUT_DOWN0x0C//关断模式寄存器

#defineDISPLAY_TEST0x0F//测试控制寄存器

#defineucharunsignedchar

#defineuintunsignedint

sbitLOAD=P1^0;//MAX7219片选12脚

sbitDIN=P1^1;//MAX7219串行数据1脚

sbitCLK=P1^2;//MAX7219串行时钟13脚

sbitkey1=P3^0;

sbitkey2=P3^1;

sbitkey3=P3^2;

sbitkey4=P3^3;

/*sbitKEY1=P1^3;//暂停或运行

sbitKEY2=P1^4;//位选择

sbitKEY3=P1^5;//增加

sbitKEY4=P1^6;//减少

ucharsj[7]={0};

uinttime=0,flash=0;

uchark=0,i=0;

voidWrite7219(unsignedcharaddress,unsignedchardat);

voidInitial(void);

voidInit(void);

voidWrite7219(unsignedcharaddress,unsignedchardat)

{

uchari;

LOAD=0;//拉低片选线,选中器件

for(i=0;i<8;i++)//发送地址

{

CLK=0;//清零时钟总线

DIN=(bit)(address&0x80);//每次取高字节

address<<=1;//左移一位

CLK=1;//时钟上升沿,发送地址

}

for(i=0;i<8;i++)//发送数据{

CLK=0;

DIN=(bit)(dat&0x80);

dat<<=1;

CLK=1;//时钟上升沿,发送数据

}

LOAD=1;//发送结束,上升沿锁存数据

}

voidInitial(void)

{uinti=0;

Write7219(SHUT_DOWN,0x01);//开启正常工作模式(0xX1)

Write7219(DISPLAY_TEST,0x00);//选择工作模式(0xX0)

Write7219(DECODE_MODE,0xff);//选用全译码模式

Write7219(SCAN_LIMIT,0x05);//8只LED全用

Write7219(INTENSITY,0x08);//设置初始亮度

for(i=1;i<7;i++)

{

Write7219(i,sj[i]);//数码管显示

}

}

voidInit(void){

TMOD=0x01;

TH0=0x4B;

TL0=0xFF;

EA=1;

ET0=1;

TR0=1;

}

/*voiddelay(ucharus){

while(--us);

}*/

voiddelayms(ucharaa)

{

uchari,j;

for(i=aa;i>0;i--)

for(j=110;j>0;j--);

}

voidkeyscan()

{

uchari;

if(key4==0)

{

delayms(100);

if(key4==0)

{/*

while(!

key4);

TR0=0;//关定时器0

Write7219(1,0);

Write7219(2,0);

Write7219(3,0);

Write7219(4,0);

Write7219(5,0);

Write7219(6,0);*/

for(i=1;i<7;i++)

{

Write7219(i,sj[i]);//数码管显示

}

i=0;

TR0=1;

}

}

if(key1==0)

{

delayms(100);

if(key1==0)

{

while(!

key1);

TR0=0;//关定时器0

i++;

if(i==7)

{

i=1;

/*TH0=0x4B;//初始化定时器0

TL0=0xFF;

time=0;

TR0=1;*/

}

}

}

if(i!

=0)

{

for(flash=0;flash<3;flash++){

Write7219(i,-1);

delayms(20000);

Write7219(i,sj[i]);

delayms(20000);}

if(key2==0)//增加键

{

delayms(100);

if(key2==0)

{

while(!

key2);//确认释放

switch(i)

{

case1:

//秒个位加一

{

sj[1]++;

if(sj[1]==10)

sj[1]=0;

}break;

case2:

//秒十位加一

{

sj[2]++;

if(sj[2]==6)

sj[2]=0;

}break;

case3:

//分个位加一

{

sj[3]++;

if(sj[3]==10)

sj[3]=0;

}break;

case4:

//分十位加一

{

sj[4]++;

if(sj[4]==6)

sj[4]=0;

}break;

case5:

//十个位加一

{

sj[5]++;

if(sj[5]==10)

sj[5]=0;

}break;

case6:

//时十位加一

{

sj[6]++;

if(sj[6]==3)

sj[6]=0;

}break;

}

}

}

if(key3==0)

{

delayms(100);

if(key3==0)

{

while(!

key3);

switch(i)

{

case1:

//秒个位减一

{

sj[1]--;

if(sj[1]==-1)

sj[1]=9;

}break;

case2:

//秒十位减一

{

sj[2]--;

if(sj[2]==-1)

sj[2]=5;

}break;

case3:

//分个位减一

{

sj[3]--;

if(sj[3]==-1)

sj[3]=9;

}break;

case4:

//分十位减一

{

sj[4]--;

if(sj[4]==-1)

sj[4]=5;

}break;

case5:

//时个位减一

{

sj[5]--;

if(sj[5]==-1)

sj[5]=9;

}break;

case6:

//是十位减一

{

sj[6]--;

if(sj[6]==-1)

sj[6]=2;

}break

}

}

}

}

}

voidmain(void)

{

uchari,k=0;

Initial();

Init();//MAX7219初始化

while

(1)

{

keyscan();//时间显示和进位

if(sj[1]==10){

sj[1]=0;

sj[2]++;

if(sj[2]==6){

sj[2]=0;

sj[3]++;

if(sj[3]==10){

sj[3]=0;

sj[4]++;

if(sj[4]==6){

sj[4]=0;

sj[5]++;

if(sj[5]==10){

sj[5]=0;

sj[6]++;

}

}

}

}

}

if(sj[6]==2&&sj[5]==4){

sj[6]=0;

sj[5]=0;

}

for(i=1;i<7;i++)

{

Write7219(i,sj[i]);//数码管显示

}

}

}

voidtime0()interrupt1

{

TH0=0x4B;

TL0=0xFF;

time++;

if(time==20)

{

time=0;

sj[1]++;

}

}

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 商务科技

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1