江苏大学单片机课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

单片机课程实验报告

班级J计算机1302 学号********** 姓名杨岚

指导老师余景华

2016.07.09

一、多功能数字钟的设计要求:

1.能在LED显示器上实现正常的时分秒计时

2.能通过键盘输入当前时间,并从该时间开始计时

3.有校时、校分功能

4.有报时功能,通过指示灯表示

5.有闹时功能,闹时时间可以设定,通过指示灯表示

二、课程设计电路图:

图1 设计电路图

•HD7279A的片选引脚CS连在P5.7;

·通过C8051F020的P1.6、P1.7连接7279A的CLK和DATA实现串行数据编程;

•KEY连在比较器1的同相输入端CP1P

三、设计思路:

根据课程设计要求,我们要设计一个多功能数字电子时钟,随着人类科技文明的发展,高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。本实验正是基于这种设计方向,以单片机(C8051F020)为控制核心,设计制作一个多功能的数字时钟。在这些当中,必须要求要有时钟功能、校时校分功能、整点报时和闹钟功能等。

1.1首先要实现数码管的正常时分秒计时必须初始化系统时钟,初始化I/O端口以及定时器和使能比较器等,为系统的运行做必要的准备。

1.2其次通过键盘输入当前时间并从当前时间开始计时,这个过程中搞清楚,通过键盘输入的数据送到了哪里,是通过什么样的方式送进去的,同时对时间的计时有一个严密的算法来控制。

1.3在时间通过键盘输入并正常显示后,可以通过按键来进行校时、校分的功能。并显示出校正后的时间

1.4通过按键实现闹钟功能,在设置闹钟的同时,原时间能确保正确行走。

7279指令说明:88H,闪烁控制指令,d1-d8对应8个数码管,0表示闪烁,1表示不闪烁。

开始

输入按键(ABCD) 输入按键(F) 当达到整点时,

A (校时的高位) F(输入闹钟)数码管闪烁3秒

B(校时的低位)当当前时间与闹钟时间相等时,

C(校分的高位)数码管闪烁2秒。

D(校分的低位)

图2 功能模块图

•输入按键A使得时钟的时高位加1,若时高位值超过2则返回0值。

•输入按键B使得时钟的时低位加1,若时低位值超过9则返回0值同时时高位加1,最后判断时高位>1且时低位>3则时高位=0,时低位0。

•输入按键C使得时钟的分高位加1,若分高位值超过5,则时低位加1,分高位至0。

•输入按键D使得时钟的分低位加1,若分低位值超过9,则分高位加1,分低位至0。

•输入按键E使得时钟的秒高位加1,若秒高位值超过5,则分低位加1,秒高位至0。

•按键F进入闹钟模块。

四、程序的结构图

图3 主程序流程图

五、具体功能模块的设计及实现:

1、端口初始化:

将允许SMBus、SPI0和UART0,使能交叉开关和弱上拉。

实现代码:

void PORT_Init (void)

{

XBR0 = 0x07; //允许SMBus、SPI0和UART0

XBR1 = 0x00;

XBR2 = 0x44; //使能交叉开关和弱上拉

}

2、定时器初始化

将T0以方式一,系统时钟频率计数,1000个脉冲为一秒。

实现代码:

void Timer0_Init (void)

{

CKCON|=0x8; //T0按系统时钟频率计数

TMOD|=0x1; //T0方式1

Count1ms=10;

TR0 = 0; //停止T0

TH0 = (-SYSCLK/1000) >> 8; //定时1ms的时间常数

TL0 = -SYSCLK/1000;

TR0 = 1; //启动T0

IE|= 0x2; //开T0中断

}

3、读取按键值

首先需要判断是否按键,若未按键则返回-1,若按键则记录保存按键的值,将其放在keyvalue中保存。

实现代码:

unsigned char GetKeyValue(void)

{

unsigned char KeyValue;

if(CPT1CN&0x40) return -1;//if (P17==1) return -1; //无键按下

Send7279Byte(0x15); //发读键盘命令

KeyValue=Receive7279Byte();

NOSELECT7279;

return KeyValue;

}

图4 读取按键值流程图

4、首次启动程序时输入初始时间

首先在显示器上显示-,提示程序开始运行,其后将按键进来的六个数字依次保存在num 中(若按键不是0-9则无效),然后再显示器上显示。

实现代码:

unsigned long InputNum(void)

{

unsigned long Num=0;

unsigned char i=0, KeyValue;

DispLED(" -",0);//输入提示

FlashLED(0); //第一位闪烁

Delay1s(1);

while(1)

{

KeyValue=GetKeyValue();

if (i==6) //6位数据输入完,返回

{

FlashLED(8); //关闪烁

return Num;

}

if((KeyValue>=0) && (KeyValue<=9)) //只接收十进制的0到9 {

i++;

Send7279Byte(0xC8); //发送键码值,按方式1译码下载显示 Send7279Byte(KeyValue);

MoveLeft(); //显示并左移一位,仍使低位显示并闪烁。

Send7279Byte(0x90);

Send7279Byte(0x01);

NOSELECT7279;

WaitKeyOff();

Num*=10; //转换成十进制

Num+=KeyValue;

Delay1ms(200);

}

}

}

5、显示功能

依次将小时的十位、个位,分钟的十位、个位,秒钟的十位、个位显示在显示器的相应LED上。

实现代码:

void DispTime(void)

{

Send7279Byte(0x85); //在最高位(第5位)LED显示小时的高位

Send7279Byte(HourH);

Send7279Byte(0x84); //在第4位LED显示小时的低位

Send7279Byte(HourL);

Send7279Byte(0x83); //在第3位LED显示分钟的高位

Send7279Byte(MinuteH);

Send7279Byte(0x82); //在第2位LED显示分钟的低位

Send7279Byte(MinuteL);

Send7279Byte(0x81); //在第1位LED显示秒钟的高位

相关文档
最新文档