久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51單片機DS1302簡要記錄
[打印本頁]
作者:
NIMITIZ
時間:
2021-5-16 20:40
標題:
51單片機DS1302簡要記錄
寫了一個DS1302的程序,在開發板上成功運行,通過LCD1602顯示時間,現在分享出來,給像我這樣的單片機萌新一個參考吧。
從2021年5月11日0時0分0秒開始計時并在LCD1602上顯示,源碼如下:
#include<reg52.h>
#include<intrins.h>
sbit RST=P2^4;
sbit CLK=P2^1;
sbit IO=P2^0;
sbit RS=P1^0;
sbit RW=P1^1;
sbit E=P2^5;
sbit DU=P2^6;
unsigned char num[]={"0123456789"}; //LCD1602顯示的數字字符
void X() //關閉數碼管
{
DU=1;
P0=0x00;
DU=0;
}
void Delay()
{
_nop_();
}
void Write_Bit_DS1302(unsigned char DAT) //向DS1302寫入一字節的數據
{
unsigned char i;
CLK=0;
Delay();
for(i=0;i<8;i++)
{
IO=DAT&0x01; //低位在前,高位在后
Delay();
CLK=1; //時鐘信號上升沿,寫入數據
Delay();
CLK=0; //重新拉低CLK,形成脈沖
DAT>>=1; //將DAT的各數據位右移1位,準備寫入下一數據位
}
}
void Write_DS1302(unsigned char CMD,unsigned char DAT) //向DS1302寫入命令和數據
{
RST=0; //禁止數據傳輸
CLK=0; //在寫入數據前確保CLK置低電平
RST=1; //開始數據傳輸
Delay();
Write_Bit_DS1302(CMD); //寫入命令
Write_Bit_DS1302(DAT); //寫入數據
CLK=1;
RST=0;
}
unsigned char Read_Bit_DS1302() //從DS1302讀出一字節的數據
{
unsigned char i,DAT;
Delay();
for(i=0;i<8;i++)
{
DAT>>=1;
if(IO==1)
{
DAT|=0x80;
}
CLK=1;
Delay();
CLK=0; //時鐘信號下降沿,讀出數據
Delay();
}
return DAT;
}
unsigned char Read_DS1302(unsigned char CMD) //向DS1302寫入命令后再從DS1302讀出數據
{
unsigned char DAT;
RST=0;
CLK=0;
RST=1;
Write_Bit_DS1302(CMD); //寫入命令
DAT=Read_Bit_DS1302(); //讀出數據
CLK=1;
RST=0;
return DAT;
}
void Init_DS1302() //DS1302初始化
{
unsigned char X;
X=Read_DS1302(0x81);
if(X&0x80) //判斷DS1302是否處于運行狀態
{
Write_DS1302(0x8e,0x00); //允許將數據寫入DS1302的寄存器
Write_DS1302(0x80,((00/10)<<4|(00%10))); //寫入“秒”的初始值,需要將LCD1602顯示的數字的ASCII值轉換成BCD碼
Write_DS1302(0x82,((00/10)<<4|(00%10))); //寫入“分”的初始值
Write_DS1302(0x84,((00/10)<<4|(00%10))); //寫入“時”的初始值
Write_DS1302(0x86,((11/10)<<4|(11%10))); //寫入“日”的初始值
Write_DS1302(0x88,((5/10)<<4|(5%10))); //寫入“月”的初始值
Write_DS1302(0x8c,((21/10)<<4|(21%10))); //寫入“年”的初始值
Write_DS1302(0x8e,0x80); //禁止將數據寫入DS1302的寄存器
}
}
void Delay5ms()
{
unsigned char i,j;
_nop_();
i=9;
j=244;
do
{
while(--j);
}
while(--i);
}
int ReadBusy() //LCD1602“讀忙”操作
{
int temp;
RS=0;
RW=1;
_nop_();
P0=0xff;
_nop_();
E=1;
_nop_();
temp=P0;
_nop_();
E=0;
return(temp&0x80);
}
void Write_Com(char com) //LCD1602“寫命令”操作
{
while(ReadBusy());
RS=0;
RW=0;
E=0;
_nop_();
P0=com;
_nop_();
E=1;
Delay5ms();
E=0;
Delay5ms();
}
void Write_Dat(char dat) //LCD1602“寫數據”操作
{
while(ReadBusy());
RS=1;
RW=0;
E=0;
_nop_();
P0=dat;
_nop_();
E=1;
Delay5ms();
E=0;
Delay5ms();
}
void LCD1602_Init() //LCD1602初始化
{
Delay5ms(); //延時15ms,首次寫入LCD1602時應給LCD1602一段較長的響應時間
Delay5ms();
Delay5ms();
Write_Com(0x38); //顯示模式設置:16*2顯示、5*7點陣,連續寫入3次,確保LCD1602初始化成功
Delay5ms();
Write_Com(0x38);
Delay5ms();
Write_Com(0x38);
Delay5ms();
Write_Com(0x0c); //顯示模式設置:開顯示、光標不顯示、光標不閃爍
Delay5ms();
Write_Com(0x06); //顯示模式設置:光標右移,字符不右移
Delay5ms();
Write_Com(0x01); //清除屏幕
Delay5ms();
}
void Display_Second(unsigned char x) //LCD1602顯示“秒”的數值
{
unsigned char i,j;
i=x/10; //取數值的十位
j=x%10; //取數值的個位
Write_Com(0x80+0x49); //寫入在LCD1602上顯示的位置
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void Display_Minute(unsigned char x) //LCD1602顯示“分”的數值
{
unsigned char i,j;
i=x/10;
j=x%10;
Write_Com(0x80+0x46);
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void Display_Hour(unsigned char x) //LCD1602顯示“時”的數值
{
unsigned char i,j;
i=x/10;
j=x%10;
Write_Com(0x80+0x43);
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void Display_Day(unsigned char x) //LCD1602顯示“日”的數值
{
unsigned char i,j;
i=x/10;
j=x%10;
Write_Com(0x80+0x0c);
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void Display_Month(unsigned char x) //LCD1602顯示“月”的數值
{
unsigned char i,j;
i=x/10;
j=x%10;
Write_Com(0x80+0x09);
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void Display_Year(unsigned char x) //LCD1602顯示“年”的數值
{
unsigned char i,j;
i=x/10;
j=x%10;
Write_Com(0x80+0x06);
Write_Dat(num[i]);
Write_Dat(num[j]);
Delay5ms();
}
void main()
{
unsigned char second,minute,hour,day,month,year;
unsigned char temp; //暫存從DS1302讀出的數據
X();
LCD1602_Init();
Write_Com(0x80+0x01);
Write_Dat('D');
Write_Dat('A');
Write_Dat('T');
Write_Dat('E');
Write_Dat(':');
Delay5ms();
Write_Com(0x80+0x08);
Write_Dat('-');
Delay5ms();
Write_Com(0x80+0x0b);
Write_Dat('-');
Delay5ms();
Write_Com(0x80+0x45);
Write_Dat(':');
Delay5ms();
Write_Com(0x80+0x48);
Write_Dat(':');
Delay5ms();
Init_DS1302();
while(1)
{
temp=Read_DS1302(0x81);
second=((temp&0x70)>>4)*10+(temp&0x0f); //將“秒”的BCD碼轉換成對應的ASCII值
Display_Second(second);
temp=Read_DS1302(0x83);
minute=((temp&0x70)>>4)*10+(temp&0x0f); //將“分”的BCD碼轉換成對應的ASCII值
Display_Minute(minute);
temp=Read_DS1302(0x85);
hour=((temp&0x70)>>4)*10+(temp&0x0f); //將“時”的BCD碼轉換成對應的ASCII值
Display_Hour(hour);
temp=Read_DS1302(0x87);
day=((temp&0x70)>>4)*10+(temp&0x0f); //將“日”的BCD碼轉換成對應的ASCII值
Display_Day(day);
temp=Read_DS1302(0x89);
month=((temp&0x70)>>4)*10+(temp&0x0f); //將“月”的BCD碼轉換成對應的ASCII值
Display_Month(month);
temp=Read_DS1302(0x8d);
year=((temp&0x70)>>4)*10+(temp&0x0f); //將“年”的BCD碼轉換成對應的ASCII值
Display_Year(year);
}
}
復制代碼
以下為原理圖
LCD1602模塊.png
(30.13 KB, 下載次數: 150)
下載附件
2021-5-16 20:39 上傳
DS1302時鐘模塊.png
(19.63 KB, 下載次數: 161)
下載附件
2021-5-16 20:39 上傳
作者:
sharehope
時間:
2021-5-20 22:05
感謝分享,有個疑問,I/O接口的輸出方式是什么?
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲女人天堂成人av在线
|
久久久久亚洲精品国产
|
91精品久久久久久久久
|
成人精品视频在线
|
国产精品美女久久久久aⅴ国产馆
|
欧美激情久久久
|
91资源在线播放
|
99re在线视频观看
|
国产高清在线精品
|
蜜臀久久99精品久久久久久宅男
|
中文字幕在线免费观看
|
成人在线播放网站
|
久草视频观看
|
91久久精品一区二区三区
|
黄色网毛片
|
久久久久久久av
|
国产成人精品久久二区二区91
|
美女久久视频
|
欧美日韩高清在线一区
|
青青久在线视频
|
亚洲精品成人在线
|
国产成人精品一区二区
|
亚洲一区综合
|
日韩有码在线播放
|
亚洲一区二区视频
|
99爱在线免费观看
|
国产精品久久9
|
欧美日韩国产高清视频
|
欧美一区二区三区免费电影
|
成人无遮挡毛片免费看
|
自拍视频一区二区三区
|
一级毛片在线播放
|
国产不卡一
|
精品久久久一区
|
亚洲成人一二区
|
国产精品福利久久久
|
91国在线高清视频
|
日本高清视频在线播放
|
成人性视频免费网站
|
日韩欧美一二三区
|
亚洲人在线播放
|