时间控制模块—DS1302芯片的控制编程

合集下载

ds1302时钟程序详解经典

ds1302时钟程序详解经典

dsl302时钟程序详解经典dsl302时钟程序详解DS1302的控制字如图2所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始2.3数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7o2.4 DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

» I日历•別间襦存祁及凡担制孑fir* 野擅"itwtr 収他总cn -T»fsy网移e S』32 1 0林斶son8!ll00-59 f.H IUSVX SIX X2H S3II oum(1Mh、MH K4H851101 \2A12 24« 10 IIH HKMhH M7II01 -2S.2V,W-Jl »o imiAre8SH WII03 - !2(11) 0 IUM MOYI1IAAII8HH ni(i II » 0 0h\V8LH Mill OQ • 9910YLAH此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为COH, FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

可用按键修改时间的DS1302时钟显示程序

可用按键修改时间的DS1302时钟显示程序
for(num=0;num<16;num++)//功能与上同,用于将" : : : "写入
write_data(table1[num]);
}
/**************************显示欢迎界面函数*************************************/
void displaystar(void)
delay(500);大约延时500ms
**************************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delay20ms(void) //3*i*j+2*i=3*100*60+2*100=20000μs=20ms;
{
uchar i;
write_com(0x80);
for(i=0;i<16;i++)
write_data(table2[i]);
write_com(0x80+0x40);
for(i=0;i<16;i++)
write_data(table3[i]);
}
/***************************显示时间、日期子函数*********************************/
if(s1num!=0&&s4num==0)//按键1按下*次且s4再次之前未曾按过(按键按下时,时间修改函数)

DS1302实时时钟模块,1602显示

DS1302实时时钟模块,1602显示

