?? 3208_v4.01.00.c
字號:
WriteOneChar(0xCC); // 跳過讀序號列號的操作
WriteOneChar(0x44); // 啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
a=ReadOneChar(); //讀低8位
b=ReadOneChar(); //讀高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍輸出并四舍五入
return(t);
}
/******************************************************************************/
uchar printTemperature(void){//寫一個字節(DS18B20驅動)
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature();//讀溫度并送顯
a=i/100;
b=i/10-a*10;
i = a*10 + b;
return i;
}
/**********************************************************************************************/
void Beeplll(void){//BELL 鬧鐘聲音(蜂鳴器驅動)
uint a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=2500;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(10);//音調設置延時
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out; //
Delay(6);//音調設置延時
}
Bell_Out = 1;
}
/**********************************************************************************************/
void Beep(void){//BELL-揚聲器--整點報時(蜂鳴器驅動)
uchar a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=60;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(100);//音調設置延時
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(80);//
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(30);//
}
}
/**********************************************************************************************/
void Beep_set(void){//BELL -揚聲器--確定設置(蜂鳴器驅動)
uchar a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=250;a>0;a--){//第一個聲音的長度
Bell_Out = ~Bell_Out;//取反揚聲器驅動口,以產生音頻
Delay(20);//音調設置延時
}
for(a=100;a>0;a--){//同上
Bell_Out = ~Bell_Out;
Delay(80);//
}
}
/**********************************************************************************************/
void Beep_key(void){//-揚聲器--按鍵音(蜂鳴器驅動)
uchar a;//定義變量用于發聲的長度設置
Led_EA = 1;//關列顯示驅動,防止屏幕出現亂碼
for(a=100;a>0;a--){//聲音的長度
Bell_Out = ~Bell_Out;
Delay(50);//音調設置延時
}
}
/**********************************************************************************************/
void clock_out(unsigned char dd){ //-1302驅動程序(DS1302驅動)
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/**********************************************************************************************/
unsigned char clock_in(void){ //-DS1302寫入字節(DS1302驅動)
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/**********************************************************************************************/
uchar read_clock(uchar ord){ //-DS1302讀數據(DS1302驅動)
uchar dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/**********************************************************************************************/
void write_clock(uchar ord, uchar dd){ //-DS1302寫數據(DS1302驅動)
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/**********************************************************************************************/
void Set_time(unsigned char sel,unsigned char a){ //根據選擇調整的相應項目加1并寫入DS1302-調時用加1程序
signed char address,item;
signed char max,mini;
//if(sel==7) {address=0x80; max=0;mini=0;} //秒7
if(sel==6) {address=0x82; max=59;mini=0;} //分鐘6
if(sel==5) {address=0x84; max=23;mini=0;} //小時5
if(sel==3) {address=0x86; max=31;mini=1;} //日3
if(sel==2) {address=0x88; max=12;mini=1;} //月2
if(sel==1) {address=0x8c; max=99; mini=0;} //年1
if(sel==4) {address=0x8a; max=7;mini=1;} //星期4
if(sel==200) {address=0xc2+a*6; max=6;mini=0;} //MODE
if(sel==201) {address=0xc2+a*6+2; max=23;mini=0;} //星期4
if(sel==202) {address=0xc2+a*6+4; max=59;mini=0;} //星期4
//讀取1302某地址上的數值轉換成10進制賦給item
item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
if(Add_Key == 0){ key_off ();//等待鍵放開
item++;//數值加1
Beep_key();//調時提示音
}
if(Add2_Key == 0){ key_off ();//等待鍵放開
item--;//數值減1
Beep_key();//調時提示音
}
if(item>max) item=mini;//查看數值有效范圍
if(item<mini) item=max;
write_clock(0x8e,0x00);//允許寫操作
write_clock(address,(item/10)*16+item%10);//轉換成16進制寫入1302
if(sel == 6 && (Add_Key == 0 || Add2_Key == 0)){
write_clock(0x80,0x00);//秒值=0
}
write_clock(0x8e,0x80);//寫保護,禁止寫操作
}
/**********************************************************************************************/
void Init_1302(void){//-設置1302的初始時間(2008年11月3日00時00分00秒星期一)
uchar f;
if(read_clock(0xc1) != 0xaa){
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x8c,0x08);//年
write_clock(0x8a,0x01);//星期
write_clock(0x88,0x11);//月
write_clock(0x86,0x03);//日
write_clock(0x84,0x00);//小時
write_clock(0x82,0x00);//分鐘
write_clock(0x80,0x00);//秒
write_clock(0x90,0xa5);//充電
write_clock(0xc0,0xaa);//寫入初始化標志RAM(第00個RAM位置)
for(f=0;f<60;f=f+2){//清除鬧鐘RAM位為0
write_clock(0xc2+f,0x00);
}
write_clock(0xc2+7*6+4,2);//設置顯示方式為流動顯示(2)
write_clock(0xc2+7*6,1);//設置流動速度為1
write_clock(0x8e,0x80);//禁止寫操作
}
}
/**********************************************************************************************/
//---V4.0
//說明:每個鬧鐘占用DS1302的三個RAM,從第5個RAM開始使用。
//每三個RAM中的第一個為當前鬧鐘的開關,第二個為設置的小時值,第三個為設置的分鐘值。
//其它三個RAM,0xc6用于鬧鐘總開關。0xc4報時的結束時間點。0xc2報時的開始時間點。
void search_time(void){//驗證鬧鐘時間到
uchar i;
write_clock(0x8e,0x00);//允許寫操作
for(i=1;i<7;i++){//鬧鐘改為6組,減少2組留出6個字節RAM
if( read_clock(0xc3+i*6) != 0 && //不為0則表示這項已經設置
read_clock(0xc3+i*6+2) == read_clock(0x85) && //小時對比
read_clock(0xc3+i*6+4) == read_clock(0x83)&& //分值對比
read_clock(0x81) < 0x09 && //這里保證秒值小于8秒動作,防止再操作
v != read_clock(0x83))//按鍵停止防再響
{
switch (read_clock(0xc3+i*6)){//顯示設置項的說明
case 1://只響一次,之后自動關閉[---V4.0即鬧一次后把當前鬧鐘開關給關閉,下次不再鬧]
BEEP_bit = 1;
write_clock(0xc2+i*6,0);
break;//
case 2://常開
BEEP_bit = 1;
break;//
case 3://周六、日除外
if(read_clock(0x8b) < 6){
BEEP_bit = 1;
}
break;//
case 4://周日除外
if(read_clock(0x8b) < 7){
BEEP_bit = 1;
}
break;//
case 5://周六、日響
if(read_clock(0x8b) > 5){
BEEP_bit = 1;
}
break;//
case 6://周日響
if(read_clock(0x8b) == 7){
BEEP_bit = 1;
}
break;//
}
v = read_clock(0x83);
}
}
write_clock(0x8e,0x80);//禁止寫操作
}
/**********************************************************************************************/
void Time_adj(void){//---V4.0功能,時間校準程序
unsigned char temp;
temp=read_clock(0xc3+7*6+2);
if((read_clock(0x85)==3)&&(read_clock(0x83)==0)&&(read_clock(0x81)==30)){//凌晨3點0分30秒時校正
if((temp>0)&&(temp<26)){ //減調整
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x80,30-(26-temp));//對秒進行調整。26-temp:讓本來+2.+1.+0.-25.-24...變成+2.+1.+0.-1.-2...
write_clock(0x8e,0x80);//禁止寫操作
}
if((temp>=26)&&(temp<52)){ //加調整
write_clock(0x8e,0x00);//允許寫操作
write_clock(0x80,30+(temp-26));//對秒進行調整
write_clock(0x8e,0x80);//禁止寫操作
}
}
}
/**********************************************************************************************/
void clearRAM (void){//寄存器清空函數-32個寄存器清空(0x00)
uchar a;//定義變量用于清空數據指針
for(a=0;a<32;a++){//指向32個寄存器
Ledplay[a] = 0;//將指向的寄存器清空
}
}
/**********************************************************************************************/
void clearBuf (void){//寄存器清空函數-80個寄存器清空(0x00)--V4.0
uchar a;//定義變量用于清空數據指針
for(a=0;a<80;a++){//指向80個寄存器
Ledplay_buf[a] = 0;//將指向的寄存器清空
}
}
/**********************************************************************************************/
void putin_buf (uchar u){//字符載入函數-將字符裝入顯示寄存器
uchar a = 0;//定義變量用于數據提取指針
do{
Ledplay_buf[bn+40] = no[u][a];//將二維數組中的一組數據放入顯示緩沖區
a++;//換下一個提取字節
bn++;//換下一個顯示緩沖字節
}
while(no[u][a] != 0);//當顯示數據為0時結束循環
bn++;//換下一個顯示緩沖字節
Ledplay_buf[bn+40] = 0;//顯示一列的空位,便于字符區分
}
/**********************************************************************************************/
void putin (uchar u){//字符載入函數-將字符裝入顯示寄存器
uchar a = 0;//定義變量用于數據提取指針
do{
Ledplay[bn] = no[u][a];//將二維數組中的一組數據放入顯示緩沖區
a++;//換下一個提取字節
bn++;//換下一個顯示緩沖字節
}
while(no[u][a] != 0);//當顯示數據為0時結束循環
bn++;//換下一個顯示緩沖字節
Ledplay[bn] = 0;//顯示一列的空位,便于字符區分
}
/**********************************************************************************************/
//將待顯緩沖區的前32字節轉移到顯示緩沖區中--V4.0
void disBuf_2_disRam(void){
uchar i;
for(i=0;i<32;i++){
Ledplay[i]=Ledplay_buf[i];
}
}
//***********************************************************************************************************
//此處是顯示顯示緩沖區內容的函數,只有這里才有權力涉及到顯示緩沖區的讀取!!!
//暫時設置部分的顯示不改。
//***********************************************************************************************************
void display (void){//點陣屏驅動函數-32*8點陣顯示驅動
uchar ac,aa;//定義兩個數據變量
aa = 7;//指定前16個數據的提取
for(ac=0x28;ac<0x30;ac++){//掃描前兩塊LED屏
Led_E = ac;//用ac值驅動使能列信號
Led_24 = DL(Ledplay[aa+8]);//DL(Ledplay[aa+8]);//將顯示寄存器數據寫入2、4屏
Led_13 = Ledplay[aa];//將顯示寄存器數據寫入1、3屏
Delay(60);//延時1.2微秒[60]
Led_E = 0xff;
Led_13 = 0;//數據總線清空
Led_24 = 0;
aa--;//aa減1,換下一列顯示
}
aa = 23;//指定后16個數據的提取
for(ac=0x20;ac<0x28;ac++){//掃描后兩塊LED屏(由于P1.5接揚聲器所以高4位為2,旨在關聲音)
Led_E = ac;//用ac值驅動使能列信號
Led_24 = DL(Ledplay[aa+8]);//將顯示寄存器數據寫入2、4屏
Led_13 = Ledplay[aa];//將顯示寄存器數據寫入1、3屏
Delay(60);//延時1.2微秒 [60]
Led_E = 0xff;
Led_13 = 0;//數據總線清空
Led_24 = 0;
aa--;//aa減1,換下一列顯示
}
Led_E = 0xff;
}
/**********************************************************************************************/
void display_delay(uchar i){//循環顯示i次以達到延時功能
while(i){
display();
i--;
}
}
/**********************************************************************************************/
void Load_date(void){ //日期組合與顯示
bn = 0;//顯示位累加寄存器清零(從頭開始寫入顯示緩沖區)
if(read_clock(0x89)/16 != 0){//為0時消隱
putin_buf(read_clock(0x89)/16);//顯示月值(十位,為0時消隱)/*將數據存入待顯區后四十字節。*/
}
putin_buf(read_clock(0x89)%16);//顯示月值(個位)
putin_buf(21);//顯示"月"
if(read_clock(0x87)/16 != 0){//為0時消隱
putin_buf(read_clock(0x87)/16);//顯示日值(十位,為0時消隱)
}
putin_buf(read_clock(0x87)%16);//顯示日值(個位)
putin_buf(22);//顯示"日"
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -