欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
STC89單片機驅動DS12C887的代碼,以及請教如何用STC12驅動
[打印本頁]
作者:
michaelchain
時間:
2021-8-22 20:30
標題:
STC89單片機驅動DS12C887的代碼,以及請教如何用STC12驅動
下面的代碼能正確讀出三個控制位以及年月日時分秒.
但是同樣的代碼, 在STC12C5A52S2 (包括STC12C5A56S2)上不行, 懷疑在所有1T模式的STC系列(STC10, STC11, STC12, STC15)上都不行.
各位大佬如果有條件請麻煩試一下是否是這個情況.
這個代碼是用于STC89C5x系列的, 實測可以使用
#include <reg52.h>
#include <stdio.h>
typedef unsigned int u16;
typedef unsigned char u8;
u8 year, month, date, hour, minute, second, week_day;
u8 alarm_hour, alarm_minute, alarm_second;
u8 reg_a, reg_b, reg_c;
void delay(u16 z) {
u16 x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
sbit DS12_DS = P1^0;
sbit DS12_RW = P1^1;
sbit DS12_AS = P1^2;
sbit DS12_CS = P1^4;
sbit DS12_IRQ = P3^2;
void DS12C887_write(u8 addr, u8 dat)
{
delay(1);
DS12_CS = 0; // ds12c887de 使能端 cs=0
delay(1);
DS12_AS=1;
DS12_DS=1;
DS12_RW=1;
delay(1);
P0 = addr;
delay(1);
DS12_AS=0;
DS12_RW=0;
P0 = dat;
DS12_RW=1;
DS12_AS=1;
delay(1);
DS12_CS = 1; // ds12c887de 使能端 cs=1
delay(1);
}
u8 DS12C887_read(u8 addr)
{
u8 ds_date;
DS12_AS=1;
DS12_DS=1;
DS12_RW=1;
delay(1);
DS12_CS = 0;
delay(1);
P0 = addr;
delay(1);
DS12_AS=0;
DS12_DS=0;
P0 = 0XFF;
ds_date=P0;
DS12_DS=1;
DS12_AS=1;
DS12_CS = 1;
return ds_date;
}
void DS12C887_init()
{
DS12C887_write(0x0b, 0x26);
DS12C887_write(0x0a, 0x20);
}
void main()
{
P0 = 0x00; // P0口清零
P1 = 0xff; // P1口全1
DS12C887_init();//ds12c887 初始化
EA =1; // 開啟中斷, 開啟TIM1中斷, 開啟外部中斷0
IT0 =1;
EX0 =1;
// 初始化UART
TMOD = 0x20;
SCON = 0x40;
TH1 = 256 - 11.0592 * 1000 * 1000 / 12 / 32 / 9600 + 0.5;
TCON |= 0x40;
SCON |= 0x02;
// 初始化UART結束
/* 初始化寫入
DS12C887_write(9,11); // Year
DS12C887_write(8,8); // Month
DS12C887_write(7,7); // Date
DS12C887_write(6,7); // Week Day
DS12C887_write(4,9); // Hour
DS12C887_write(2,27); // Minute
DS12C887_write(0,25); // Second
*/
while(1) {
second = DS12C887_read(0x00);
alarm_second = DS12C887_read(0x01);
minute = DS12C887_read(0x02);
alarm_minute = DS12C887_read(0x03);
hour = DS12C887_read(0x04);
alarm_hour = DS12C887_read(0x05);
date = DS12C887_read(0x07);
month = DS12C887_read(0x08);
year = DS12C887_read(0x09);
reg_a = DS12C887_read(0x0a);
reg_b = DS12C887_read(0x0b);
reg_c = DS12C887_read(0x0c);
printf("%bX-%bX-%bX ", reg_a, reg_b, reg_c);
printf("%bX-%bX-%bX ", year, month, date);
printf("%bX:%bX:%bX\r\n", hour, minute, second);
}
}
void exter() interrupt 0
{
// 這里處理中斷
}
復制代碼
作者:
51hei團團
時間:
2021-8-23 04:30
一般在1t單片機上運行把延時函數修改一下 即可
作者:
188610329
時間:
2021-8-28 16:06
你說的不行,具體是什么?
你代碼不全,很多東西不好判斷。
就說,代碼中看到幾個問題。
首先頭文件,STC15,12,11系列,必須用他們的頭文件,不能用reg51,不然,可能有不可預知的問題。
其次,15系列單片機,大多沒有T1, 你串口必須要用T2來定速,并且,AUXR里面必須把T2設置為1T模式,并且16位自動重載。然后延時問題,建議用15系列,12系列的話,還是下載一個STC下載器,里面自帶延時計算。不然,你很難調整,雖然15,12,11系列號稱1T,但是對于延時,只有NOP做到的真正一個時鐘,其他的類似While所牽涉的DJNZ代碼都是4-5個時鐘的。
作者:
michaelchain
時間:
2021-10-23 22:21
今天難得有空, 上邏輯分析儀測了一下問題原因, 跟時序和延遲沒有關系, 出錯是因為STC12和STC89的GPIO驅動能力不一樣, STC12在讀取時不能用準雙向模式, 必須切換到高阻態. 這樣讀取就沒問題了.
詳細說明都寫在這里了:
https://www.cnblogs.com/milton/p/15168730.html
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1