单片机实验报告实时时钟Word文档格式.docx
- 文档编号:18099115
- 上传时间:2022-12-13
- 格式:DOCX
- 页数:17
- 大小:56.11KB
单片机实验报告实时时钟Word文档格式.docx
《单片机实验报告实时时钟Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机实验报告实时时钟Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
图管脚驱动模式的参数配置
5.程实现3×
4矩阵键盘扫描功能,将按下键的键值显示在数码管上。
相应的按键管脚配置如图如示。
按键管脚配置
实验程序:
//----------------------------------------------------------------------------
//文件名:
main.c
#include<
m8c.h>
//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;
/**********************************************************************/
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;
}
else
led2_dig++;
}
}
if(flag0==0)
led1=led1_dig;
led2=led2_dig;
led3=led3_dig;
led4=led4_dig;
switch(led_count)
case1:
if(setnum==1&
dpcount%200>
99)//在设置的时候控制LED1灯的闪烁,半秒时间亮半秒时间灭
SEL=0xff&
LED1,DATA=0xff;
//LED1灯灭高电平熄灭,低电平点亮
else
LED1,DATA=reg[led1];
//LED1灯亮,sel就是设置的地址,data就是置数
break;
case2:
if(setnum==2&
99)
SEL=0xff&
LED2,DATA=0xff;
elseif(flag1||led_dp==2&
dpcount%200<
100)
LED2,DATA=reg[led2]&
dp;
//秒钟的点额外分配,
LED2,DATA=reg[led2];
case3:
if(setnum==3&
LED3,DATA=0xff;
LED3,DATA=reg[led3];
case4:
if(setnum==4&
LED4,DATA=0xff;
LED4,DATA=reg[led4];
default:
++led_count;
//设置的时候第几位闪烁
}
voidKeyScan()//键盘中断程序
{
PRT5DR=0b11111110;
//assignp5[0]=0
temp=PRT5DR;
temp&
=0xF0;
//
if(temp!
=0xF0)
delay10ms
(1);
temp=PRT5DR;
temp&
if(temp!
temp=PRT5DR;
temp&
switch(temp)
case0X70:
key=7;
break;
case0XB0:
key=4;
case0XD0:
key=1;
case0XE0:
key=0;
PRT5DR=0b11111101;
//assignp5[1]=0
temp=PRT5DR;
temp&
if(temp!
case0x70:
key=8;
break;
case0b10110000:
key=5;
case0b11010000:
key=2;
case0b11100000:
key=sfb0;
}
PRT5DR=0b11111011;
//assignp5[2]=0
case0x70:
key=9;
break;
key=6;
key=3;
key=sfb1;
PRT5DR=0xf0;
voiddelay10ms(unsignedchartime)//延时函数
unsignedchara,b,c;
for(a=0;
a<
time;
a++)
for(b=0;
b<
10;
b++)
for(c=0;
c<
120;
c++);
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;
setnum=2;
4||key<
10&
led1_dig<
2)
led2_dig=key;
setnum=3;
6)
led3_dig=key;
setnum=4;
10)
led4_dig=key;
setnum=0;
key=1;
flag1=0;
//启动开始计时
voidClockSet()
flag0=1;
key=CLOCK;
led1=clock1;
led2=clock2;
led3=clock3;
led4=clock4;
=sfb0)//设置第一个数,
=CLOCK)
led1=key;
key=CLOCK;
led1<
2)//设置第二位当第一位等于2时,第二位小于4
led2=key;
led3=key;
led4=key;
clock1=led1;
clock2=led2;
clock3=led3;
clock4=led4;
flag0=0;
voiddelay()//就是一个延时
BYTEtmp1,tmp2;
for(tmp1=0;
tmp1<
255;
tmp1++)
for(tmp2=0;
tmp2<
tmp2++);
voidmain()
INT_MSK0=0x0;
PRT5DR&
=0xf0;
PRT1DR=0x0f;
PRT5IE=0xf0;
INT_MSK0|=0x20;
M8C_EnableGInt;
stopCount=0;
//1:
停止计时0:
正常计时
//从左往右分别是第几个数码管
Timer8_1_EnableInt();
Timer8_1_Start();
//Timer8中断开启
led_dp=2;
//小数点位置
byte_Period=99;
byte_Duty=99;
PWM8_1_WritePeriod(byte_Period);
PWM8_1_WritePulseWidth(byte_Duty);
clock1=clock2=clock3=clock4=9;
//设置闹钟的初始值,确保在没有设定的情况下不会响
while
(1)
if(key==sfb1)//第1次按下sfb1
//Timer8_1_Stop();
flag1=1;
//flag1表示时钟暂停
while(key!
=sfb1);
//第二次按下sfb1
flag1=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();
//clock1=clock2=clock3=clock4=8;
三、实验总结
此次单片机实验让我收获很多。
一开始,由于自己的编程能力不好,只有时间设置和秒表有自己研究编写的足迹,所以从语句运用到寄存器的定义和使用,都存在很多问题。
经过同学的指点,对问题的不断发掘和思考,对单片机和编程语言的理解和使用能力有了明显的提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实验 报告 实时 时钟