单片机实验报告实时时钟.docx

上传人:b****6 文档编号:16587989 上传时间:2023-07-15 格式:DOCX 页数:17 大小:40.12KB
下载 相关 举报
单片机实验报告实时时钟.docx_第1页
第1页 / 共17页
单片机实验报告实时时钟.docx_第2页
第2页 / 共17页
单片机实验报告实时时钟.docx_第3页
第3页 / 共17页
单片机实验报告实时时钟.docx_第4页
第4页 / 共17页
单片机实验报告实时时钟.docx_第5页
第5页 / 共17页
单片机实验报告实时时钟.docx_第6页
第6页 / 共17页
单片机实验报告实时时钟.docx_第7页
第7页 / 共17页
单片机实验报告实时时钟.docx_第8页
第8页 / 共17页
单片机实验报告实时时钟.docx_第9页
第9页 / 共17页
单片机实验报告实时时钟.docx_第10页
第10页 / 共17页
单片机实验报告实时时钟.docx_第11页
第11页 / 共17页
单片机实验报告实时时钟.docx_第12页
第12页 / 共17页
单片机实验报告实时时钟.docx_第13页
第13页 / 共17页
单片机实验报告实时时钟.docx_第14页
第14页 / 共17页
单片机实验报告实时时钟.docx_第15页
第15页 / 共17页
单片机实验报告实时时钟.docx_第16页
第16页 / 共17页
单片机实验报告实时时钟.docx_第17页
第17页 / 共17页
亲,该文档总共17页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

单片机实验报告实时时钟.docx

《单片机实验报告实时时钟.docx》由会员分享,可在线阅读,更多相关《单片机实验报告实时时钟.docx(17页珍藏版)》请在冰点文库上搜索。

单片机实验报告实时时钟.docx

单片机实验报告实时时钟

单片机实验报告

 

姓名:

学号:

姓名:

学号:

 

、实验要求:

1.设计一个实时时钟,四个八段数码管显示格式为:

XX.XX(小时/分钟,24小

时计时法);使用一个LED用来显示秒的状态,显示规则为:

以1Hz频率闪烁,既亮灭一次为一秒钟,500毫秒亮、500毫秒灭。

2.实时时钟可以通过3x4键盘设置初始值。

数字键用于输入数值,sfbO键为设置键,sfb1键为开关键。

3.设置初始值的流程:

先按下sfbO键,四个数码管显示内容变为全“0”,并

以1HZ频率开始闪烁并等待键盘输入小时、分钟数值(其中小时2位数,分

钟2位数),输入完毕后,实时时钟开始以新输入的时间值开始计时。

4.开关键的使用方法:

在计时模式下按sfb1键一次,时钟停止计时,时间数值停留在按键那刻;在停止计时模式下,按sfb1键一次时钟开始继续计时。

5.定时闹铃功能(加分功能,可选做):

按sgp0_key键,进入闹铃值设置模式,

四个数码管显示内容变为全“0”,并以1HZ频率开始闪烁并等待键盘输入小时、分钟数值(其中小时2位数,分钟2位数),此时计时仍然运行,输入完毕后,显示内容恢复为计时值。

当时钟计时到达闹铃值,驱动蜂鸣器鸣响8

次。

6.增加通过RS232接口,更改时钟当前时间的功能。

二、实验程序说明:

对实验按键和存储位置的说明语句:

1.创建一个新工程,在该工程的器件编辑器(DeviceEditor)中选择定时器模块,然后将其按要求放置,如图所示。

图定时器模块放置图

2.配置全局资源。

单击参数内容方框里的下拉箭头,选择合适的参数值,便可以更改工程中默认的全局资源。

此实验配置的全局资源如图所示。

GlobalRsfowrces

Vdu?

