完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/*qq_40270190 52 IAP 15w4k58s4单片机DS1302时钟芯片简单程序 分类: C语言基础8*/ #include #include #define uchar unsigned char #define uint unsigned int #define w_second 0x80 //秒写入地址 #define w_minute 0x82 //分写入地址 #define w_hour 0x84 //时写入地址 #define w_day 0x86 //日写入地址 #define w_month 0x88 //月写入地址 #define w_week 0x8a //星期写入地址 #define w_year 0x8c //年写入地址 #define r_second 0x81 //秒读出地址 #define r_minute 0x83 //分读出地址 #define r_hour 0x85 //时读出地址 #define r_day 0x87 //日读出地址 #define r_month 0x89 //月读出地址 #define r_week 0x8b //星期读出地址 #define r_year 0x8d //年读出地址 #define w_wp 0x8e //指令写允许端地址 /*//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 */ data_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; uchar hour,min,sec,day,mon,year,n,m; ***it nian=P2^5; ***it yue=P2^4; ***it tian=P2^3; ***it shi=P2^2; ***it fen=P2^1; ***it miao=P2^0; ***it rst=P3^2; //xianshi yong P1, kongzhi P0, ***it sck=P3^4; ***it io=P3^3; ***it change=P2^6; //shifenmiao he nianyueri qiehaun xianshi ***it led1=P3^5; ***it led2=P3^7; ***it led3=P2^7; //sfr P0=0x80; sfr P0M1=0x93; sfr P0M0=0x94; //sfr P1=0x90; sfr P1M1=0x91; sfr P1M0=0x92; //sfr P2=0xA0; sfr P2M1=0x95; sfr P2M0=0x96; //sfr P3=0xB0; sfr P3M1=0xB1; sfr P3M0=0xB2; //***it 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(); void port_mode() // 端口模式 { P0M1=0x00; P0M0=0x00;P1M1=0x00; P1M0=0x00;P2M1=0x00; P2M0=0x00;P3M1=0x00; P3M0=0x00; } /*DS1302单字节写入:*/ void write_ds1302_byte(uchar dat) { uchar i; //发送地址 for(i=0;i<8;i++) //循环8次移位 { sck=0; io=(bit)(dat&0x01); //每次传输低字节 dat=dat>>1; //右移一位 sck=1; } } /*DS1302多字节写入:*/ void write_ds1302(uchar add,uchar dat) { rst=0;//CE引脚为低,数据传送中止 _nop_(); sck=0; //清零时钟总线 _nop_(); rst=1; //CE引脚为高,逻辑控制有效 _nop_(); write_ds1302_byte(add); write_ds1302_byte(dat); rst=0; _nop_(); io=1; sck=1; } /*DS1302读取:*/ uchar read_ds1302(uchar add) { uchar i,value; rst=0; _nop_(); sck=0; _nop_(); rst=1; _nop_(); write_ds1302_byte(add); for (i=0;i<8;i++) //循环8次读8次IO引脚变化,8次右移得value值 { value=value>>1; sck=0; //sclk下降沿之后读数据即IO引脚的高低电平 if (io) value=value|0x80; //IO为1,value最高位得1 //每次传输低字节 sck=1; //sck为高,为下一次下降沿做准备 } rst=0; _nop_(); sck=0; _nop_(); sck=1; io=1; return value; } /*调整时间:*/ void set_rtc() { write_ds1302(w_wp,0x00); //wp=0允许写入 if (nian==0) delay(100); if (nian==0) { year=(year>>4)*10+(year&0x0f); //ds3201 以BCD码存储 year++; if (year==99) year=0; year=((year/10)<<4)+(year%10); write_ds1302(0x8c,year); } if (yue==0) delay(100); if (yue==0) { mon=(mon>>4)*10+(mon&0x0f); //ds3201 以BCD码存储 mon++; if (mon==12) mon=0; mon=((mon/10)<<4)+(mon%10); write_ds1302(0x88,mon); } if (tian==0) delay(100); if (tian==0) { day=(day>>4)*10+(day&0x0f); //ds3201 以BCD码存储 day++; if (day==30) day=0; day=((day/10)<<4)+(day%10); write_ds1302(0x86,day); } if (shi==0) delay(100); if (shi==0) { hour=(hour>>4)*10+(hour&0x0f); //ds3201 以BCD码存储 hour++; if (hour==24) hour=0; hour=((hour/10)<<4)+(hour%10); write_ds1302(0x84,hour); } if (fen==0) delay(100); if (fen==0) { min=(min>>4)*10+(min&0x0f); min++; if (min==60) min=0; min=((min/10)<<4)+(min%10); write_ds1302(0x82,min); } if (miao==0) delay(100); if (miao==0) { sec=(sec>>4)*10+(sec&0x0f); sec++; if (sec==60) sec=0; sec=((sec/10)<<4)+(sec%10); write_ds1302(0x80,sec); } write_ds1302(w_wp,0x80); } /*读取时间:*/ void read_rtc() { year=read_ds1302(0x8d); mon=read_ds1302(0x89); day=read_ds1302(0x87); hour=read_ds1302(0x85); min=read_ds1302(0x83); sec=read_ds1302(0x81); } /*显示时间:*/ void display() { unsigned int a=1; if(change==1) { P0=0xdf;P1=data_7seg[hour/16]; delay(a); P0=0xef;P1=data_7seg[hour%16]; delay(a); P0=0xf7;P1=data_7seg[min/16]; delay(a); P0=0xfb;P1=data_7seg[min%16]; delay(a); P0=0xfd;P1=data_7seg[sec/16]; delay(a); P0=0xfe;P1=data_7seg[sec%16]; delay(a); } else { P0=0xdf;P1=data_7seg[year/16]; delay(a); P0=0xef;P1=data_7seg[year%16]; delay(a); P0=0xf7;P1=data_7seg[mon/16]; delay(a); P0=0xfb;P1=data_7seg[mon%16]; delay(a); P0=0xfd;P1=data_7seg[day/16]; delay(a); P0=0xfe;P1=data_7seg[day%16]; delay(a); } } void putout() { // n=(sec/16)*10+(sec%16); // m=(mon/16)*10+(mon%16); n=(sec>>4)*10+(sec&0x0f); if(n>=30) {led1=0;led2=0;led3=0;} else if(n<20) {led1=0;led2=0;led3=1;} else {led1=1;led2=1;led3=1;} } /* if { if(22>a>=18) {led1=0;led2=0;led3=0;} else if((24>a>=22)|(a<1)) {led1=0;led2=0;led3=1;} else if(4>a>=1) {led1=0;led2=1;led3=1;} else if(6>a>=4) {led1=0;led2=0;led3=1;} else {led1=1;led2=1;led3=1;} } } */ /*蜂鸣: void fmzz() { uint i; for (i=0;i<100;i++) { fm=!fm; delay(2); } } */ /*延时程序:*/ void delay(int n) { unsigned int i,j; for(i=0;i for(j=0;j<121;j++) {;} } } /*主程序:*/ void main() { port_mode(); // write_ds1302(0x84,0x12); //初始化 // write_ds1302(0x82,0x00); // write_ds1302(0x80,0x00); //秒寄存器(81h、80h)的位7 当该位置为0时,时钟开始运行。 while (1) { read_rtc(); set_rtc(); display(); putout(); /* delay(10); a=sec/16; //sec=(sec>>4)*10+(sec&0x0f); b=(a*10)+(sec%16); sec=(sec>>4)*10+(sec&0x0f); delay(10); if(10 delay(10); */ } /* if(min==0) { if(sec==0) { fmzz(); } } */ } |
|
相关推荐
|
|
《DNK210使用指南 -CanMV版 V1.0》第八章 CanMV IDE初体验
1589 浏览 0 评论
过采样提高12位ADC精度在STM32主控上的实现(附电路及代码)
1091 浏览 1 评论
飞凌嵌入式-ELFBOARD 解决PCB布线时无法捕捉到焊盘中心的问题
1072 浏览 0 评论
Openharmony软件评估指南-米尔瑞芯微RK3568开发板
1869 浏览 0 评论
STM32CUBEMX(7)--移植雅特力AT32F403AVGT(兼容STM32F103VGT6),DAC输出电压
1355 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11175 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-20 09:46 , Processed in 0.385358 second(s), Total 34, Slave 28 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号