/******************* 说明:**************************将实时时钟数据通过LCD1602 显示基于51 单片机**************************************************/#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int uchar dis_time_buf[16]={0};//LCD1602 引脚定义// 采用8 位并行方式,DB0~DB7 连接至LCDDATA0~LCDDATA7sbit RS=P2A0;sbit RW=P2A1;sbit CS=P2A2;#define LCDDATA P0//DS1302 引脚定义sbit RST=P1A3;sbit IO=P1A2;sbit SCK=P1A1;//DS1302 地址定义#define ds1302_sec_add 0x80 // 秒数据地址#define ds1302_min_add 0x82 // 分数据地址#define ds1302_hr_add 0x84 // 时数据地址#define ds1302_date_add 0x86 // 日数据地址#define ds1302_month_add 0x88 // 月数据地址#define ds1302_day_add 0x8a // 星期数据地址#define ds1302_year_add 0x8c // 年数据地址#define ds1302_control_add 0x8e // 控制数据地址#define ds1302_charger_add 0x90#define ds1302_clkburst_add 0xbe// 初始时间定义uchar time_buf[8] = {0x20,0x10,0x06,0x01,0x23,0x59,0x55,0x02};// 初始时间2010年6月1号23 点59 分55 秒星期二// 功能:延时 1 毫秒// 入口参数:x// 出口参数:无//说明:当晶振为12M时,j<112 ;当晶振为11.0592M时,j<122void Delay_xms(uint x){uint i,j;for(i=0;i<x;i++)for(j=0;j<112;j++);// 功能:12us 延时//STC89C52为1T单片机,即1个时钟/机器周期,速度为AT89C52的12倍void Delay_xus(uint t){for(;t>0;t--){_nop_();}}//控制LCD写时序void LCD_en_write(void){CS=1;Delay_xus(20);CS=0;Delay_xus(20);}// 写指令函数void Write_Instruction(uchar command){RS=0;RW=0;CS=1;LCDDATA=command;LCD_en_write();// 写入指令数据}// 写数据函数void Write_Data(uchar Wdata){RS=1;RW=0;CS=1;LCDDATA=Wdata;LCD_en_write();// 写入数据}// 字符显示初始地址设置void LCD_SET_XY(uchar X,uchar Y){uchar address;if(Y==0) address=0x80+X;//Y=0, 表示在第一行显示,地址基数为0x80elseaddress=0xc0+X;//Y 非 0 时,表时在第二行显示,地址基数为 0xC0 Write_Instruction(address);// 写指令,设置显示初始地址}//在第X 行Y 列开始显示 Wdata 所对应的单个字符 void LCD_write_char(uchar X,uchar Y,uchar Wdata){LCD_SET_XY(X,Y)写 地址Write_Data(Wdata);// 写入当前字符并显示}// 清屏函数 void LCD_clear(void){Write_Instruction(0x01); Delay_xms(5);}// 显示屏初始化函数 void LCD_init(void){Write_Instruction(0x38); // 8bit interface,2line,5*7dotsDelay_xms(5);Write_Instruction(0x38); Delay_xms(5);Write_Instruction(0x38);Write_Instruction(0x08); //关显示,不显光标,光标不闪烁 Write_Instruction(0x01); //清屏 Delay_xms(5);//Write_Instruction(0x05); //Write_Instruction(0x06);//Write_Instruction(0x07);Delay_xms(5); // 写一字符,整屏右移 // 写一字符,整屏显示不移动// 写一字符,整屏左移//Write_Instruction(0x0B); Write_Instruction(0x0C);//Write_Instruction(0x0D); //Write_Instruction(0x0E); //Write_Instruction(0x0F); } //DS1302 初始化函数 void ds1302_init(void){Write_Instruction(0x04); // 写一字符,整屏显示不移动 // 关闭显示(不显示字符,只有背光亮) // 开显示,光标、闪烁都关闭// 开显示,不显示光标,但光标闪烁 // 开显示,显示光标,但光标不闪烁}//向DS1302写入一字节数据void ds1302_write_byte(uchar addr, uchar d){uchar i; RST=1;// 启动 DS1302 总线// 写入目标地址: addraddr = addr & 0xFE; // 最低位置零,寄存器 0 位为 0 时写,为 1 时读 for (i = 0; i < 8; i ++) {if (addr & 0x01) {IO=1;}else {IO=0;}SCK=1; //产生时钟 SCK=0;addr = addr >> 1;}// 写入数据: dfor (i = 0; i < 8; i ++) {if (d & 0x01) {IO=1;}else {IO=0;}SCK=1; // 产生时钟 SCK=0; d = d >> 1;}RST=O;〃停止 DS1302 总线}//从DS1302读出一字节数据uchar ds1302_read_byte(uchar addr) {uchar i,temp; RST=1;// 启动 DS1302 总线// 写入目标地址: addr addr = addr | 0x01;// 最低位置高,寄存器 0 位为 0 时写,为 1 时读for (i = 0; i < 8; i ++) {RST=0; SCK=0;//RST 脚置低 //SCK 脚置低if (addr & 0x01) { IO=1;}else { IO=0;}SCK=1;SCK=0;addr = addr >> 1;}// 输出数据:tempfor (i = 0; i < 8; i ++) { temp = temp >> 1; if (IO) {temp |= 0x80;}else {temp &= 0x7F; }SCK=1;SCK=0;}RST=0;//停止DS1302 总线return temp;}//向DS302写入时钟数据void ds1302_write_time(void) {ds1302_write_byte(ds1302_control_add,0x00); // 关闭写保护ds1302_write_byte(ds1302_sec_add,0x80); // 暂停时钟//ds1302_write_byte(ds1302_charger_add,0xa9); // 涓流充电ds1302_write_byte(ds1302_year_add,time_buf[1]); // 年ds1302_write_byte(ds1302_month_add,time_buf[2]); //月ds1302_write_byte(ds1302_date_add,time_buf[3]); // 日ds1302_write_byte(ds1302_hr_add,time_buf[4]); // 时ds1302_write_byte(ds1302_min_add,time_buf[5]); // 分ds1302_write_byte(ds1302_sec_add,time_buf[6]); // 秒ds1302_write_byte(ds1302_day_add,time_buf[7]); // 周ds1302_write_byte(ds1302_control_add,0x80); //打开写保护}//从DS302读出时钟数据void ds1302_read_time(void){time_buf[1]=ds1302_read_byte(ds1302_year_add); // 年time_buf[2]=ds1302_read_byte(ds1302_month_add); // 月time_buf[3]=ds1302_read_byte(ds1302_date_add); // 日time_buf[4]=ds1302_read_byte(ds1302_hr_add); // 时time_buf[5]=ds1302_read_byte(ds1302_min_add); // 分time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;// 秒,屏蔽秒的第7 位,避免超出59time_buf[7]=ds1302_read_byte(ds1302_day_add); // 周}void Display(void){LCD_write_char(3,0,dis_time_buf[0]+'0');LCD_write_char(4,0,dis_time_buf[1]+'0');LCD_write_char(5,0,dis_time_buf[2]+'0');LCD_write_char(6,0,dis_time_buf[3]+'0');LCD_write_char(7,0,'/');LCD_write_char(8,0,dis_time_buf[4]+'0');LCD_write_char(9,0,dis_time_buf[5]+'0');LCD_write_char(10,0,'/');LCD_write_char(11,0,dis_time_buf[6]+'0');LCD_write_char(12,0,dis_time_buf[7]+'0');LCD_write_char(15,0,dis_time_buf[14]+'0'); // 第 2 行显示LCD_write_char(3,1,dis_time_buf[8]+'0');LCD_write_char(4,1,dis_time_buf[9]+'0');LCD_write_char(5,1,':');LCD_write_char(6,1,dis_time_buf[10]+'0');LCD_write_char(7,1,dis_time_buf[11]+'0');LCD_write_char(8,1,':');LCD_write_char(9,1,dis_time_buf[12]+'0');LCD_write_char(10,1,dis_time_buf[13]+'0');}// 定时器中断函数void Timer2() interrupt 5// 定时器 2 是 5 号中断{static uchar t;TF2=0;t++;if(t==4) // 间隔200ms(50ms*4) 读取一次时间{t=0;ds1302_read_time(); // 读取时间dis_time_buf[0]=(time_buf[0]>>4); // 年dis_time_buf[1]=(time_buf[0]&0x0f);dis_time_buf[2]=(time_buf[1]>>4);dis_time_buf[3]=(time_buf[1]&0x0f);dis_time_buf[4]=(time_buf[2]>>4); // 月dis_time_buf[5]=(time_buf[2]&0x0f);dis_time_buf[6]=(time_buf[3]>>4); // 日dis_time_buf[7]=(time_buf[3]&0x0f);dis_time_buf[14]=(time_buf[7]&0x07); // 星期// 第 2 行显示dis_time_buf[8]=(time_buf[4]>>4); // 时dis_time_buf[9]=(time_buf[4]&0x0f);dis_time_buf[10]=(time_buf[5]>>4); // 分dis_time_buf[11]=(time_buf[5]&0x0f);dis_time_buf[12]=(time_buf[6]>>4); // 秒dis_time_buf[13]=(time_buf[6]&0x0f);}}// 定时器 2 初始化void Init_timer2(void){RCAP2H=0x3c;〃赋T2初始值0x3cb0,溢出20次为1秒,每次溢出时间为50ms RCAP2L=0xb0;TR2=1; //启动定时器 2ET2=1; // 打开定时器 2 中断EA=1; // 打开总中断}// 主函数void main(void){Delay_xms(50);// 等待系统稳定LCD_init(); //LCD 初始化LCD_clear(); // 清屏ds1302_init(); //DS1302 初始化Delay_xms(10);ds1302_write_time(); // 写入初始值Init_timer2(); // 定时器 2 初始化while(1){Display();}。

