单片机课程设计报告Word文档下载推荐.docx
- 文档编号:21476422
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:27
- 大小:210.87KB
单片机课程设计报告Word文档下载推荐.docx
《单片机课程设计报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告Word文档下载推荐.docx(27页珍藏版)》请在冰豆网上搜索。
实验中的数据时从时间芯片DS1302中读取,从DS1302中读出单字节的数据的流程如下图:
图3.1DS1302中读出单字节数据流程图
在从DS1302中读出数据时,首先要送入地址,然后再能读出我们指定地址处的数据。
具体实验代码如下:
//功能:
从DS1302中读出指定地址的数据
//读取单字节数据时序
//参数:
addr:
命令的第一字节部分,就是地址部分
//返回值:
读取的一字节数据
//
ucharread_ds1302(ucharaddr)
{
uchartmp;
//用于保存读取的数据
DS_RST=0;
//拉低RST
DS_SCLK=0;
//拉低SCLK
DS_RST=1;
//拉高RST
write_byte(addr);
//写入地址命令
tmp=read_byte();
//读取数据
//
//在SCLK为低电平时,完成数据传送
return(tmp);
}
向DS1302中写入指定数据
dat:
带写入的地址或数据
voidwrite_byte(uchardat)
{
uchari=0;
for(i=0;
i<
8;
i++)
DS_IO=(dat&
1);
//sbitDS_IO=P1^2;
,就是IO接口
_nop_(),_nop_();
DS_SCLK=1;
//SCLK有0-->
1,P1^2口数据被写入
dat>
>
=1;
//右移一位
}
//读取单字节数据
ucharread_byte(void)
uchardat=0;
uchartmp=0;
for(i=0;
i++)
{
_nop_(),_nop_();
DS_SCLK=0;
,SCLK:
1-->
0,从IO口读取数据到P1^2口中
tmp=DS_IO;
//将dat右移一位
dat>
//将tmp左移7位然后和dat作或运算,运算结果保存到dat中
dat|=(tmp<
<
7);
}
//将读出的16进制数据转化为10进制的
dat=BCD2DEC(dat);
return(dat);
3.2、写入时间数据
实验中的在将年的最后两位设为自己的学号以及后面手动修改时间时,都要向DS1302中写入指定的数据,向DS1302中指定地址写入单字节的数据的流程如下图:
图3.2DS1302中写入单字节数据流程图
向DS1302指定地址写入指定数据
//写入单字节数据时序
地址;
//dat:
要写入的数据
voidwrite_ds1302(ucharaddr,uchardat)
tmp=DEC2BCD(dat);
//使用宏DEC2BCD对数据进行转码
//写入地址
write_byte(tmp);
//写入数据
3.3、闪烁实现
一下为共阳数码管显示码的数码表:
十六进制
十进制
0xC0
0xF9
1
0xA4
2
0xB0
3
0x99
4
0x92
5
0x82
6
0xF8
7
0x80
8
0x90
9
0xFF
关闭显示
表3.1共阳极数码管数码表
在上表中的最后一行,就是0xff就是关闭数码管的显示,所以这里的设置显示闪烁的设计方法就是让数码管进行关闭和显示数码进行交替进行,关闭数码管显示“一定次数”,然后在显示显示数码“一定次数”,只要这里的“一定次数”设置的合理就可以看出效果。
我再实验代码中设置是10次,该闪烁设计流程如下图(以日期为例):
图3.3闪烁流程图
上图就是我在设计闪烁使用的方法,上面只是对日期显示的闪烁流程,别的时间单位的闪烁处理方法都是一样的,具体实现代码如下:
//show_time(SYSTEM_TIMEstr_time)需要显示的年月日时分秒和星期
voidshow_time(SYSTEM_TIMEstr_time)
//显示年
display_num(0,2);
//年的第一位,显示:
display_num(1,0);
//年的第二位,显示:
tmp=str_time.year;
//获取年份的最后两位
///modifybyliuliang
//////////////////////////////////////////////////////////////////////////////////////////
//这里省略了年的后两位和月的显示
//获取日期,然后显示
tmp=str_time.date;
if(NUM_SET%7==3)
NUM_TIME++;
if(NUM_TIME==NUM_TIME_MAX)
{
NUM_TIME=0;
if(tmp>
9)
{
display_num(6,(tmp/10));
}
display_num(7,(tmp%10));
}
else
display_num(6,10);
//关闭数码管显示
display_num(7,10);
//
else
if(tmp>
display_num(6,(tmp/10));
display_num(7,(tmp%10));
//这里省略了时、分、秒、星期的显示
///end
3.4、总结
4、程序清单
整个程序共三个源文件,三个头文件,分别是:
main.h、main.c、ds1302.h、ds1302.c、delay.h、delay.c,其中main.h、ds1302.h、delay.h、delay.c都没有改变,ds1302.c中我只有修改了ds1302_init函数,别的没有修改,我写的修改或加入的代码都在main.c文件中,所以这里就只释出main.c文件,其修改后的ds1302.c中的ds1302_init函数。
如下:
///////////////////////////////////////////////////////////////////////////////
//main.c
#include"
main.h"
delay.h"
ds1302.h"
#defineDATAP0//P0口用于输出要显示数据
//P1口用于控制在显示数据的LED,使用P2口控制了一个译码器(74hc154),用于选择LED
#defineSHOWP2
//共阳数码管显示码
ucharcodeDIS_CODE[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF};
///addbyliuliang
intNUM_TIME=0;
//记录当前关闭数码管显示的次数
intNUM_TIME_MAX=10;
//控制亮闪速度
intNUM_SET=-1;
//按下SET按钮的数量
intAJUST=0;
//表示是启用功调节
intIsAdjusted=0;
//就是表明是否已经按下了ADD或SUB键,IsAdjusted=0表示还没按下ADD或SUB键
sbitSUB=P3^6;
//SUB键(p3.6)
SYSTEM_TIMEALL_TIME;
//定义全局SYSTEM_TIME结构体变量
///end
//display_num(uchar_show;
uhar_data)数码管的选码和显示段码
voiddisplay_num(uchar_show,uchar_data)
SHOW=_show;
//选择数码管
DATA=~DIS_CODE[_data];
//取反共阴
delay_ms
(1);
//延时
if(NUM_SET%7==1)//按下SET按钮
display_num(2,(tmp/10));
//年的第三位,显示:
tmp/10
display_num(3,(tmp%10));
//年的第四位,显示:
tmp%10
display_num(2,10);
display_num(3,10);
display_num(2,(tmp/10));
//获取月份,然后显示
tmp=str_time.month;
if(NUM_SET%7==2)
9)
display_num(4,(tmp/10));
display_num(5,(tmp%10));
display_num(4,10);
////关闭数码管显示
display_num(4,10);
if(tmp>
display_num(4,(tmp/10));
display_num(5,(tmp%10));
//获取小时,然后显示
tmp=str_time.hour;
if(NUM_SET%7==4)
display_num(8,(tmp/10));
display_num(9,(tmp%10));
display_num(8,10);
display_num(9,10);
display_num(8,(tmp/10));
display_num(9,(tmp%10));
//获取分钟,然后显示
tmp=str_time.min;
if(NUM_SET%7==5)
display_num(10,(tmp/10));
display_num(11,(tmp%10));
display_num(10,10);
display_num(11,10);
//
display_num(10,(tmp/10));
display_num(11,(tmp%10));
//获取秒,然后显示
tmp=str_time.sec;
if(NUM_SET%7==6)
display_num(12,(tmp/10));
display_num(13,(tmp%10));
display_num(12,10);
display_num(13,10);
display_num(12,(tmp/10));
display_num(13,(tmp%10));
//获取星期,然后显示
tmp=str_time.day;
if(NUM_SET%7==0)
display_num(14,(tmp%10));
display_num(14,10);
display_num(14,(tmp%10));
/////////////////////////////////////////
///addbyliuilang
////////////////////////////////////////
//外部中断0服务程序
voidint0(void)interrupt0
EA=0;
//关闭中断总开关
AJUST=1;
//开始调节
if(IsAdjusted==0)//还没调节
if(NUM_SET==-1)
NUM_SET=1;
//控制调节对象
else
NUM_SET++;
IsAdjusted=0;
AJUST=0;
NUM_SET=-1;
EA=1;
//开启中断总开关
//处理时间
//参数:
type=1表示加,type=0表示减
voidpro_time(inttype)
SYSTEM_TIMEcur_time;
//定义SYSTEM_TIME结构体变量
cur_time=read_time();
//获取当前时间
////////
switch(NUM_SET%7)
case1:
//年
tmp=cur_time.year;
if(type==1)//加操作
tmp=tmp+1;
}
else//减操作
0){tmp=tmp-1;
write_ds1302(DS1302_YEAR,tmp);
//向DS1302中写入数据
ALL_TIME.year=tmp;
//更新全局变量中的相应的信息
break;
case2:
//月
tmp=cur_time.month;
if(tmp==12){tmp=1;
else{tmp=tmp+1;
1){tmp=tmp-1;
write_ds1302(DS1302_MONTH,tmp);
ALL_TIME.month=tmp;
case3:
//日
tmp=cur_time.date;
if(tmp==31){tmp=1;
}//这里就假设月最大位31天
write_ds1302(DS1302_DATE,tmp);
ALL_TIME.date=
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)