寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序
真正的熟练掌握单片机,实际操作是很重要的。多看程序,多分析,从别人规范的程序代码中学习技巧是很必要的。
硬件部分:
程序部分:
main.c文件
/**************************************************************************************
实现现象:下载程序后,数码管显示时钟数据
***************************************************************************************/
#include "reg52.h" //此文件中定义了单片机的一些特殊功能寄存器
#include"ds1302.h"
typedef unsigned int u16; //对数据类型进行声明定义
typedef unsigned char u8;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
char num=0;
u8 DisplayData[8];
u8 code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*******************************************************************************
延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
/*******************************************************************************
时间读取处理转换函数
*******************************************************************************/
void datapros()
{
Ds1302ReadTime();
DisplayData[0] = smgduan[TIME[2]/16];//时
DisplayData[1] = smgduan[TIME[2]&0x0f];
DisplayData[2] = 0x40;
DisplayData[3] = smgduan[TIME[1]/16];//分
DisplayData[4] = smgduan[TIME[1]&0x0f];
DisplayData[5] = 0x40;
DisplayData[6] = smgduan[TIME[0]/16];//秒
DisplayData[7] = smgduan[TIME[0]&0x0f];
}
/*******************************************************************************
数码管显示函数
*******************************************************************************/
void DigDisplay()
{
u8 i;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
P0=DisplayData[7-i];//发送数据
delay(100); //间隔一段时间扫描
P0=0x00;//消隐
}
}
/*******************************************************************************
主函数
*******************************************************************************/
void main()
{
Ds1302Init();
while(1)
{
datapros(); //数据处理函数
DigDisplay();//数码管显示函数
}
}
ds1302.c文件
#include"ds1302.h"
//---DS1302写入和读取时分秒的地址命令---//
//---秒分时日月周年 最低位读写位;-------//
uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
//---DS1302时钟初始化2016年5月7日星期六12点00分00秒。---//
//---存储顺序是秒分时日月周年,存储格式是用BCD码---//
uchar TIME[7] = {0, 0, 0x12, 0x07, 0x05, 0x06, 0x16};
/*******************************************************************************
向DS1302命令(地址+数据)
*******************************************************************************/
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++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
for (n=0; n<8; n++)//写入8位数据
{
DSIO = dat & 0x01;
dat >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;
_nop_();
}
RST = 0;//传送数据结束
_nop_();
}
/*******************************************************************************
读取一个地址的数据
*******************************************************************************/
uchar Ds1302Read(uchar addr)
{
uchar n,dat,dat1;
RST = 0;
_nop_();
SCLK = 0;//先将SCLK置低电平。
_nop_();
RST = 1;//然后将RST(CE)置高电平。
_nop_();
for(n=0; n<8; n++)//开始传送八位地址命令
{
DSIO = addr & 0x01;//数据从低位开始传送
addr >>= 1;
SCLK = 1;//数据在上升沿时,DS1302读取数据
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
_nop_();
for(n=0; n<8; n++)//读取8位数据
{
dat1 = DSIO;//从最低位开始接收
dat = (dat>>1) | (dat1<<7);
SCLK = 1;
_nop_();
SCLK = 0;//DS1302下降沿时,放置数据
_nop_();
}
RST = 0;
_nop_();//以下为DS1302复位的稳定时间,必须的。
SCLK = 1;
_nop_();
DSIO = 0;
_nop_();
DSIO = 1;
_nop_();
return dat;
}
/*******************************************************************************
初始化DS1302.
*******************************************************************************/
void Ds1302Init()
{
uchar n;
Ds1302Write(0x8E,0X00); //禁止写保护,就是关闭写保护功能
for (n=0; n<7; n++)//写入7个字节的时钟信号:分秒时日月周年
{
Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
}
Ds1302Write(0x8E,0x80); //打开写保护功能
}
/*******************************************************************************
读取时钟信息
*******************************************************************************/
void Ds1302ReadTime()
{
uchar n;
for (n=0; n<7; n++)//读取7个字节的时钟信号:分秒时日月周年
{
TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
}
}
ds1302.h文件
#ifndef __DS1302_H_
#define __DS1302_H_
//---包含头文件---//
#include
#include
//---重定义关键词---//
#ifndef uchar
#define uchar unsigned char
#endif
#ifndef uint
#define uint unsigned int
#endif
//---定义ds1302使用的IO口---//
sbit DSIO=P3^4;
sbit RST=P3^5;
sbit SCLK=P3^6;
//---定义全局函数---//
void Ds1302Write(uchar addr, uchar dat);
uchar Ds1302Read(uchar addr);
void Ds1302Init();
void Ds1302ReadTime();
//---加入全局变量--//
extern uchar TIME[7];//加入全局变量
#endif
寻路机器人单片机程序示例_单片机精华程序代码示例:DS1302时钟程序相关推荐
- 单片机c语言程序流程图,ds1302时钟程序详解,ds1302程序流程图(C程序)
ds1302时钟程序详解 DS1302 的控制字如图2所示.控制字节的最高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果为0,则表示存取日历时钟数据,为1表示存取RA ...
- 寻路机器人单片机程序示例_单片机典型案例开发(四)
一.基于STC单片机的智能LED路灯控制器设计本文引用地址:http://www.eepw.com.cn/article/171408.htm 摘要:为了充分节约能源,提高路灯控制系统的智能化,介绍了 ...
- 寻路机器人单片机程序示例_单片机4*4键盘汇编语言控制示例 计算器 带proteus仿真及源程序...
KEYBUF EQU 40H ;键号存放单元 ORG 0000H LJMP MAIN ORG 0030H MAIN: MOV KEYBUF,#0 ;初始键号设位0,也可以为任意 ...
- 单片机加减法计算器_单片机简易加法计算器程序
学到这里,我们已经掌握了一种显示设备和一种输入设备的使用,那么是不是可以来做点综合性的实验了.好吧,那我们就来做一个简易的加法计算器,用程序实现从板子上标有0-9数字的按键输入相应数字,该数字要实时显 ...
- 单片机加减法计算器_单片机加法计算器程序
首先,本程序相对于之前的例程要复杂得多,需要完成的工作也多得多,所以我们把各个子功能都做成独立的函数,以使程序便于编写和维护.大家分析程序的时候就从主函数和中断函数入手,随着程序的流程进行就可以了.大 ...
- 单片机蓝牙烧录_单片机和蓝牙模块的完美结合
是近年来发展迅速的短距离无线通信技术,可以用来替代数字设备间短距离的有线电缆连接.利用蓝牙技术构建数据采集无线传输模块,与传统的电线或红外方式传输测控数据相比,在测控领域应用篮牙技术的优点主要有: 1 ...
- java爬虫代码示例_那些让你代码思维和能力有较大的提升Java源码
来源:www.cnblogs.com/jiagou/p/9270070.html 对于学习J2EE的框架有很大的帮助,代码里使用了各种设计模式.事件机制.Java8语法.代码量也很小,web服务使用N ...
- 微信公众号发送小程序卡片_微信公众号里怎么添加小程序-如何在微信[[公众号]]添加小程序卡片-微信关联小程序...
参考官方Demo 1.进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的AppID即可. 2.腾讯地图+小程序appID:wx7643d5f831302ab0 3. ...
- 微信公众号发送小程序卡片_如何在微信 [[公众号]]添加小程序卡片
参考官方Demo 进入公众号,选择「关联小程序」后,微信公众号运营者用手机扫码进行认证,并输入小程序的 AppID 即可. 腾讯地图+小程序appID:wx7643d5f831302ab0 在这里,可 ...
最新文章
- mysql录入foreigen错误_编译安装MySQL5.6失败的相关问题解决方案
- 【系统架构设计师】软考高级职称,来自订阅者真实反馈,从理论、实践、技巧让你掌握论文写作秘诀
- FAQ from CSDN
- 活字格企业Web应用生成器V3.0发布更新,支持插件管理和多人协作开发
- HTTP 权威指南 详解 (推荐阅读 )
- eclipse svn切换账号
- 2022最新淘宝天猫商品sku精准库存(sku库存200)
- 【英语:基础进阶_原著扩展阅读】J6.原著阅读实战训练
- [RK3399 Android7.1.2]新增wifibt模块:rtl8822cs驱动以及解决所遇问题
- Javascript 版万年历
- Intel服务器CPU背面信息,英特尔(Intel)服务器CPU全解析(图)
- 保障信息安全不违规,App应满足哪些法律规定
- 如何使用大华SDK工具查询和播放设备录像?
- 国产软件不背黑锅,4款强大又实用的电脑软件,用了舍不得卸载
- 小鸟云独享虚拟主机和共享虚拟主机区别对比
- oracle中那个日期怎么相减_oracle日期时间加减规则
- 干货 | 空压机安装指南
- nextpolish安装_NECAT: Nanopore数据的高效组装工具
- ESXi与物理交换机静态链路聚合配置过程中的小陷阱
- AI二次开发c#开发环境搭建