當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] AVR單片機(jī)萬(wàn)年歷程序//***************************FileName:RTC.C************************////***************************ICCAVRV6.30編譯**********************//#include//寄存器定義文件#includ

AVR單片機(jī)萬(wàn)年歷程序

//***************************FileName:RTC.C************************//


//***************************ICCAVRV6.30編譯**********************//

#include//寄存器定義文件
#include//使用到宏
#defineucharunsignedchar//數(shù)據(jù)類(lèi)型定義
#defineuintunsignedchar//數(shù)據(jù)類(lèi)型定義
#defineSD23030x64//SD2303器件IIC識(shí)別碼


ucharTable[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x38,0x76};
//顯示數(shù)據(jù)表0123456789LH
ucharData[4]={0,0,0,0};//DS1722
ucharEnter_Flag;//確定
ucharF_Flag;//數(shù)據(jù)應(yīng)答標(biāo)志

voidDelayMs(uinti)//延時(shí)函數(shù)1
{ucharj;
for(;i!=0;i--)
{for(j=2000;j!=0;j--){;}}
}

voidDisplay(uchar*p)//顯示函數(shù)
{uchari,sel=0x00;
for(i=0;i<16;i++)
{PORTC=sel;
PORTA=Table[p[i]];
DelayMs(10);
sel=sel<<1;
}
}


voidNOPNOP(uchari)//延時(shí)函數(shù)2
{for(;i!=0;i--)NOP();}

voidSetSCL(uchari)//IIC時(shí)鐘線SCL設(shè)置
{if(i==1)PORTB=PORTB|0x01;
elsePORTB=PORTB&0xFE;}

voidSetSDA(uchari)//IIC數(shù)據(jù)線SDA設(shè)置
{if(i==1)PORTB=PORTB|0x02;
elsePORTB=PORTB&0xFD;}

//SCL=PB^0;SD2303時(shí)鐘線
//SDA=PB^1;SD2303數(shù)據(jù)線
//INTRB=PB^3;SD2303中斷線A
//INTRA=PB^2;SD2303中斷線B

voidStart()//IIC總線開(kāi)始信號(hào)
{SetSDA(1);
SetSCL(1);
NOPNOP(50);
SetSDA(0);
NOPNOP(50);
SetSCL(0);
}

voidStop()//IIC總線停止信號(hào)
{SetSDA(0);
SetSCL(1);
NOPNOP(50);
SetSDA(1);
NOPNOP(50);
SetSCL(0);
}

voidAck()//單片機(jī)應(yīng)答信號(hào)
{SetSDA(0);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
SetSDA(1);
}

voidNack()//單片機(jī)非應(yīng)答信號(hào)
{SetSDA(1);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
SetSDA(0);
}

voidCheck_Ack()//器件應(yīng)答信號(hào)檢查
{SetSDA(1);
SetSCL(1);
F_Flag=0;
DDRB=DDRB&0xFD;
if((PINB&0x02)==0)
{SetSCL(0);
NOPNOP(50);}
else
{F_Flag=1;
SetSCL(0);
NOPNOP(50);}
DDRB=DDRB|0x02;
}

voidWrite_Bit0()//向IIC總線寫(xiě)0
{SetSDA(0);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
}

voidWrite_Bit1()//向IIC總線寫(xiě)1
{SetSDA(1);
SetSCL(1);
NOPNOP(50);
SetSCL(0);
SetSDA(0);
}

voidWrite_Byte(ucharData)//向IIC總線寫(xiě)一字節(jié)數(shù)據(jù)
{uchari;
for(i=0;i<8;i++)
{if((Data&0x80)>0)
Write_Bit1();
else
Write_Bit0();
Data<<=1;
}
}


ucharRead_Byte()//從IIC總線讀一字節(jié)數(shù)據(jù)
{ucharnn=0xff;
ucharj;
for(j=0;j<8;j++)
{SetSDA(1);
SetSCL(1);
DDRB=DDRB&0xFB;

if((PINB&0x02)==0)
{nn<<=1;
nn=(nn&0xfe);
SetSCL(0);}
else
{nn<<=1;
nn=(nn|0x01);
SetSCL(0);}
}
DDRB=DDRB|0x02;
return(nn);
}

//****************************寫(xiě)N個(gè)字節(jié)子程序**********************//
//函數(shù)參數(shù)說(shuō)明:
//Slave:IIC器件地址,如上文定義的SD2303
//Address:起始地址
//Array:讀數(shù)據(jù)存放的數(shù)組
//Number:讀取的字節(jié)數(shù)
voidWrite_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)
{uchark;
writ:do//開(kāi)始->寫(xiě)IIC器件地址->檢查應(yīng)答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address<<4);//送起始地址->檢查應(yīng)答位
Check_Ack();
}while(F_Flag==1);
for(k=0;k{Write_Byte(*Array);
Array++;
Check_Ack();}//檢查應(yīng)答位
Stop();
}

