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

2021-08-20 22:09:23 字數 5803 閱讀 4750

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();}}

想用微控制器設計萬年曆,如何實現陽曆到農曆的轉換?最好是給

你好!1 微控制器什麼型號 2 液晶用什麼的?字元還是漢字?3 程式是c語言寫嗎 4 時鐘晶片用的什麼 5 如果是實物,發一下原理圖 怎樣製作萬年曆微控制器 今天碰到了n個白痴問題。萬年曆是能夠顯示年月日 二十四節氣 農曆之類的東西,微控制器是一塊晶片。萬年曆可以用微控制器來做,但是我真不知道 萬年...

萬年曆的動土是什麼意思,萬年曆中破土和動土是一樣的意思嗎?

動土 就是 破土動工 的意思。就是說,這天可以破土動工,搞土木建設。因為有時候太歲當值,動土就有災難。你相信這些嗎?反正我是不信迷信的。萬年曆中 破土 和 動土 是一樣的意思嗎?萬年曆中 破土 和 動土 的意思是不一樣的。破 僅指埋葬用的破土,與一般建築房屋的 動土 不同。即 破土 屬陰宅,動土 指...

基於51微控制器制作萬年曆,用數碼管,定時器,不用時鐘晶片,不用液晶,怎麼做?求大神解,原理圖和C程式

基於51微控制器制作bai 萬年曆,用兩du個8位一體的共陰zhi數碼管,顯dao示日期和時專間。數碼管位選用兩片屬74hc138,便於動態掃描顯示,又節省引腳。用3個按鍵調時,k1為選擇調時狀態,k2為加1鍵,k3為減1鍵。圖如下 51微控制器做的數碼管萬年曆,用定時器0控制時間,通過串列埠通訊可...