基於微控制器的萬年曆帶鬧鐘和溫度顯示。元器件AT89C51與D

2021-08-20 22:09:24 字數 5803 閱讀 2130

1樓:豐寧左哥

你將口改一下就行

#include

#include

#define uchar unsigned char

#define uint unsigned int

sbit lcdrs=p2^2;

sbit lcdrw=p2^3;

sbit lcden=p2^4;

sbit ce=p1^2;

sbit io=p1^1;

sbit sclk=p1^0;

sbit dq=p1^7;

sbit s1=p3^1; // 功能模式選擇鍵

sbit s2=p3^2; // 加一鍵

sbit s3=p3^3; // 減一鍵

uchar code tab="0123456789";

uchar code disp_start0=" please insert";

uchar code disp_start1=" ds18b20";

uchar code disp_init1="20**-**-** *";

uchar code disp_init2="??:??:??";

uchar code ditab[16]= //溫度小數部分用查表法

;uchar code weektab=;

uchar timbuf=;

uchar tembuf=;

uchar nian,zhou,yue,ri,shi,fen,miao;

uchar nian_h,nian_l,yue_h,yue_l,ri_h,ri_l,

shi_h,shi_l,fen_h,fen_l,miao_h,miao_l;

uchar s1num;

uint wendu; //16位溫度值

uchar wendu_h,wendu_l; //溫度值的高低8位

bit sw=0;

void delay(uint z) // 當z=1時,延時1ms

void delayus(uchar t) //當t=1時,延時11us

void init_18b20() //18b20初始化

delayus(45);

flag=~dq;

}dq=1;

}void write1820_byte(uchar dat) // 寫一個位元組

dq=1;

delayus(1);

}uchar read1820_byte() //讀一個位元組

dq=1;

return (temp);

}void write_com(uchar com) // 液晶寫命令函式

void write_date(uchar date) // 液晶寫資料函式

void display(uchar hang,uchar lie,uchar date) //向某一行、某一列寫一個資料

void lcd_init() // 液晶初始化

void lcd_dispstart() //開機液晶顯示介面

void lcd_dispinit1() // 液晶初始顯示

void write1302_byte(uchar temp) //逐位向1302寫一個位元組

}uchar read1302_byte() // 逐位從1302讀一個位元組

return temp;

}void write_1302(uchar addr,uchar dat) //向指定地址寫一個資料

uchar read_1302(uchar addr) //從指定地址讀一個資料

/*void time_disp(uchar add,char date) // 時間在液晶的顯示程式

*/void read_time()//從1302中讀出時間資料並轉換為ascii碼存入timbuf陣列中

void init_1302()

uint read_wendu()

/****************溫度資料處理函式************************/

//二進位制高位元組的低半位元組和低位元組的高半位元組組成一位元組,這個

//位元組的二進位制轉換為十進位制後,就是溫度值的百、十、個位值,而剩

//下的低位元組的低半位元組轉化成十進位制後,就是溫度值的小數部分

void work_temp(uint tem)

temp=tem&0x0f; // 取小數部分的值

tembuf[0]=ditab[temp]+0x30; // 存入小數部分顯示值

temp=tem>>4; // 取中間八位,即整數部分的值

tembuf[3]=temp/100+0x30; // 取百位資料暫存

tembuf[2]=temp%100/10+0x30; // 取後兩位資料暫存

tembuf[1]=temp%100%10+0x30;

if(tembuf[3]=='0')

}if(n)

tembuf[4]='-'; //負溫度時最高位顯示"-"

else

tembuf[4]=' ';

}void lcd_display() //液晶顯示

void keyscan() // 鍵盤掃描

if(s1num==2)

if(s1num==3)

if(s1num==4)

if(s1num==5)

if(s1num==6)

if(s1num==7)

if(s1num==8)}}

if(s1num!=0)

miao=(miao_h<<4)|miao_l;

write_1302(0x80,miao|0x80);//保持振盪器停止狀態

write_com(0xc0+6);

write_date(tab[(miao&0x7f)>>4]);

write_date(tab[miao&0x0f]);

write_com(0xc0+6);

}if(s1num==2)

fen=(fen_h<<4)|fen_l;

write_1302(0x82,fen);

write_com(0xc0+3);

write_date(tab[fen_h]);

write_date(tab[fen_l]);

write_com(0xc0+3);

}if(s1num==3)

}if(shi_l==10)

shi=(shi_h<<4)|shi_l;

write_1302(0x84,shi);

write_com(0xc0+0);

