完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本帖最后由 俺土老冒 于 2021-9-24 19:29 编辑
电路的结构是采用了STC12C5A60S2,P4.0、P4.1、P4.3分别连接MAX7221的CS、DIN、CLK,P3.4~P3.6分别连接DS1302的DSIO、RST、SCLK。MAX7221只使用了4位,为了测试,分别显示了分十位和个位,秒十位和个位。DS1302的驱动部分程序如下: /******************************************************************************* * 函 数 名 : Ds1302Write * 函数功能 : 向DS1302命令(地址+数据) * 输 入 : addr,dat * 输 出 : 无 *******************************************************************************/ void Ds1302Write(uchar addr, uchar dat) { uchar n; RST = 0; _nop_(); SCLK = 0;//先将SCLK置低电平。 _nop_(); RST = 1; //然后将RST(CE)置高电平。 _nop_(); for (n=0; n<8; n++)//开始传送八位地址命令 { addr >>=1; //数据从低位开始传送 DSIO = CY; //数据在上升沿时,DS1302读取数据 SCLK = 1; delay(1); SCLK = 0; delay(1); ; } for (n=0; n<8; n++) //写入8位数据 { dat >>=1; DSIO = CY; SCLK = 1; //数据在上升沿时,DS1302读取数据 delay(1); SCLK = 0; _nop_(); _nop_(); } RST = 0;//传送数据结束 delay(1); } /******************************************************************************* * 函 数 名 : Ds1302Read * 函数功能 : 读取一个地址的数据 * 输 入 : addr * 输 出 : dat *******************************************************************************/ uchar Ds1302Read(uchar addr) { uchar n,dat,dat1; RST = 0; _nop_(); _nop_(); SCLK = 0;//先将SCLK置低电平。 _nop_(); _nop_(); RST = 1;//然后将RST(CE)置高电平。 delay(2); for(n=0; n<8; n++)//开始传送八位地址命令 { addr >>=1; //数据从低位开始传送 DSIO = CY; _nop_(); _nop_(); _nop_(); SCLK = 1; //数据在上升沿时,DS1302读取数据 delay(7); SCLK = 0; //DS1302下降沿时,放置数据 delay(7); } _nop_(); for(n=0; n<8; n++)//读取8位数据 { dat1 = DSIO;//从最低位开始接收 dat = (dat>>1) | (dat1<<7); SCLK = 1; delay(7); SCLK = 0;//DS1302下降沿时,放置数据 delay(7); } RST = 0; delay(50); //以下为DS1302复位的稳定时间,必须的。 SCLK = 1; delay(50); DSIO = 0; delay(50); DSIO = 1; delay(50); return dat; } /******************************************************************************* * 函 数 名 : Ds1302Init * 函数功能 : 初始化DS1302. * 写起始地址 : 0x80 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds1302Init() { uchar n; uchar addr = 0x80; Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能 for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年 { Ds1302Write(2*n+addr,time_data[n]); } Ds1302Write(0x8E,0x80); //打开写保护功能 } /******************************************************************************* * 函 数 名 : Ds1302ReadTime * 函数功能 : 读取时钟信息 * 读起始地址 : 0x81 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void Ds1302ReadTime() { uchar n; uchar addr = 0x81; for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年 { Time_data[n] = Ds1302Read(2*n+addr); } } 原始的程序是从STC89C52上移植过来,考虑到STC12系列是1T指令周期,对延时部分做了相应的修改。晶振采用11.0592。目前的状况是在STC89C52完全能通过。但是在STC12C5A60S2上,虽然折腾了半天总算是显示了分和秒,但是显示总是时不时的夹杂跳出莫名奇妙的数字(MAX7221的显示设置成了内部译码模式,显示时常莫名奇妙显示P、H之类的非数字,应该是读取的时间数值有问题,超过了0~9才会出现非数字显示)。真是令人抓狂的STC12系列!以前一直是用汇编编程的,最近感觉碰到复杂的运算,还是C51方便很多,就转头开始尝试学习C51的编程。编译的结果是全交给了Keil,虽然从调试时的反汇编能看到汇编运行的情况,但总是掌握不住指令运行的时钟周期。还请前辈们能不惜赐教,在此深表感谢。附件是全部的程序。 附件居然会要积分,搞了半天也不知道在哪里取消,只好删除了。其实里面除了包含main函数之外还有一个定义各种变量及延时程序的头文件。 |
|
相关推荐
3 条评论
1个回答
|
|
下载还要积分,疯了吧
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
《DNESP32S3使用指南-IDF版_V1.6》第三十五章 摄像头实验
219 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第三十章 DHT11数字温湿度传感器
574 浏览 0 评论
684 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
1074 浏览 0 评论
1073 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12053 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-28 03:08 , Processed in 0.819954 second(s), Total 45, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号