FewerSetting[Vcc/创劉

5lCM/24MHz

CPU.Oock

Sy£lk/2

Sleep_Tinri&r

512_H5

VC1=SvsClk/N

12

VC2=k/Cl?

N

10

VCSSoucs

vcz

VC3Divider

100

SvsCIkSource

Irtwial

SysClkx2Disable:

Na

AralogPower

5COn/RefLwj

FiefMuk

(Vdd/ZIt/B^ndGap

Doable

Op-AmpBias

Low

A_Bufl_Po^r

Low

TripVolage[LVD]

J.81V11

LWDThfottleflack

Disable

WatchdogEnable

Disable

图全局资源配置

3.按图配置Timer8定时器模块的参数

TinerS1

UserModuleIParameters

Value

Clock

VC3

Capture

Low

TerminalCountOwt

None

匚ompareOut

|None|十

Period

9

Compare7alue

0

匚ompareTppe

LessThanOrEqual

IntersptTj^pe

Termin-elCount

CltKkSyric

S^jhcitoGpsCIk

兀-尸ul新Width

FullClock

InveitCaplure

Norrnall

4•按图配置管脚驱动模式

Name

Port

Select

Drive

Interrupt

dp

P3[0]

SldCPU

Strong

Disablelnl

g

P3[1]

SldCPU

Shorig

Disatlelnt

1

P3[2]

SUdCPU

Sbong

Disatlelnl

e

P3[3]

StdCPU

Strong

Disablelrt

d

P3[4]

SldCPU

Strong

Disatilelnt

e

P3[5]

SUdCPU

Sbung

Dkablalnt

b

P3[6]

SldCPU

Strong

Disablelnt

■J

P3P1

SldCPU

Shong

Disablelnt

LED_1

P4[0]

SldCPU

Strong

Drsatilelnt

LED_2

P4[1]

SldCPU

Strong

Disablelnl

LED」

P4[2]

SldCPU

Strong

Disablelnt

LED4

P4[3]

SUdCPU

Strong

Disablelr*

图管脚驱动模式的参数配置

5.程实现3X4矩阵键盘扫描功能,将按下键的键值显示在数码管上。

相应的按键管脚配置如图如示。

Fort

Select

Driyie

Interrupt

coLO-kev1

P5{0]

SldCPU

Strong

DisaHelnt

00|_1_呦

SUjCPU

Strong

Disablelnt

col_2_key

田田

SldCPU

Strong

Diublelnt

NULL

P5(3]

SMCRJ

Strong

DnaUelnt

r(wj_0_kejJ

P甲]

SLdCPU

High2

FallingEdge

rowi1_k^y

P5(5l

StdCFU

HighZ

FallingEdge

ro

_2_key

P5(S]

SldCPU

HighZ

FalingEd^e

row_3_kev

P517]

StdCFU

HighZ

FallingEdge^

Port_7_0

P徊

SldCPU

HighM上

Disabldnt

PM

SldCPU

High

Dis^blelnt

按键管脚配置

实验程序:

////文件名:

main.c

//

#include//partspecificconstantsandmacros

#include"PSoCAPI.h"//PSoCAPIdefinitionsforallUserModules#pragmainterrupt_handlerKeyScan#pragmainterrupt_handlertimer1_ISR

//voidKeyScan();

voiddelay10ms(unsignedchartime);

voidDispaly(unsignedchark);

unsignedcharkey=1,temp,stopCount;

BYTEbyte_Period,byte_Duty;

#defineDATAPRT3DR

#defineSELPRT4DR

#defineLED10b11111110

#defineLED20b11111101

#defineLED30b11111011

#defineLED40b11110111

#definedp0b11111110

#definesfb010

#definesfb111

#defineSTOP12

#defineRESET13

#defineCLOCK14

#definesgp0_key0

/*commonanodeLED,thereforetheLEDwilllightwhenthepinislow*/unsignedcharnum[17]=

{0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff};

分别是

unsignedcharreg[]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09,0x11,0xc1,0x63,0x85,0x61,0x71,0xff};

unsignedcharled1_dig=0,led2_dig=0,led3_dig=0,led4_dig=0;//

1,2,3,4数码管现在的数unsignedcharled1=0,led2=0,led3=0,led4=0;//?

?

?

?

//当做缓存的数,设置的时候用到。

unsignedcharled_count=1;unsignedcharled_dp=0,setnum=1;

//setnum表示当前设置的是第几位

unsignedcharflag0,flag1,i,j;//flag0设置当前显示的是时钟还是设置的数,flag1设置时钟是停下来还是走

unsignedintcount=0,dpcount=0;

//count就是一个计数的,dpcount是专门针对秒钟的点设置的计数的,根据实验的要求要分开

unsignedcharclock1,clock2,clock3,clock4;

I**********************************************************************/voidtimer1_ISR()

{

if(led_count==5)led_count=1;//从第一位开始dpcount++;

if(flag1==0&&count++==200)

/*频率是五十赫兹,要求四个数码管都显示一边,乘以四,就是200*/

{

count=0;

if(led4_dig++==9)//if函数设置进制的问题,考虑时间不是十进制,

所以对每位分别设置

{

led4_dig=0;if(led3_dig++==5){

led3_dig=0;

if(led2_dig==3&&led1_dig==2||led2_dig==9)

{

led2_dig=0;

if(led1_dig++==2)

led1_dig=0;

}

elseled2_dig++;

}

}

}

if(flag0==0)

{

led1=led1_dig;

led2=led2_dig;

led3=led3_dig;

led4=led4_dig;

}

switch(led_count)

{

case1:

在设置的时候控制LED1

灯灭高电平熄灭,低电平

灯亮,sel就是设置

if(setnum==1&&dpcount%200>99)//灯的闪烁,半秒时间亮半秒时间灭SEL=0xff&LED1,DATA=0xff;//LED1点亮

else

SEL=0xff&LED1,DATA=reg[led1];//LED1的地址,data就是置数

break;

case2:

if(setnum==2&&dpcount%200>99)SEL=0xff&LED2,DATA=0xff;

elseif(flag1||led_dp==2&&dpcount%200<100)SEL=0xff&LED2,DATA=reg[led2]&dp;//秒钟的点额外分配,else

SEL=0xff&LED2,DATA=reg[led2];

break;

case3:

if(setnum==3&&dpcount%200>99)

SEL=0xff&LED3,DATA=0xff;

else

SEL=0xff&LED3,DATA=reg[led3];

break;

case4:

if(setnum==4&&dpcount%200>99)

SEL=0xff&LED4,DATA=0xff;

else

SEL=0xff&LED4,DATA=reg[led4];

break;

default:

break;

}

++led_count;//设置的时候第几位闪烁

}

voidKeyScan()//键盘中断程序

{

PRT5DR=0b11111110;//assignp5[0]=0temp=PRT5DR;

temp&=0xF0;//

if(temp!

=0xF0)

{

delay10ms

(1);temp=PRT5DR;

temp&=0xF0;

if(temp!

=0xF0)

{temp=PRT5DR;temp&=0xF0;switch(temp){case0X70:

key=7;break;

case0XB0:

key=4;break;

case0XD0:

key=1;break;

case0XE0:

key=0;break;

}

}

}

PRT5DR=0b11111101;//assignp5[1]=0temp=PRT5DR;

temp&=0xF0;if(temp!

=0xF0)

{

delay10ms

(1);temp=PRT5DR;temp&=0xF0;

if(temp!

=0xF0)

{

temp=PRT5DR;temp&=0xF0;switch(temp){case0x70:

key=8;break;

case0b10110000:

key=5;break;

case0b11010000:

key=2;break;

case0b11100000:

key=sfb0;break;

}

}

}

PRT5DR=0b11111011;//assignp5[2]=0temp=PRT5DR;

temp&=0xF0;

if(temp!

=0xF0)

{

delay10ms

(1);temp=PRT5DR;temp&=0xF0;if(temp!

=0xF0)

{temp=PRT5DR;temp&=0xF0;switch(temp){case0x70:

key=9;break;

case0b10110000:

key=6;break;

case0b11010000:

key=3;break;

case0b11100000:

key=sfb1;break;

}

}

}

PRT5DR=0xf0;

延时函数

}

voiddelay10ms(unsignedchartime)//unsignedchara,b,c;

for(a=0;a

}

voidReset()//选择重置时间,内容跟设置闹钟差不多{

flag1=1;

key=STOP;led1_dig=led2_dig=led3_dig=led4_dig=0;setnum=1;

while(key!

=sfb0)

{

if(key!

=STOP)

{if(key<3)led1_dig=key;

key=STOP;

}delay10ms

(1);

}setnum=2;key=STOP;

while(key!

=sfb0)

{

if(key!

=STOP)

{

if(key<4||key<10&&led1_dig<2)led2_dig=key;

key=STOP;

}delay10ms

(1);

}setnum=3;key=STOP;

while(key!

=sfb0)

{

if(key!

=STOP)

{if(key<6)led3_dig=key;

key=STOP;

}

delay10ms

(1);

}

setnum=4;

key=STOP;

while(key!

=sfb0)

{

if(key!

=STOP)

{

if(key<10)

led4_dig=key;key=STOP;

}

delay10ms

(1);

}

setnum=0;

count=0;

key=1;

flag1=0;//启动开始计时}

voidClockSet()

{

flag0=1;

key=CLOCK;

led1=clock1;

led2=clock2;

led3=clock3;

led4=clock4;

setnum=1;

while(key!

=sfb0)//设置第一个数,

{

if(key!

=CLOCK)

{

if(key<3)led1=key;

key=CLOCK;

}

delay10ms

(1);

}

key=CLOCK;

setnum=2;

while(key!

=sfb0)

{

if(key!

=CLOCK)

设置第二位当第一位等于

{

if(key<4||key<10&&led1<2)//

2时,第二位小于4led2=key;

key=CLOCK;

}

delay10ms

(1);

}

key=CLOCK;

setnum=3;

while(key!

=sfb0)

{

if(key!

=CLOCK)

{

if(key<6)led3=key;

key=CLOCK;

}

delay10ms

(1);

}

key=CLOCK;

setnum=4;

while(key!

=sfb0)

{

if(key!

=CLOCK)

{

if(key<10)led4=key;

key=CLOCK;

}

delay10ms

(1);

}

key=1;

setnum=0;

clock1=led1;

clock2=led2;

clock3=led3;

clock4=led4;

flag0=0;

}

voiddelay()//就是一个延时

{

BYTEtmp1,tmp2;

for(tmp1=0;tmp1<255;tmp1++)

for(tmp2=0;tmp2<255;tmp2++);}

voidmain()

{

INT_MSK0=0x0;PRT5DR&=0xf0;PRT1DR=0x0f;PRT5IE=0xf0;

INT_MSK0|=0x20;M8C_EnableGInt;

stopCount=0;//1:

停止计时0:

正常计时setnum=0;//从左往右分别是第几个数码管

Timer8_1_EnableInt();

中断开启

M8C_EnableGInt;Timer8_1_Start();//Timer8led_dp=2;//小数点位置

byte_Period=99;byte_Duty=99;PWM8_1_WritePeriod(byte_Period);PWM8_1_WritePulseWidth(byte_Duty);

clock1=clock2=clock3=clock4=9;//设置闹钟的初始值,确保在没

有设定的情况下不会响

key=1;

while

(1)

{if(key==sfb1)//第1次按下sfb1

{//Timer8_1_Stop();key=STOP;flag1=1;//flag1表示时钟暂停while(key!

=sfb1);//第二次按下sfb1flag1=0;key=1;

}

elseif(key==sfb0)//重新设定时间

{

Reset();

}

elseif(key==sgp0_key)//设置闹钟

{

ClockSet();

}

else

{

Timer8_1_Start();//启动开始计时

}

if(led1_dig==clock1&&led2_dig==clock2&&led3_dig==clock3&&led4_dig==clock4)

{

for(i=0;i<8;i++)//判断是不是闹钟时间到了。

如果是的话,蜂鸣器响八次

{PWM8_1_Start();//调用蜂鸣器delay();

PWM8_1_Stop();

delay();

}

//clock1=clock2=clock3=clock4=8;

}

}

}

三、实验总结

此次单片机实验让我收获很多。

一开始,由于自己的编程能力不好,只有时间设置和秒表有自己研究编写的足迹,所以从语句运用到寄存器的定义和使用,都存在很多问题。

经过同学的指点,对问题的不断发掘和思考,对单片机和编程语言的理解和使用能力有了明显的提高。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2