//****************************寫(xiě)一個(gè)字節(jié)子程序**********************//
//函數(shù)參數(shù)說(shuō)明:
//Slave:IIC器件地址,如上文定義的SD2303
//Address:IIC器件寄存器地址
//Data:數(shù)據(jù)
voidWrite_1byte(ucharSlave,ucharAddress,ucharData)
{writ:do//開(kāi)始->寫(xiě)IIC器件地址->檢查應(yīng)答位
{Start();
Write_Byte(Slave);
Check_Ack();
}while(F_Flag==1);
do
{Write_Byte(Address<<4);//送起始地址->檢查應(yīng)答位
Check_Ack();
}while(F_Flag==1);
Write_Byte(Data);
Check_Ack();//檢查應(yīng)答位
Stop();//停止信號(hào)
}


//***************************讀N個(gè)字節(jié)子程序***********************//
//函數(shù)參數(shù)說(shuō)明:
//Slave:IIC器件地址,如上文定義的SD2303
//Address:起始地址
//Array:讀數(shù)據(jù)存放的數(shù)組
//Number:讀取的字節(jié)數(shù)
voidRead_Nbyte(ucharSlave,ucharAddress,uchar*Array,ucharNumber)
{uchardata0,x;
//第一步:開(kāi)始信號(hào)->寫(xiě)IIC器件地址->檢查應(yīng)答位
do{Start();Write_Byte(Slave);Check_Ack();}while(F_Flag==1);
//第二步:寫(xiě)起始地址->檢查應(yīng)答位
do{Write_Byte(Address<<4);Check_Ack();}while(F_Flag==1);
//第三步:開(kāi)始信號(hào)->寫(xiě)IIC器件地址+1(表示讀)->檢查應(yīng)答位
do{Start();Write_Byte(Slave+1);Check_Ack();}while(F_Flag==1);
//第四步:讀N字節(jié),每讀完一字節(jié)發(fā)一個(gè)Ack應(yīng)答,最后一字節(jié)發(fā)Nack
for(x=0;x{data0=Read_Byte();*Array=data0;Array++;
if(x<(Number-1)){Ack();}}
Nack();
//第五步:發(fā)停止信號(hào),結(jié)束讀操作
Stop();
}

//***************************按鍵處理程序**************************//
//說(shuō)明:為簡(jiǎn)化程序設(shè)計(jì),此程序不保證輸入的時(shí)間數(shù)據(jù)的合理性。
voidKey_Process(void)
{uchartemp1[17]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
//輸入數(shù)據(jù)格式依次為年、月、日、星期、小時(shí)和分鐘
uchartemp2[7]={0,0,0,0,0,0,0,};
ucharteMP3[3]={0,0,0xff};
//輸入數(shù)據(jù)格式依次為小時(shí)和分鐘
ucharKey;
uchar*Flag;
uchari;
Flag=temp1;
if(PIND!=0xff)
{DelayMs(20);//延時(shí)去抖
if(PIND!=0xff)
Key=PINB;
if(Key==0xfe)//"時(shí)間設(shè)置"鍵按下
{temp1[0]|=0x80;//年高位設(shè)置提示
while(!Enter_Flag)//直到按下確定鍵方停止
{for(i=0;i<50;i++)
Display(temp1);//顯示和延時(shí)
Key=~PIND;
switch(Key)
{case0x04://"+"鍵處理
(*Flag)++;
if(((*Flag)&0x7f)==10)*Flag=0|0x80;
break;
case0x08://"-"鍵處理
if(((*Flag)&0x7f)==0)*Flag=10|0x80;
(*Flag)--;
break;
case0x10://"下一位"鍵處理
Flag++;
(*(Flag-1))&=0x7f;//上一位去掉小數(shù)點(diǎn)顯示
(*Flag)|=0x80;//當(dāng)前位加上小數(shù)點(diǎn)顯示
if(Flag==temp1+13)
{Flag=temp1;
(*Flag)|=0x80;
(*(Flag+13))&=0x7f;}
break;
case0x20://"上一位"鍵處理
if(Flag==temp1)
{(*Flag)&=0x7f;
Flag=temp1+13;
(*Flag)|=0x80;}
elseFlag--;
(*Flag)|=0x80;//當(dāng)前位加上小數(shù)點(diǎn)顯示
(*(Flag+1))&=0x7f;//下一位去掉點(diǎn)小數(shù)點(diǎn)顯示
break;
case0x40:Enter_Flag=1;break;//"確定"鍵處理
//case0x80:Enter_Flag=1;break;//測(cè)試用
default:break;}

}
Enter_Flag=0;//按鍵狀態(tài)恢復(fù)
temp2[0]=0x00;//秒,默認(rèn)從00開(kāi)始計(jì)時(shí)
temp2[1]=(temp1[11]<<4)|temp1[12];//分
temp2[2]=(temp1[9]<<4)|temp1[10];//時(shí)
temp2[3]=temp1[8];//周
temp2[4]=(temp1[6]<<4)|temp1[7];//日
temp2[5]=(temp1[4]<<4)|temp1[5];//月
temp2[6]=(temp1[2]<<4)|temp1[3];//年
Write_Nbyte(SD2303,0x00,temp2,7);//初始化設(shè)定時(shí)間
}
if(Key==0xfd)//"鬧鈴設(shè)置"鍵按下
{temp1[9]|=0x80;
Flag=temp1+9;//定時(shí)小時(shí)高位設(shè)置提示
while(!Enter_Flag)//直到按下確定鍵方停止
{for(i=0;i<50;i++)
Display(temp1);
Key=~PINB;
switch(Key)
{case0x04://"+"按鍵處理
(*Flag)++;
if(((*Flag)&0x7f)==10)*Flag=0|0x80;
break;
case0x08://"-"按鍵處理
if(((*Flag)&0x7f)==0)*Flag=10|0x80;
(*Flag)--;
break;
case0x10://"下一位"按鍵處理
Flag++;
(*(Flag-1))&=0x7f;//上一位去掉小數(shù)點(diǎn)顯示
(*Flag)|=0x80;//當(dāng)前位加上小數(shù)點(diǎn)顯示
if(Flag==temp1+13)
{(*Flag)&=0x7f;
Flag=temp1+9;
(*Flag)|=0x80;}
break;
case0x20://"上一位"按鍵處理
if(Flag==temp1+9)
{(*Flag)&=0x7f;
Flag=temp1+13;
(*Flag)|=0x80;}
elseFlag--;
(*Flag)|=0x80;//當(dāng)前位加上小數(shù)點(diǎn)顯示
(*(Flag+1))&=0x7f;//下一位去掉小數(shù)點(diǎn)顯示
break;
case0x40:Enter_Flag=1;break;//"確定"鍵處理
//case0x80:Enter_Flag=1;break;//測(cè)試用
default:break;}

}
Enter_Flag=0;
temp3[0]=((temp1[11]<<4)|temp1[12])&0x7f;//分?jǐn)?shù)據(jù)處理,去掉小數(shù)點(diǎn)
temp3[1]=((temp1[9]<<4)|temp1[10])&0x7f;//時(shí)數(shù)據(jù)處理,去掉小數(shù)點(diǎn)
if((temp3[0]<0x60)&&(temp3[1]<0x24))//判斷是否為合法時(shí)間
{Write_1byte(SD2303,0x0e,0b10110000);//開(kāi)啟鬧鈴使能
Write_1byte(SD2303,0x0f,0b00101000);//開(kāi)始中斷使能
Write_Nbyte(SD2303,0x08,temp3,3);}//初始化鬧鈴設(shè)置
else
Write_1byte(SD2303,0x0e,0b00110000);//取消鬧鈴功能
}
}
}


//***************************DS1722函數(shù)開(kāi)始************************//

voidConvert(ucharp1,uchar*p2)
{uchartemp;
if(p1&0x80)
{p2[13]=10;//零下溫度用10表示
p1=0xff-p1;}//溫度絕對(duì)值
else
p2[13]=11;//零上溫度用11表示
p2[14]=p1/10;//溫度十位
p2[15]=p1-p2[14]*10;//溫度個(gè)位
}

//***************************通過(guò)SPI接口寫(xiě)數(shù)據(jù)函數(shù)*****************//
//函數(shù)參數(shù)說(shuō)明:
//Address:DS1722寄存器地址
//Data:寫(xiě)入的數(shù)據(jù)
voidDSWrite_Byte(ucharAddress,ucharData)
{ucharclear;
PORTB=PORTB|0x10;//使能SPI器件
SPDR=Address;
while(!(SPSR&0x80)){;}
clear=SPSR;
clear=SPDR;
SPDR=Data;
while(!(SPSR&0x80)){;}
clear=SPSR;
clear=SPDR;
PORTB=PORTB&0xef;
}


//***************************通過(guò)SPI接口讀數(shù)據(jù)函數(shù)*****************//
//函數(shù)參數(shù)說(shuō)明:
//Address:DS1722寄存器地址
//返回值:讀取的溫度數(shù)據(jù)
ucharDSRead_Byte(ucharAddress)
{ucharclear;
ucharData;
PORTB=PORTB|0x10;
SPDR=Address;
while(!(SPSR&0x80)){;}
clear=SPSR;
clear=SPDR;
SPDR=Address;//發(fā)空數(shù)據(jù)
while(!(SPSR&0x80)){;}
clear=SPSR;
Data=SPDR;
PORTB=PORTB&0xef;
return(Data);
}

voidmain(void)
{uchari;
uchartime[16]={2,0,0,4,1,2,2,7,1,1,7,3,0,0,0,0};
ucharSet_Time[7]={0x50,0x30,0x20,0x03,0x05,0x01,0x05};
//初始化時(shí)間2005-01-05Wed20-30-50
ucharSD,DS;
ucharSD2303_Controller1=0x00;//禁止中斷
ucharSD2303_Controller2=0x20;//時(shí)間格式:24小時(shí)制
DDRA=0xff;//A口輸出
DDRC=0xff;//C口輸出
DDRD=0x80;//D口最高位輸出,其他帶上拉輸入
PORTD=0x7F;
DDRB=0xF3;//B口帶第2、3位帶上拉輸入,其他輸出
PORTB=0xF3;
Write_1byte(SD2303,0x0e,SD2303_Controller1);//寫(xiě)控制字
Write_1byte(SD2303,0x0f,SD2303_Controller2);//寫(xiě)控制字
Write_Nbyte(SD2303,0x00,Set_Time,7);//初始化時(shí)間
SPCR=0b01011100;
DSWrite_Byte(0x80,0xf0);//DS17228位分辨率自由轉(zhuǎn)換模式
while(1)
{Key_Process();//按鍵處理
Read_Nbyte(SD2303,0x00,Set_Time,7);//讀取時(shí)間
time[2]=Set_Time[6]>>4;//年高位;
time[3]=Set_Time[6]&0x0f;//年低位;
time[4]=Set_Time[5]>>4;//月高位;
time[5]=Set_Time[5]&0x0f;//月低位;
time[6]=Set_Time[4]>>4;//日高位;
time[7]=Set_Time[4]&0x0f;//日低位;
time[8]=Set_Time[3];//星期;
time[9]=Set_Time[2]>>4;//時(shí)高位;
time[10]=Set_Time[2]&0x0f;//時(shí)低位;
time[11]=Set_Time[1]>>4;//分高位;
time[12]=Set_Time[1]&0x0f;//分低位;
time[13]=Set_Time[0]>>4;//秒高位;
time[14]=Set_Time[0]&0x0f;//秒低位;
Read_Nbyte(SD2303,0x0f,&SD,1);//讀取中斷標(biāo)志位
if(SD&0x02)PORTD=PORTD|0x80;//響鈴1分鐘
elsePORTD=PORTD&0x7F;//關(guān)閉鬧鈴
DS=DSRead_Byte(0x02);//讀取溫度值
Convert(DS,time);
Display(time);//時(shí)間顯示
}
}

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專(zhuān)欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車(chē)的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

倫敦2024年8月29日 /美通社/ -- 英國(guó)汽車(chē)技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車(chē)工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車(chē)。 SODA V工具的開(kāi)發(fā)耗時(shí)1.5...

關(guān)鍵字: 汽車(chē) 人工智能 智能驅(qū)動(dòng) BSP

北京2024年8月28日 /美通社/ -- 越來(lái)越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時(shí)企業(yè)卻面臨越來(lái)越多業(yè)務(wù)中斷的風(fēng)險(xiǎn),如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報(bào)道,騰訊和網(wǎng)易近期正在縮減他們對(duì)日本游戲市場(chǎng)的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)開(kāi)幕式在貴陽(yáng)舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國(guó)國(guó)際大數(shù)據(jù)產(chǎn)業(yè)博覽會(huì)上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱(chēng),數(shù)字世界的話語(yǔ)權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對(duì)環(huán)境變化,經(jīng)營(yíng)業(yè)績(jī)穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤(rùn)率延續(xù)升勢(shì) 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長(zhǎng) 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競(jìng)爭(zhēng)力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競(jìng)爭(zhēng)優(yōu)勢(shì)...

關(guān)鍵字: 通信 BSP 電信運(yùn)營(yíng)商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺(tái)與中國(guó)電影電視技術(shù)學(xué)會(huì)聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會(huì)上宣布正式成立。 活動(dòng)現(xiàn)場(chǎng) NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長(zhǎng)三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會(huì)上,軟通動(dòng)力信息技術(shù)(集團(tuán))股份有限公司(以下簡(jiǎn)稱(chēng)"軟通動(dòng)力")與長(zhǎng)三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