用電子秤上是led數碼管顯示ds1302時間數據。用邏輯分析儀了解大概協議之后改寫了lcd1602液晶顯示的代碼。成功運行。數碼管最后兩位顯示秒。
1633743399489.jpg (4.14 MB, 下載次數: 74)
下載附件
2021-10-9 09:48 上傳
1633743731448.jpg (4.13 MB, 下載次數: 60)
下載附件
2021-10-9 09:48 上傳
單片機源程序如下:
- #include<reg52.h>
- #include<intrins.h>
- #define Delay(us) {_nop_();_nop_();_nop_();_nop_();}
- #define FOSC 18432000L
- #define uchar unsigned char
- #define uint unsigned int
- uchar dis_time_buf[16]={0};
- //*******1640驅動************
- sbit sda=P1^1; //TM1640數據線
- sbit scl=P3^7; //TM1640時鐘線
- unsigned char date[] = {
- 0xb7,0x82,0x9d,0x3d,0x2e,0x3b,0xbb,0x25,0xbf,0x3f,0xaf,0x9e,0x9d,0x82,0x3b,0x8b,0xbc,0x6f,0x2f,0x40,0x00};
- unsigned char bite[16];
- //*****************************
- //DS1302引腳定義
- sbit RST=P1^4;
- sbit IO=P1^5;
- sbit SCK=P1^6;
- //DS1302地址定義
- #define ds1302_sec_add 0x80 //秒數據地址
- #define ds1302_min_add 0x82 //分數據地址
- #define ds1302_hr_add 0x84 //時數據地址
- #define ds1302_date_add 0x86 //日數據地址
- #define ds1302_month_add 0x88 //月數據地址
- #define ds1302_day_add 0x8a //星期數據地址
- #define ds1302_year_add 0x8c //年數據地址
- #define ds1302_control_add 0x8e //控制數據地址
- #define ds1302_charger_add 0x90
- #define ds1302_clkburst_add 0xbe
- //初始時間定義
- uchar time_buf[8] = {0x20,0x20,0x07,0x10,0x00,0x34,0x55,0x05};//初始時間2020年7月10號0點34分55秒 星期二
- //功能:延時1毫秒
- //入口參數:x
- //出口參數:無
- //說明:當晶振為12M時,j<112;當晶振為11.0592M時,j<122
- void Delay_xms(uint x)
- {
- uint i,j;
- for(i=0;i<x;i++)
- for(j=0;j<112;j++);
- }
- //功能:12us延時
- //STC89C52為1T單片機,即1個時鐘/機器周期,速度為AT89C52的12倍
- void Delay_xus(uint t)
- {
- for(;t>0;t--)
- {
- _nop_();
- }
- }
- //*********START***************
- //功能:12us延時
- void start() //1640開始
- {
- //scl=0;
- sda=1;
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- sda=0;
- _nop_();
- _nop_();
- scl=0;
- _nop_();
- _nop_();
- }
- //**************************************************************
- void stop() //1640結束
- {
- scl=0;
- _nop_();
- _nop_();
- sda=0;
- //scl=1;
- _nop_();
- _nop_();
- scl=1;
- _nop_();
- _nop_();
- sda=1;
- _nop_();
- _nop_();
- }
- //***********************************************************
- void write(unsigned char date) //1640寫字節
- {
- unsigned char i,aa;
- aa=date;
- //sda=0;
- //scl=0;
- for(i=0;i<8;i++)
- {
- scl=0;
- if(aa&0x01)
- {
- sda=1;
- _nop_();
- _nop_();
- }
- else
- {
- sda=0;
- _nop_();
- _nop_();
- }
- scl=1;
- _nop_();
- aa=aa>>1;
- }
- //scl=0;
- //sda=0;
- }
- //**************向TM1640發送顯示數據***************************
- void send(unsigned char date1)
- //void send()
- {
- unsigned char ii;
- // unsigned char mask;
- start();
- write(0x40); //設置數據,地址加1模式
- stop();
- start();
- write(0xC0); //起始地址
- for(ii=0;ii<16;ii++) //16個地址
- {
- write(bite[ii]);
- }
- /* for(mask=0x80;mask!=0;mask>>=1)
- {
- if((mask&date1) == 0)
- I2C_SDA = 0;
- else
- I2C_SDA = 1;
- I2CDelay();
- I2C_SCL = 1;
- I2CDelay();
- I2C_SCL = 0;
- }*/
- stop();
- start();
- write(0x8f); //控制顯示,開顯示,脈沖寬度為14/16
- stop();
- }
- //****** 設置數據
- /* void sttingdate(uchar gg)
- { if (gg==1)
- {start();
- write(0x40);
- stop();}//設置數據,地址加一模式
- else
- {start();
- write(0x44);
- stop();} //設置數據,地址固定模式
- }
- //**************寫入一個字節數據********************
- void LED_write_char(unsigned char x,unsigned char z)
- {
-
- //if (x<15)
-
- write(0xc0+x); //表示第一行
-
-
- write(date[z]);
-
- }*/
- //**********************************
- //**********************************
- /*void send1()
- {
- unsigned char i;
- start();
- //write(0x40); //設置數據,地址加1模式
- write(0x44); //固定地址模式
- stop();
- start();
- write(0x00);
- write(0xff);
- stop();
- start();
- write(0x01);
- write(0x01);
- stop();
- start();
- write(0x02);
- write(0x01);
- stop();
- start();
- write(0x03);
- write(0x01);
- stop();
- start();
- write(0x04);
- write(0x01);
- stop();
- start();
- write(0x05);
- write(0x01);
- stop();
- start();
- write(0x06);
- write(0x01);
- stop();
- start();
- write(0x8f); //控制顯示,開顯示,脈沖寬度為14/16
- stop();
- }*/
- //**********************************************************
- void delay(unsigned int z) //延時子程序
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=487;y>0;y--);
- }
- //DS1302初始化函數
- void ds1302_init(void)
- {
- RST=0; //RST腳置低
- SCK=0; //SCK腳置低
- }
- //向DS1302寫入一字節數據
- void ds1302_write_byte(uchar addr, uchar d)
- {
- uchar i;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr & 0xFE; //最低位置零,寄存器0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- addr = addr >> 1;
- }
- //寫入數據:d
- for (i = 0; i < 8; i ++) {
- if (d & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1; //產生時鐘
- SCK=0;
- d = d >> 1;
- }
- RST=0; //停止DS1302總線
- }
- //從DS1302讀出一字節數據
- uchar ds1302_read_byte(uchar addr) {
- uchar i,temp;
- RST=1; //啟動DS1302總線
- //寫入目標地址:addr
- addr = addr | 0x01; //最低位置高,寄存器0位為0時寫,為1時讀
- for (i = 0; i < 8; i ++) {
- if (addr & 0x01) {
- IO=1;
- }
- else {
- IO=0;
- }
- SCK=1;
- SCK=0;
- addr = addr >> 1;
- }
- //輸出數據:temp
- for (i = 0; i < 8; i ++) {
- temp = temp >> 1;
- if (IO) {
- temp |= 0x80;
- }
- else {
- temp &= 0x7F;
- }
- SCK=1;
- SCK=0;
- }
- RST=0; //停止DS1302總線
- return temp;
- }
- //向DS302寫入時鐘數據
- void ds1302_write_time(void)
- {
- ds1302_write_byte(ds1302_control_add,0x00); //關閉寫保護
- ds1302_write_byte(ds1302_sec_add,0x80); //暫停時鐘
- //ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充電
- ds1302_write_byte(ds1302_year_add,time_buf[1]); //年
- ds1302_write_byte(ds1302_month_add,time_buf[2]); //月
- ds1302_write_byte(ds1302_date_add,time_buf[3]); //日
- ds1302_write_byte(ds1302_hr_add,time_buf[4]); //時
- ds1302_write_byte(ds1302_min_add,time_buf[5]); //分
- ds1302_write_byte(ds1302_sec_add,time_buf[6]); //秒
- ds1302_write_byte(ds1302_day_add,time_buf[7]); //周
- ds1302_write_byte(ds1302_control_add,0x80); //打開寫保護
- }
- //從DS302讀出時鐘數據
- void ds1302_read_time(void)
- {
- time_buf[1]=ds1302_read_byte(ds1302_year_add); //年
- time_buf[2]=ds1302_read_byte(ds1302_month_add); //月
- time_buf[3]=ds1302_read_byte(ds1302_date_add); //日
- time_buf[4]=ds1302_read_byte(ds1302_hr_add); //時
- time_buf[5]=ds1302_read_byte(ds1302_min_add); //分
- time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
-
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
51hei.png (4.23 KB, 下載次數: 65)
下載附件
2021-10-9 15:46 上傳
上圖Keil代碼工程下載:
tm1640ds1302時鐘顯示.7z
(13.97 KB, 下載次數: 73)
2021-10-9 15:47 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|