完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
源程序如下:
#include #include #define uchar unsigned char #define uint unsigned int uchar code table1[]={"20 - - MON"}; uchar code table2[]={" : : "}; uchar write_time[6]={13,7,17,11,10,0}; uchar write_com[6]={0x8c,0x88,0x86,0x84,0x82,0x80}; uchar i,miao,fen,shi,nian,yue,ri,text1=0; /*DS1302时钟芯片与单片机引脚连接定义*/ ***it SCLK=P3^6; ***it CE=P3^5; ***it IO=P3^4; /*1602LCD液晶显示屏与单片机引脚连接定义*/ ***it RS=P2^6; ***it RW=P2^5; ***it LCDE=P2^7; void lcd_mang() { RS=0; RW=1; LCDE=1; _nop_(); _nop_(); _nop_(); _nop_(); while(P0&0x80); LCDE=0; } /*延时函数*/ void delay(uchar z) { uchar x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } /*定时器初始化函数*/ void timer_init() { TMOD=0x01; TH0=(65536-1000)/256; TL0=(65536-1000)%256; EA=1; ET0=1; TR0=1; } /*1602LCD地址端定义*/ void write_1602com(uchar com) { lcd_mang(); RS=0; RW=0; LCDE=0; P0=com; delay(5); LCDE=1; delay(5); LCDE=0; } /*1602LCD数据端定义*/ void write_1602date(uchar date) { lcd_mang(); RS=1; RW=0; LCDE=0; P0=date; delay(5); LCDE=1; delay(5); LCDE=0; } /*1602LCD初始化*/ void LCD1602_init() { write_1602com(0x38); write_1602com(0x0c); write_1602com(0x06); write_1602com(0x01); write_1602com(0x80+1); for(i=0;i<14;i++) { write_1602date(table1); } write_1602com(0x80+0x40+4); for(i=0;i<8;i++) { write_1602date(table2); } } /*CPU给DS1302写一个字节*/ void write_1302byte(uchar date) { CE=1; for(i=0;i<8;i++) //循环8次写入数据 { SCLK=0; IO=date&0x01; //取低字节 date=date>>1; //每取一次右移一次 SCLK=1; } } /*CPU从DS1302读一个字节*/ uchar read_1302byte(uchar add) { uchar text1=0x00; CE=0; _nop_(); _nop_(); SCLK=0; _nop_(); _nop_(); CE=1; _nop_(); _nop_(); write_1302byte(add); for(i=0;i<8;i++) { if(IO) //关键点,判断IO口繁忙与否 text1=text1|0x80; SCLK=0; text1=text1>>1; _nop_(); _nop_(); _nop_(); SCLK=1; } return(text1); } /*写入DS1302,给出指定的地址与数据*/ void write_1302(uchar add,uchar date) { _nop_(); SCLK=0; _nop_(); CE=1; _nop_(); write_1302byte(add); write_1302byte(date); _nop_(); } /*BCD码转换十进制码*/ uchar BCD_Decimal(uchar bcd) { uchar decimal; decimal=bcd>>4; decimal=decimal*10+(bcd&0x0f); return(decimal); } /*DS1302初始化*/ void DS1302_init() { uchar j; CE=0; _nop_(); SCLK=0; _nop_(); for(i=0;i<6;i++) { j=write_time/10; write_time=write_time%10; write_time=j*16+write_time; } write_1302(0x8e,0x00); for(i=0;i<6;i++) { write_1302(write_com,write_time);//在执行一次该语句后,为何会跳出for循环????导致设置初始时钟时只能设置一个,求赐教 } write_1302(0x8e,0x80); } /*时分秒函数*/ void write_sfm(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_1602com(add); write_1602date(0x30+shi); write_1602date(0x30+ge); } /*年月日函数*/ void write_nyr(uchar add,uchar date) { uchar shi,ge; shi=date/10; ge=date%10; write_1602com(add); write_1602date(0x30+shi); write_1602date(0x30+ge); } void main() { LCD1602_init(); timer_init(); DS1302_init(); } void timer0() interrupt 1 { TH0=(65536-1000)/256; //1ms TL0=(65536-1000)%256; miao=BCD_Decimal(read_1302byte(0x81)); fen=BCD_Decimal(read_1302byte(0x83)); shi=BCD_Decimal(read_1302byte(0x85)); nian=BCD_Decimal(read_1302byte(0x8d)); yue=BCD_Decimal(read_1302byte(0x89)); ri=BCD_Decimal(read_1302byte(0x87)); write_sfm(0x80+0x40+10,miao); write_sfm(0x80+0x40+7,fen); write_sfm(0x80+0x40+4,shi); write_nyr(0x80+3,nian); write_nyr(0x80+6,yue); write_nyr(0x80+9,ri); } @摆渡手8023 @jianhong_wu @瓶水143 来自小组: 51单片机群 |
|
相关推荐 |
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
277 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
368 浏览 0 评论
766 浏览 2 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
592 浏览 0 评论
879 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12034 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 22:24 , Processed in 0.508473 second(s), Total 70, Slave 53 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号