第八章 单片机常用总线讲解
sclk=1; // sclk信号上跳
sclk=0; //返回低电平,为下次上跳做准备 . . .
i/o=a7; //直到命令最后一位
sclk=1; sclk=0; i/o=a0; sclk=1; sclk=0; i/o=a1; sclk=1; sclk=0; . . .
i/o=a7; sclk=1; sclk=0; ce=0; sclk=1;
例:试验数码管显示时钟 实验链接图8-21如下所示: // sclk信号上跳,到此为止,命令字节发送完毕//以下为写数据操作
// sclk信号下跳,为发送数据做准备 //将输出的命令a0送上i/o数据线 // sclk信号上跳
//返回低电平,为下次上跳做准备 //将输出的命令a1送上i/o数据线 // sclk信号上跳
//返回低电平,为下次上跳做准备 //直到写入命令最后一位
// sclk信号上跳,到此为止,命令字节发送完毕 // sclk信号下跳,为下次上跳做准备 //结束一次数据写入操作
. . ..
图8-21 DS1302与89C2051的连接图 注意:短路冒一定要接上。
通过本例程了解 DS1302时钟芯片的基本原理和使用 ,理解并掌握DS1302时钟芯片驱动程序的编写以及实现数字字符在数码管中的显示。
请学员认真消化本例程,懂DS1302在C语言中的操作
#include
#include
bit ReadRTC_Flag; //定义读DS1302标志
unsigned char l_tmpdate[7]={0,0,12,15,5,3,8};//秒分时日月周年08-05-15 12:00:00 unsigned char l_tmpdisplay[8];
code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年 最低位读写位
code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; code unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
.v .. ..
第八章 单片机常用总线讲解
//共阴数码管 0-9 '-' '熄灭‘表
/******************************************************************/ /* 函数声明 */
/******************************************************************/
void Write_Ds1302_byte(unsigned char temp);
void Write_Ds1302( unsigned char address,unsigned char dat ); unsigned char Read_Ds1302 ( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0
/******************************************************************/ /* 主函数 */
/******************************************************************/ void main(void) {
InitTIMER0(); //初始化定时器0
Set_RTC(); //写入时钟值,如果使用备用电池时候,不需要没每次上电写入,此程序应该屏蔽
while(1) {
if(ReadRTC_Flag) {
ReadRTC_Flag=0;
Read_RTC();
l_tmpdisplay[0]=l_tmpdate[2]/16; //数据的转换,因我们采用数码管0~9的
显示,将数据分开
l_tmpdisplay[1]=l_tmpdate[2]&0x0f; l_tmpdisplay[2]=10;
//加入\
l_tmpdisplay[3]=l_tmpdate[1]/16;
. . ..
}
} }
l_tmpdisplay[4]=l_tmpdate[1]&0x0f; l_tmpdisplay[5]=10;
l_tmpdisplay[6]=l_tmpdate[0]/16; l_tmpdisplay[7]=l_tmpdate[0]&0x0f;
/******************************************************************/ /* 定时器0初始化 */
/******************************************************************/ void InitTIMER0(void) {
TMOD|=0x01;//定时器设置 16位 TH0=0xef;//初始化值 TL0=0xf0; ET0=1; TR0=1; EA=1; }
/******************************************************************/ /* 写一个字节 */
/******************************************************************/ void Write_Ds1302_Byte(unsigned char temp) {
unsigned char i;
for (i=0;i<8;i++) //循环8次 写入数据 { SCK=0;
SDA=temp&0x01; //每次传输低字节 temp>>=1;
//右移一位
.v .. ..
第八章 单片机常用总线讲解
SCK=1; } }
/******************************************************************/ /* 写入DS1302 */
/******************************************************************/ void Write_Ds1302( unsigned char address,unsigned char dat ) {
RST=0;
_nop_();
SCK=0;
_nop_();
RST=1;
_nop_(); //启动 Write_Ds1302_Byte(address); //发送地址 Write_Ds1302_Byte(dat); RST=0; }
/******************************************************************/ /* 读出DS1302数据 */
/******************************************************************/ unsigned char Read_Ds1302 ( unsigned char address ) {
unsigned char i,temp=0x00; RST=0;
_nop_(); _nop_();
//发送数据
//恢复
SCK=0;
_nop_(); _nop_();
单片机常用总线讲解
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)
![](/skin/haowen/images/icon_star.png)