ds1302显示时间(通过串口调试助手)---C语言版本
来源:互联网 发布:js 双向绑定 编辑:程序博客网 时间:2024/06/05 20:28
ds1302显示时间(通过串口调试助手--C语言版本详细内容请下载地址:http://download.csdn.net/detail/chenqiai0/4488523
/*ds1302显示时间(通过串口调试助手)*/#include<reg52.h>#include <intrins.h>typedef unsigned char uint8;typedef unsigned int uint16; sbit SDA=P3^4; //数据sbit SCK=P3^5; //时钟sbit RST=P1^7;//DS1302复位(片选)uint8 time[7]={50,41,20,9,8,4,12};//秒分时日月周年10-08-15 23:59:50 7代表周日#define DS1302_W_ADDR 0x80#define DS1302_R_ADDR 0x81void ds1302_reset()//令SCK=0;RST=1{ RST=0;//停止数据传送 SCK=0;//时钟总线清零 RST=1;//数据操作}//写一个字节void ds1302_write_byte(uint8 dat){ uint8 i; for(i=0;i<8;i++) { SDA=dat & 0x01; SCK=1; SCK=0; dat>>=1; }}//读一个字节//对于数据输出:开始的8 个SCLK 周期,输入一个读命令字节,数据字节在后8 个SCLK周期的下降沿输出//注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入//(Note that the first data bit to be transmitted occurs on the first falling edge after the last bit of the command byte is written. ),//也就是命令字节最后一个字节写入后产生的下降沿使得第一个数据位被读取uint8 ds1302_read_byte(){ uint8 i,dat=0;//用dat存储读到的数据 for(i=0;i<8;i++) { dat>>=1;if(SDA==1) dat=dat | 0x80;//因为从低位开始读SCK=1;SCK=0;//由上面解释可以知道:我们首先应该判断if(SDA==1),然后进行SCK=1,SCK=0 } return dat;}//清除写保护void ds1302_clear_WP(){ ds1302_reset(); RST=1; ds1302_write_byte(0x8E);//写入地址 ds1302_write_byte(0x00);//写入数据 //写完后 SDA=0; RST=0; }//设置写保护void ds1302_set_WP(){ ds1302_reset(); RST=1; ds1302_write_byte(0x8E);//写入地址 ds1302_write_byte(0x80);//写入数据 //写完后 SDA=0; RST=0; }//写入ds1302void ds1302_write(uint8 addr,uint8 dat){ ds1302_reset(); RST=1; ds1302_write_byte(addr);//写入地址 ds1302_write_byte(dat);//写入数据 //写完后 RST=0; SDA=0;}//从ds1302读数据uint8 ds1302_read(uint8 addr){ uint8 temp=0;//存储读出来的数据 ds1302_reset(); RST=1; ds1302_write_byte(addr);//写入地址 temp=ds1302_read_byte();//写入数据 //写完后 RST=0; SDA=0; return temp;}void delay(uint16 n){ while(n--);}/** * 设定时钟数据 其中涉及二进制和BCD转换 因为ds1302存BCD ,但是机器只认识二进制 例如:存入ds1302为50 0101 0000 那么我们写入的是ds1302_write(80)*/void set_time(uint8 *timedata){ uint8 i;uint8 temp=0;for(i=0;i<7;i++){ temp=timedata[i]/10; timedata[i]=timedata[i]%10; timedata[i]=timedata[i]+temp*16;}ds1302_clear_WP();//对ds1302操作前先将wp位清零temp=DS1302_W_ADDR;//写入起始位置for(i=0;i<7;i++){ ds1302_write(temp,timedata[i]); temp+=2;}ds1302_set_WP();}/** * 读时钟数据(BCD格式)*/void read_time(uint8 *timedata){ uint8 i,temp; temp=DS1302_R_ADDR;//读起始位置 for(i=0;i<7;i++) { timedata[i]=ds1302_read(temp); temp+=2; }}/* UART初始化 * 波特率:9600*/void uart_init(void){ TMOD=0x21; SCON=0x50; TH1=0xFD; TL1=0xFD; TR1=1; }/** * UART发送一字节*/void UART_Send_Byte(uint8 dat){ SBUF=dat; while(TI==0); TI=0;}/** * 将数据转换成ASC码并通过UART发送出去*/void UART_Send_Dat(uint8 dat) //注意是关于16取余{ UART_Send_Byte(dat/16+'0'); UART_Send_Byte(dat%16+'0'); }void main(){ uart_init(); set_time(&time); //设定时间值while(1){read_time(&time); //秒分时日月周年 UART_Send_Dat(time[6]);UART_Send_Byte('-');UART_Send_Dat(time[4]);UART_Send_Byte('-');UART_Send_Dat(time[3]);UART_Send_Byte(' ');UART_Send_Dat(time[2]);UART_Send_Byte(':');UART_Send_Dat(time[1]);UART_Send_Byte(':');UART_Send_Dat(time[0]);UART_Send_Byte('\r');UART_Send_Byte('\n');delay(10000);}}
有问题或是发现错误或是可以改进,希望可以留言,谢谢
- ds1302显示时间(通过串口调试助手)---C语言版本
- 串口调试助手上输入数据,然后再数码管显示(C语言版本)
- 键盘输入的数字在串口调试助手显示,然后再到数码管(C语音版本)
- 串口调试助手上输入数据0-9,然后再数码管显示(汇编语言版本)
- 键盘输入的数字在串口调试助手显示,然后再到数码管(汇编语言版本)
- PjComm:控制台版本的串口调试助手
- Linux版本 串口调试助手 发布
- Pixy通过TTL转USB与电脑串口调试助手显示坐标
- 如何在串口调试助手上,使用printf()函数显示十进制的数据及汉字说明(c语言版)
- C语言程序>>DS1302
- 基于DS1302芯片---使用51单片机C语言编制的电子时钟(液晶1602显示)
- Zigbee 两串口调试助手通过两节点无线通信
- 串口调试助手源程序(二)
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手源程序
- 串口调试助手使用说明
- 云计算
- C语言中static用法介绍
- 解决WIN7编译出的程序无法连接其他数据库的问题。
- 字符串各种纠结
- hdu 4355 Party All the Time
- ds1302显示时间(通过串口调试助手)---C语言版本
- malloc(0)
- 线性代数中的线性方程组_part1
- Swing自定义JList
- 代理模式(Proxy)
- 国家集训队论文分类
- LDAP系列开写
- 几个常用的PHP函数
- kalman