DS1302原理及程序说明

DS1302原理及程序说明

DS1302原理及程序说明DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态RAM ,通过简单的串行接口与单片机进行通信。

实时时钟/日历电路提供秒、分、时、日、日期、月、年的信息,每月的天数和闰年的天数可自动调整,时钟操作可通过AM/PM 指示决定采用24 或12 小时格式。

DS1302 与单片机之间能简单地采用同步串行的方式进行,DS1302的引脚命名如图1-1所示。

通信仅需用到三根信号线:(1)CE 片选,(2)I/O 数据线,(3)SCLK 串行时钟,DS1302与CPU 的连接如图1-2所示。

时钟/RAM 的读/写数据以一个字节或多字节的字符组方式通信,DS1302工作时功耗很低,保持数据和时钟信息时功率小于1mW 。

DS1302具有双电源管脚,用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器,它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域。

DS1302主要的性能指标如下:实时时钟具有能计算2100 年之前的秒、分、时、日、日期、星期、月、年的能力,还有闰年调整的能力31× 8 位暂存数据存储RAM 串行I/O 口方式,使得管脚数量最少宽范围工作电压2.0~ 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式:单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V 。

DS1302的读写模式工作时序如图1-3和图1-4所示。

图1-3 单字节读模式图1-4 单字节写模式注:在多字节模式下,SCLK 发出同步脉冲,CS 须持续保持高电平直到多字节操作结束,图1-1 DS1302引脚图1-2 DS1302与CPU 接口DS1302内部寄存器的地址定义如表1-1所示。

