版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验四 SPI总线的DS1302实时钟控制一、实验目的1、了解电子电路PROTEUS软件的在单片机方面的仿真应用2、掌握具有SPI总线DS1302、MAX7219芯片的应用及编程二、实验要求在PROTEUS环境下,利用DS1302实时钟芯片实现时间、日期的显示,并且具有调节时间、日期的功能,显示用共阴极LED显示。用串行芯片MAX7219驱动LED显示.实现此功能的电路原理图如下所示:1、显示“星期的共阳极二极管接到单片机的P0口,P0口数据线接上拉电阻;2、显示“时间或“日期,是采用MAX7219控制共阴极LED来实现3、DS1302的IO脚接单片机的P1.1,时钟信号SCLK接单片机P1.
2、0,复位信号/RST接单片机P1.2。DS1302的晶振在这里可以不接,电源、地线都省略。4、MAX7219是用来驱动“时间或“日期的LED显示的。MAX7219的DIN信号脚接单片机的P2.0,/LOAD接单片机的P2.1,CLK接单片机的P2.2;5、时间/日期的调整:按下调整键,再分别按相应的“星期、“年、“月、“日,“时、“分、“秒“键,即可以调整时间/日期;6、在正常显示时,按下“时间/日期“切换键,即可以在显示时间或日期来回切换。三、PROTEUS环境下的硬件设计1、翻开PROTEUS ISIS,在PROTEUS ISIS编辑窗口中单击列表上的“P按钮,添加以下元器件:元件名称所属
3、类AT89C51Microprocessor ICSCRYSTAL 晶振MisecllaneousCAP 电容CapacitorRES 电阻ResistorDS1302Microprocessor ICS7SEG-COM-ANODE共阳极OptoeletronicsBUTTON按键Switches&relaysMAX7129Microprocessor ICSRESPACK-7排阻Resistor7SEG-MPX-CA-BLUE 共阴极Optoeletronics表1在PROTEUS编辑窗口添加完元器件,连线。如附图1。四、软件设计 在KEIL环境下编辑、编译程序,生成*.HEX文件后
4、,装入单片机即可。五、实验程序源程序:#include<reg51.h>/包含特殊功能存放器库#include <DS1302.h> #include <7219.h> /该汉字库要求在你要显示的位置装入你要的汉字模(16*16)。void main()Init7219(); /初始化7219 Set1302(time);/设置初始时间 Get1302(Curtime);/读回DS1302中的数据 P0=CODE1Curtime5-1;/显示星期 Display1(num);/默认显示时间 delay(255);/延时 delay(255); while(1
5、) Get1302(Curtime);/取数据 if(TICK=0)/判断是否更改 t=t; while(TICK=0) while (t=1) if(WEEK=0)/更改星期 w+; while (WEEK=0);Get1302(Curtime);Curtime5=Curtime5+w; if(Curtime5=8) Curtime5=1; w=0;Set1302(Curtime); else if(YEAR=0)/更改年份 while (YEAR=0); Get1302(Curtime);Curtime6=add5(Curtime6);Set1302(Curtime); else if(M
6、ONTH=0)/更改月份 while (MONTH=0); Get1302(Curtime);Curtime4=add4(Curtime4);Set1302(Curtime); else if(DAY=0)/更改号数 while (DAY=0); Get1302(Curtime);Curtime3=add3(Curtime3);Set1302(Curtime); else if(HOUR=0)/更改时 while (HOUR=0); Get1302(Curtime);Curtime2=add2(Curtime2);Set1302(Curtime); else if(MIN=0)/更改分 whi
7、le (MIN=0); Get1302(Curtime);Curtime1=add1(Curtime1);Set1302(Curtime); else if(SEC=0)/更改秒 while (SEC=0); Get1302(Curtime);Curtime0=0;Set1302(Curtime); if(CHAN=0)/是否有显示切换 n=n; while(CHAN=0) Get1302(Curtime); if(n=1) Display2(num); else Display1(num); P0=CODE1Curtime5-1; if(TICK=0) t=t; while(TICK=0)
8、if(CHAN=0) /是否有显示切换 n=n; while(CHAN=0) if(n=1) Display2(num); else Display1(num);头文件“DS1302#ifndef _DS1302_H_#define _DS1302_H_/*/#include <7219.h> void InputByte(unsigned char Da)/把数据Da写入DS1302 的IO口,先送低位unsigned char i; ACC=Da; for(i=8;i>0;i-)/开始传输8个字节的数据 IO=ACC0; /取最低位,注意DS1302的数据和地址都是从最低
9、位开始传输的 SCLK=1;/时钟线拉高,制造上升沿,SDA的数据被传输 SCLK=0;/时钟线拉低,为下一个上升沿做准备 ACC=ACC>>1; unsigned char OutputByte(void)/读出DS1302的数据并保存在Da中 unsigned char i; for(i=8;i>0;i-) ACC=ACC>>1; ACC7=IO; SCLK=1; SCLK=0; return(ACC); void Write1302(unsigned char Addr, unsigned char Da)/写入DS1302地址和数据RST=0; /初始CE
10、线置为0 SCLK=0; /初始时钟线置为0 RST=1; /初始CE置为1,传输开始 InputByte(Addr); /地址,命令 传输命令字,要写入的时间/日期地址 InputByte(Da); /*写1Byte数据 /写入要修改的时间/日期 SCLK =1;/时钟线拉高 RST=0;/读取结束,CE置为0,结束数据的传输unsigned char Read1302(unsigned char Addr)/根据存放器地址读出DS1302的相应数据unsigned char DD; RST=0;/初始CE线置为0 SCLK=0;/初始时钟线置为0 RST=1;/初始CE置为1,传输开始 I
11、nputByte(Addr); /地址,命令 传输命令字,要读取的时间/日历地址 DD=OutputByte(); /读1Byte数据读取要得到的时间/日期 SCLK=1; /时钟线拉高 RST =0; /读取结束,CE置为0,结束数据的传输 return(DD);/得到的时间/日期void Set1302(unsigned char *pSDa)/设置时间 unsigned char i; unsigned char Addr=0x80; Write1302(0x8e,0x00); /控制命令,WP=0,写操作 for(i =7;i>0;i-) Write1302(Addr,*pSDa
12、); /格式为:秒 分 时 日 月 星期 年 pSDa+; Addr+=2; Write1302(0x8e,0x80); /控制命令,WP=1,写保护void Get1302(unsigned char *pSDa) unsigned char i; unsigned char Addr=0x81; for(i=0;i<7;i+) *(pSDa+i)=Read1302(Addr);/格式为: 秒 分 时 日 月 星期 年 Addr+=2; #endif头文件“7219#ifndef _7219_H_#define _7219_H_/*/#define DECODE_MODE 0x09#d
13、efine INTESITY 0x0a#define SCAN_LIMIT 0x0b#define SHUT_DOWN 0x0c#define DEISPLAY_TEST 0x0funsigned char time=0x00,0x00,0x08,0x28,0x05,0x06,0x11;/初始值,秒分时日月星期年unsigned char Curtime7,num8;unsigned char CODE1=0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8;/星期,共阳极字段unsigned char CODE2=0x7e,0x30,0x6d,0x79,0x33,0x5b,0
14、x5f,0x70,0x7f,0x7b;sbit RST=P12;sbit IO =P11;sbit SCLK=P10;sbit DIN=P20;sbit LOAD=P21;sbit CLK=P22;sbit WEEK=P30;sbit YEAR=P31;sbit MONTH=P32;sbit DAY=P33;sbit HOUR=P34;sbit MIN=P35;sbit SEC=P36;sbit TICK=P37;sbit CHAN=P17;sbit ACC0=ACC0;sbit ACC7=ACC7;bit n=0;bitt=0;unsigned char w=0;void Write_721
15、9(unsigned char DATA)/MAX7219写数据函数unsigned char i;ACC=DATA; for(i=8;i>=1;i-) CLK=0; DIN=ACC7; ACC=ACC<<1; CLK=1; void Write7219(unsigned char addr,unsigned char dat)LOAD=0; Write_7219(addr); Write_7219(dat); LOAD=1; void Init7219(void) Write7219(DECODE_MODE,0x00);/译码存放器,写入00H,对0至7位均不译码 Writ
16、e7219(INTESITY,0x04);/亮度调节存放器,写入04H,实现一般的亮度显示 Write7219(SCAN_LIMIT,0x07);/扫描界限存放器,写入07H,实现0到7位数码管的显示 Write7219(SHUT_DOWN,0x01);/停机存放器,写入01H,实现正常工作 Write7219(DEISPLAY_TEST,0x00);/显示测试存放器,写入00H,实现正常工作void delay(unsigned char m)/延时程序unsigned char x,y; for(x=m;x>0;x-) for(y=255;y>0;y-);unsigned ch
17、ar add1(unsigned char DATA)/分、秒调整子程序unsigned char i,j; i=DATA&0x0f; j=DATA>>4; i+; if(i=0x0a) i=0x00;j+; if(j=0x06)&&(i=0x00) /超过59就变成0 i低位,j高位 i=0;j=0; DATA=(j<<4)+i; return(DATA);unsigned char add2(unsigned char DATA)/小时调整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+
18、; if(i=10) i=0;j+; if(j=2)&&(i=4)/超过23就变成0,i低位,j高位 i=0;j=0; DATA=(j<<4)+i; return(DATA);unsigned char add3(unsigned char DATA)/号数调整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+; if(i=10) i=0;j+;if(Curtime6/16*10+Curtime6%16)%4=0)&&(Curtime4=0x02)&&(j=0x03)&&a
19、mp;(i=0x00) i=1;j=0;Else if(Curtime6/16*10+Curtime6%16)%4!=0)&&(Curtime4=0x02)&&(j=0x02)&&(i=0x09) i=1;j=0; else if(Curtime4=0x01)|(Curtime4=0x03)|(Curtime4=0x05)|(Curtime4=0x07)|(Curtime4=0x08)|(Curtime4=0x10)|(Curtime4=0x12)&&(j=0x03)&&(i=0x02)i=1;j=0;else i
20、f(Curtime4=0x04)|(Curtime4=0x06)|(Curtime4=0x09)|(Curtime4=0x11)&&(j=0x03)&&(i=0x01) i=1;j=0; DATA=(j<<4)+i; return(DATA); unsigned char add4(unsigned char DATA)/月份调整子程序unsigned char i,j; i=DATA%16; j=DATA>>4; i+; if(i=0x0a) i=0;j+; if(j=0x01)&&(i=0x03)/超过12就变成0,i
21、低位,j高位 i=1;j=0; DATA=(j<<4)+i; return(DATA);unsigned char add5(unsigned char Data)/年份调整子程序unsigned char i,j; i=Data%16; j=Data/16; i+; if(i=0x0a) i=0;j+; if(j=0x0a)&&(i=0x00) i=0;j=0; Data=(j<<=4)+i; return(Data);void Display1(unsigned char *num)/显示时间unsigned char i,j,m=0x08; for(i=0;i<3;i+) *num=CODE2Curtimei&0x0f; Write7219(m,*num); j=Curtimei>>4; num+;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 售后客服个人工作总结范文模板大全【5篇】
- 人教版三年级数学下册全册导学案
- 仁爱英语九年级总复习教案
- 部编版2024-2025学年 语文六年级上册期末测试卷(含答案)
- 浙江语文高考6篇
- 全国运动员注册协议书范本(2篇)
- 2025年电力金具合作协议书
- 冷藏库租赁合同书
- 办公场所租房协议
- 广西汽车租赁合同范本汽车租赁合同范本
- 零工市场(驿站)运营管理 投标方案(技术方案)
- 植物病虫害防治技能大赛理论题及答案
- 2024年垃圾分类知识竞赛题库和答案
- 2024-2025学年六年级科学上册第二单元《地球的运动》测试卷(教科版)
- 【课件】城镇与乡村课件2024-2025学年人教版地理七年级上册
- 传感器与执行元件制造考核试卷
- 2024年高考英语概要写作高分范文全
- (正式版)SH∕T 3541-2024 石油化工泵组施工及验收规范
- 学校幼儿园食堂从业人员考试试题
- 2023年春外研版四年级英语下册全册完整课件
- 《现行制度下高新技术企业的税收筹划-以华为为例》
评论
0/150
提交评论