write_date(tab[shi_h]);

write_date(tab[shi_l]);

write_com(0xc0+0);

}if(s1num==4)

write_1302(0x8a,zhou);

write_com(0x80+12);

write_date(weektab[zhou*3]);

write_date(weektab[zhou*3+1]);

write_date(weektab[zhou*3+2]);

write_com(0x80+12);

}if(s1num==5)

}if(ri_l==10)

ri=(ri_h<<4)|ri_l;

write_1302(0x86,ri);

write_com(0x80+8);

write_date(tab[ri_h]);

write_date(tab[ri_l]);

write_com(0x80+8);

}if(s1num==6)

}if(yue_l==10)

yue=(yue_h<<4)|yue_l;

write_1302(0x88,yue);

write_com(0x80+5);

write_date(tab[yue_h]);

write_date(tab[yue_l]);

write_com(0x80+5);

}if(s1num==7)

nian=(nian_h<<4)|nian_l;

write_1302(0x8c,nian);

write_com(0x80+2);

write_date(tab[nian_h]);

write_date(tab[nian_l]);

write_com(0x80+2); }}

}if(s3==0)

miao=(miao_h<<4)|miao_l;

write_1302(0x80,miao|0x80);//保持振盪器停止狀態

write_com(0xc0+6);

write_date(tab[(miao&0x7f)>>4]);

write_date(tab[miao&0x0f]);

write_com(0xc0+6);

}if(s1num==2)

fen=(fen_h<<4)|fen_l;

write_1302(0x82,fen);

write_com(0xc0+3);

write_date(tab[fen_h]);

write_date(tab[fen_l]);

write_com(0xc0+3);

}if(s1num==3) }

shi=(shi_h<<4)|shi_l;

write_1302(0x84,shi);

write_com(0xc0+0);

write_date(tab[shi_h]);

write_date(tab[shi_l]);

write_com(0xc0+0);

}if(s1num==4)

write_1302(0x8a,zhou);

write_com(0x80+12);

write_date(weektab[zhou*3]);

write_date(weektab[zhou*3+1]);

write_date(weektab[zhou*3+2]);

write_com(0x80+12);

}if(s1num==5)

}if(ri_l==0xff)

ri=(ri_h<<4)|ri_l;

write_1302(0x86,ri);

write_com(0x80+8);

write_date(tab[ri_h]);

write_date(tab[ri_l]);

write_com(0x80+8);

}if(s1num==6)

}if(yue_l==0xff)

yue=(yue_h<<4)|yue_l;

write_1302(0x88,yue);

write_com(0x80+5);

write_date(tab[yue_h]);

write_date(tab[yue_l]);

write_com(0x80+5);

}if(s1num==7)

nian=(nian_h<<4)|nian_l;

write_1302(0x8c,nian);

write_com(0x80+2);

write_date(tab[nian_h]);

write_date(tab[nian_l]);

write_com(0x80+2); }}

}}}void main()

keyscan();}}

我是微控制器初學者,想用微控制器做萬年曆,希望高手指點一下

微控制器bai,顯示器件 最好用lcd,省電du 買一bai 塊開發板,上面有例程du,電路也都是現 zhi成的,dao我做的那款開發板就是以版一個萬年曆 權為設計目標而系統的講解開發板上得所有功能的。按鍵控制萬年曆數碼管顯示,紅外遙控器控制萬年曆1602顯示的。自己要是沒有基礎做的話,很費時間的。...

用微控制器做的萬年曆用595驅動數碼管,顯示不穩定有幾段老閃,是怎麼回事?要加鎖存器嗎

閃是因為你延時太長 動態顯示是根據人眼的滯留效益 頻率要達到1s 24次才能看到不閃 當然 頻率越高 顯示越穩定!微控制器做的數碼管萬年曆顯示時抖動 你好,很 bai高興為你解du答 74hc164 14 vcc 74hc164 7 gnd 74hc164 9 mr 接 vcc 74hc164 1 ...

萬年曆宜掛在客廳的什麼位置萬年曆掛在客廳什麼位置合適

主要位置 1.可擺放或懸掛於朱雀方,因為朱雀方即是前方,前方本屬動者。2.可擺放或懸掛於青龍方,因為青龍方為吉方,所以客廳的左方也宜放時鐘。3.不要擺放或懸掛於白虎方,因為白虎方為凶方,所以客廳的右方不宜放時鐘。4.不要擺放或懸掛於玄武方,因為玄武方為後方,宜靜不宜動。5.沙發的上方不宜懸掛時鐘,否...