表1-1 寄存器的地址及定义实验说明1. DS1302与51单片机的连接IO ——P2.7:串行数据输入/输出引脚SCLK ——P2.6:串行时钟引脚CE ——P2.4:片选CE2. LCD 与单片机连接;************************************************************************* ; LCD Module LMB1602 与单片机连接:;************************************************************************* ; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ;Vss Vdd V o RS R/W E D0 D1 D2 D3 D4 D5 D6 D7 BLA BLK ; 0V +5V 0V P32 P33 P34 ---------------- P1[0..7] ---------------- +5V 0V;*************************************************************************3. LCD 显示功能说明LCD1602显示格式如图1-5所示。

ds1302时钟芯片工作原理

ds1302时钟芯片工作原理

ds1302时钟芯片工作原理DS1302时钟芯片是一种常用的DIY实用型芯片,主要应用于存储时间和日期信息,它主要包括时间端口、RTC控制程序和RTC配置存储器。

它是一款基于CMOS技术的钟表芯片,它具有极低功耗、更快速的实时时钟,可以支持多种实时时钟功能。

DS1302时钟芯片的工作原理是:第一步,通过时间端口,分别将时间和日期的信息放入RTC的存储器;第二步,RTC控制程序将时钟日期的信息,自动加1累加;第三步,RTC芯片输出实时有效的时间日期信息。

总的来说,DS1302时钟芯片使用简单,操作灵活,它可以设定各种常见的时间格式,数字形式显示24小时制时间、12小时制时间和星期,易于操作和读取,在DIY领域有着广泛的应用。

它有一个特性:它支持Real-time秒读取和转换,RTC为精确的实时计时。

,可以满足大多数系统的需求,更可以连接到外部的按钮或者传感器,实现RTC 功能的灵活扩展。

DS1302时钟芯片从原理上看,可以很好的保持系统的准确时间,同时它可以满足实时计算、定时操作,可以实现自动计算、自动节能和不同时间控制功能,是DIY领域的低成本解决方案,使得DIY领域的应用更加强大。

基于ds1302的数字时钟两个按键控制

基于ds1302的数字时钟两个按键控制

基于ds1302的数字时钟两个按键控制调整显示年月日时间以及定时,仿真图和程序如下,仅供参考。

K1是方式调整键,不按是0方式调秒,有10种方式,自己试吧,右下角显示的是第几种方式。

K2是调整键,K3没用到。

#include <reg52.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//uchar data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};uchar hour,min,sec,nian=1,yue=1,zhou=1,ri=1,x,m,n;sbit k1=P3^4;sbit k2=P3^5;//sbit miao=P3^6;sbit rst=P1^2;sbit sck=P1^1;sbit io=P1^0;sbit fm=P1^7;/*函数声明:*/void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);void read_rtc();void set_rtc();void display();void delay(int n);void show();void fmzz();/******************************************************************************************************************************************************/sbit E=P2^2; //1602使能引脚sbit RW=P2^1; //1602读写引脚sbit RS=P2^0; //1602数据/命令选择引脚/********************************************************************* 名称 : Delay_1ms()* 功能 : 延时子程序,延时时间为 1ms * x* 输入 : x (延时一毫秒的个数)* 输出 : 无***********************************************************************/ void Delay_1ms(uint i)//1ms延时{uchar x,j;for(j=0;j<i;j++)for(x=0;x<=148;x++);}/********************************************************************* 名称 : delay()* 功能 : 延时,延时时间大概为5US。

ds1302时钟程序详解,ds1302程序流程图

ds1302时钟程序详解,ds1302程序流程图

ds1302时钟程序详解,ds1302程序流程图(C程序)ds1302时钟程序详解DS1302 的控制字如图2所示。

控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。

同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。

DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见表1。

此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。

DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

ds1302程序流程图DS1302实时时间流程图4示出DS1302的实时时间流程。

根据此流程框图,不难采集实时时间。

下面结合流程图对DS1302的基本操作进行编程:根据本人在调试中遇到的问题,特作如下说明:DS1302 与微处理器进行数据交换时,首先由微处理器向电路发送命令字节,命令字节最高位MSB(D7)必须为逻辑1,如果D7=0,则禁止写DS1302,即写保护;D6=0,指定时钟数据,D6=1,指定RAM数据;D5~D1指定输入或输出的特定寄存器;最低位L SB(D0)为逻辑0,指定写操作(输入), D0=1,指定读操作(输出)。

ds1302实时时钟程序说明

ds1302实时时钟程序说明
下面是DS1302内部寄存器的地址的说明。
DS1302实时时钟在数码管上进行实时显示的程序
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit rst=P2^4;
sbit io=P2^0;
}
write_ds1302(0x8e,0x80); //进行写保护
}
void read_rtc()
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()
{
disp[0]=time_data[6]%16;//将BCD码(这里与十六进制没有区别)进行十位个位的分离
{
j=time_data[i]/10;//十位5
time_data[i]%=10;//各位8
time_data[i]=time_data[i]+j*16;
}
write_ds1302(0x8e,0x00);//去除写保护
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
disp[1]=time_data[6]/16;
disp[2]=17;
disp[3]=time_data[5]%16;
disp[4]=time_data[5]/16;
disp[5]=17;
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

定时器/计数器1-TCNT1H和TCNT1L
TCNT1H和TCNT1L组成了T/C的数据寄存器TCNT1。
定时器/计数器中断标志寄存器-TIFR
T/C1输 入捕捉 标志位
T/C1输 出比较B 匹配标 志位 T/C1溢出标志 (普通模式和 CTC模式时)
如何写表 达式判断 是否有溢 出 实验板上的主控芯片AVR ATMega128:
有四个定时器/计数器 – 两个具有独立预分频器、比较器功能、PWM输出的 8位定时器/计数器(T/C0, T/C2 ) – 两个具有预分频器、比较器功能、 PWM输出、捕 捉功能的16位定时器/计数器(T/C1, T/C3 )
本堂课主要讨论 定时器/计数器1
4.中断服务函数
//外部中断函数
SIGNAL(SIG_INTERRUPT5) {

}
second=0;//中断发生后需做的事情
三、DS1302模块 1.简单介绍
时钟计数功能,年计数可达2100。
DS1302包括时钟/日历寄存器和31字节的
数据暂存寄存器。
2.如何将年月日写入DS1302中
模块电路功能编程(下)
时间控制模块—DS1302芯片的控制编程
双C工作室
复习
1.实验板的电路图 – 控制编程--针对实验板 – 所有的元器件控制--要查看电路图--确定要 它们是由哪些端口或哪些接口来控制
2.实验板上控制数码管 – 用SPI发送数据到74HC595上,PB端口的高 四位作为数码管选通通道
RST_SET; /*启动DS1302总线*/ /*写入目标地址:addr*/ IO_OUT; addr = addr & 0xFE;/*最低位置零*/ for (i = 0; i < 8; i ++) { if (addr & 0x01) IO_SET; else IO_CLR; SCK_SET; SCK_CLR; addr = addr >> 1; }
(3)如何将年月日写入DS1302
void ds1302_write_time(void) { ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护 ds1302_write_byte(ds1302_sec_add,0x80); //暂停 ds1302_write_byte(ds1302_year_add,time_buf[1]);//年 ds1302_write_byte(ds1302_month_add,time_buf[2]);//月 ds1302_write_byte(ds1302_date_add,time_buf[3]);//日 ds1302_write_byte(ds1302_day_add,time_buf[7]);//周 ds1302_write_byte(ds1302_hr_add,time_buf[4]);//时 ds1302_write_byte(ds1302_min_add,time_buf[5]);//分 ds1302_write_byte(ds1302_sec_add,time_buf[6]);//秒 ds1302_write_byte(ds1302_day_add,time_buf[7]);//周 ds1302_write_byte(ds1302_control_add,0x80);//打开写保护 }
/*写入数据:d*/ IO_OUT; for (i = 0; i < 8; i ++) { if (d & 0x01) IO_SET; else IO_CLR; SCK_SET; SCK_CLR; d = d >> 1; } RST_CLR;/*停止DS1302总线*/
(3)设置定时器的模式;
TCCR1A=0X00; //与TCCR1B的WGM3:0=0确定定时器为普通模式
void TIMER1_Init() { TCCR1B=(1<<CS12)|(1<<CS10); //选择定时器时钟分频CS12:11,1024分频。 TCNT1H=(65536-977)/256; TCNT1L=(65536-977)%256; TCCR1A=0X00; //与TCCR1B的WGM3:0=0确定定时器为普通模式 }
(1)如何将数据写入DS1302(地址)
#define IO_OUT #define SCK_SET #define RST_SET

DDRD |= (1 << PD6) PORTD |= (1 << PD5) PORTD |= (1 << PD7)
ds1302_write_byte(ds1302_sec_add,time_buf[6]);//秒 ds1302_write_byte(ds1302_day_add,time_buf[7]);//周 ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
定时器如何控制实现1s。
– 3.在软件中编码、调试; – 4.下载到实验板中观察现象。
电路连接
SPI总线 74HC595
数码管动态显示 (1)选通通道; (2)发送显示数据,并延时(几毫秒); (3)关闭通道; (4)消影。
参考代码:
…… PORTB &=~(1<<PB4); SPI_SN74595_7SegLed(disp[ones]); _delay_ms(6); PORTB |=(1<<PB4); SPI_SN74595_7SegLed(0XFF);//硬件中,消影效果比较好 ……
案例3:实验板实现秒表,并控制按键对秒 表清零
任务分析: – 1. 控制实验板上的数码管显示; 电路连接如何?使用的是I/O的哪个端口? 涉及到哪里其他控制模块?数码管显示时需要注 意哪些地方? – 2. 精确实现1s; 定时器如何控制实现1s。 – 3. 控制按键实现外部中断;
按键的电路连接?使用的I/O端口?如何获取按键消息?
(1)如何将数据写入DS1302;
(2)如何将秒值写入DS1302; (3)如何写入出年月日;
(1)如何将数据写入DS1302;
DS1302写时序
DS1302工作时为了对任何数据传送进行初始化,需要
将复位脚(RST)置为高电平且将8位地址和命令信息 装入移位寄存器。 数据在时钟(SCLK)的上升沿串行输入,前8位指定 访问地址,命令字装入移位寄存器后,在之后的时钟 周期,读操作时输出数据,写操作时输出数据。
(定时器模块、数码管显示模块、SPI模块)
三、案例3:实验板实现秒表,并控制按键对
秒表清零。(中断系统模块、定时器模块、数码管显示模块、
SPI模块)
四、案例4:读取时钟芯片DS1302的秒钟信息
显示在实验板的数码管上。(DS1302模块、数码管显
示模块)
案例1:控制控制LED发光二极管闪烁, 亮灭时间间隔为1s。
4.查询法判断定时时间是否到达
不断查询TIFR的TOV1位是否为1。 参考代码:
定时时间到时,即产生溢 …… 出时,TOV1被置为“1”。 while(!(TIFR&(1<<TOV1))) { } //添加代码:时间到达后所需做的事件 TCNT1H=(65536-977)/256; TCNT1L=(65536-977)%256; TIFR |=(1<<TOV1);//TOV1 Flag 强制清零。 //写1,自动清零。 …… 一定要注意:写1才会将 溢出标志位TOV1清零。
任务分析: – 1. 控制实验板上的发光二极管亮灭; 电路连接如何?使用的是I/O的哪个端口? – 2. 精确实现1s;
定时器如何控制实现1s。
– 3.在软件中编码、调试; – 4.下载到实验板中观察现象。
案例2:控制实验板的数码管实现秒表
任务分析: – 1. 控制实验板上的数码管显示; 电路连接如何?使用的是I/O的哪个端口? 涉及到哪里其他控制模块?数码管显示时需要 注意哪些地方? – 2. 精确实现1s;
二、中断模块
1. 实验板上的主控芯片AVR ATMega128:
有8个外部中断
INT0~INT7
2.与本案例外部中断有关的寄存器
状态寄存器SREG
全局中 断使能
外部中断控制寄存器B(EICRB)
外部中断5敏感 电平控制位
外部中断屏蔽寄存器(EIMSK)
外部中断请求5使 能(置“1”)
TIFR&(1<<TOV1)
3.定时器精确定时初始化流程
(1)确定定时器时钟分频;
TCCR1B=(1<<CS12)|(1<<CS10);
//选择定时器时钟分频CS12:11,1024分频。
(2)定时器初值赋值;
初值计算公式:
赋值:
TCNT1H=(65536-977)/256; TCNT1L=(65536-977)%256;
(2)如何将秒值写入DS1302;
DS1302寄存器与控制命令
为0时 为写 入
(2)如何将秒值写入DS1302
void ds1302_write_time(void)
{ ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80);//暂停
3. SPI的控制流程
4. 怎么通过阅读74HC595的芯片资料,
来使用它!!!
模块三:数字传感器使用编程 part C 定时器模块、DS1302模块
相关文档
最新文档