可按照程序接線
51單片機(jī)顯示時(shí)間(可調(diào)整)(DS1302時(shí)鐘+12864LCD顯示)
仿真原理圖如下:
仿真
單片機(jī)源程序如下:
- /****************************************/
- /* 帶溫度顯示的電子日歷 */
- /****************************************/
- #include<reg51.h>
- #include<intrins.h>
- #include<string.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit DQ=P2^7;
- sbit CS1=P2^1; //定義選擇芯片左半屏信號(hào)
- sbit CS2=P2^2; //定義選擇芯片右半屏信號(hào)
- sbit DI=P2^5; //定義選擇顯示類(lèi)型
- sbit RW=P2^4; //定義讀寫(xiě)信號(hào)
- sbit E=P2^3; //定義數(shù)據(jù)鎖存信號(hào)
- sbit IO=P1^0; //DS1302數(shù)據(jù)線
- sbit CLK=P1^1; //DS1302時(shí)鐘線
- sbit RST=P1^2; //DS1302復(fù)位線
- sbit s1=P3^0;
- sbit s2=P3^1;
- sbit s3=P3^2;
- uchar Time_Buffer[7]; //日期緩存,0-6依次為秒、分、時(shí)、日、月、周日、年
- uint Temp,Temp1;
- bit Temp_Flag;
- uchar s1num;
- uchar flag_year=0,flag_moon=0,flag_day=0,flag_hour=0,flag_min=0,flag_sec=0,flag_week=0;
- uchar tempa;
- uchar t0_num;
- void delayms(uint xms);
- void Write_1302(uchar addr,uchar dat);
- void keyscan();
- void time_adj();
- /*--年,月,日,星期,時(shí),分,秒,漢字點(diǎn)陣(16*16)--*/
- uchar code Date_Time_Words[]=
- {
- 0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00,//年
- 0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
- 0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月
- 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日
- 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星
- 0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
- 0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期
- 0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
- 0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//時(shí)
- 0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
- 0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分
- 0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
- 0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒
- 0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00
- } ;
- //星期幾的漢字點(diǎn)陣
- uchar code Weekday_Words[]=
- {
- 0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日
- 0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
- 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x80,0x00,//一
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二
- 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
- 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三
- 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
- 0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四
- 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
- 0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五
- 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,
- 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六
- 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00
- };
- //溫度顯示漢字點(diǎn)陣
- uchar code Templt[]=
- {
- 0x10,0x22,0x64,0x0C,0x80,0x00,0xFE,0x92,0x92,0x92,0x92,0x92,0xFF,0x02,0x00,0x00,//溫
- 0x04,0x04,0xFE,0x01,0x40,0x7E,0x42,0x42,0x7E,0x42,0x7E,0x42,0x42,0x7E,0x40,0x00,
- 0x00,0x00,0xFC,0x24,0x24,0x24,0xFC,0xA5,0xA6,0xA4,0xFC,0x24,0x34,0x26,0x04,0x00,//度
- 0x40,0x20,0x9F,0x80,0x42,0x42,0x26,0x2A,0x12,0x2A,0x26,0x42,0x40,0xC0,0x40,0x00,
- 0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//:
- 0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x02,0x05,0xE2,0x18,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x04,0x1E,0x00,0x00,//℃
- 0x00,0x00,0x00,0x07,0x18,0x20,0x40,0x40,0x40,0x40,0x40,0x40,0x20,0x18,0x00,0x00
- };
- //半角數(shù)字點(diǎn)陣
- uchar code Digits[]=
- {
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,//0
- 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,//1
- 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,//2
- 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,//3
- 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,//4
- 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,//5
- 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,//6
- 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,//7
- 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,//8
- 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,//9
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00,//.
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 //' '
- };
- /*--屏幕顯示--*/
- void left()//左半屏顯示
- {
- CS1=1;
- CS2=0;
- }
- void right()//右半屏顯示
- {
- CS1=0;
- CS2=1;
- }
- /*--判斷LCD是否繁忙--*/
- void LCD_Check_Busy()
- {
- do
- {
- E=0;
- DI=0;
- RW=1;
- P0=0xff;
- E=1;
- _nop_();
- E=0;
- }
- while(P0&0x80);//P0.7口
- }
- /*--向LCD發(fā)送命令--*/
- void LCD_Write_Command(uchar c)
- {
- LCD_Check_Busy();
- P0=0xFF ;
- RW=0;
- DI=0;
- P0=c ;
- E=1;
- E=0;
- }
- /*--向LCD發(fā)送數(shù)據(jù)--*/
- void LCD_Write_Date(uchar d)
- {
- LCD_Check_Busy();
- P0=0xFF ;
- RW=0;
- DI=1;
- E=1;
- _nop_();
- P0=d ;
- E=0;
- _nop_();
- }
- /*--設(shè)置初始頁(yè)--*/
- void page_first(uchar p)
- {
- uchar i=p;
- p=i|0xb8;
- LCD_Check_Busy();
- LCD_Write_Command(p);
- }
- /*--設(shè)置初始列--*/
- void col_first(uchar c)
- {
- uchar i=c;
- c=i|0x40;
- LCD_Check_Busy();
- LCD_Write_Command(c);
- }
- /*--任意位置顯示漢字--*/
- void Display_Word(uchar page,uchar col,uchar*s)
- {
- uchar i,j;
- page_first(page);//上半部
- col_first(col);
- for(i=0;i<16;i++)
- {
- LCD_Write_Date(*s);
- s++;
- }
- page_first(page+1);//下半部
- col_first(col);
- for(j=0;j<16;j++)
- {
- LCD_Write_Date(*s);
- s++;
- }
- }
- /*--任意位置顯示字符--*/
- void Display_Char(uchar page,uchar col,uchar*s)
- {
- uchar i,j;
- page_first(page);//上半部
- col_first(col);
- for(i=0;i<8;i++)
- {
- LCD_Write_Date(*s);
- s++;
- }
- page_first(page+1);//下半部
- col_first(col);
- for(j=0;j<8;j++)
- {
- LCD_Write_Date(*s);
- s++;
- }
- }
- /*--初始化LCD --*/
- void LCD_initialize()
- {
- CS1=1;
- CS2=1;
- LCD_Write_Command(0x38); //8位形式,2行字符
- LCD_Write_Command(0x0F); //開(kāi)顯示
- LCD_Write_Command(0x01); //清屏
- LCD_Write_Command(0x06); //畫(huà)面不動(dòng)光標(biāo)右移
- LCD_Write_Command(0xC0);//設(shè)置起始行
- }
- /*--向DS1302寫(xiě)入一字節(jié)--*/
- void Write_A_Byte_To_1302(uchar x)
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- IO=x&0x01; CLK=1;CLK=0;x>>=1;
- }
- }
- /*--從DS1302讀取一字節(jié)--*/
- uchar Receive_A_Byte_From_1302()
- {
- uchar i,b=0x00;
- for(i=0;i<8;i++)
- {
- b |= _crol_((uchar)IO,i);
- CLK=1;CLK=0;
- }
- return b/16*10+b%16;
- }
- /*--從DS1302指定位置讀數(shù)據(jù)--*/
- uchar Read_1302(uchar addr)
- {
- uchar dat;
- RST = 0;CLK=0;RST=1;
- Write_A_Byte_To_1302(addr);
- dat = Receive_A_Byte_From_1302();
- CLK=1;RST=0;
- return dat;
- }
- /*--向DS1302某地址寫(xiě)入數(shù)據(jù)--*/
- void Write_1302(uchar addr,uchar dat)
- {
- CLK=0; RST=0;
- Write_A_Byte_To_1302(addr);
- Write_A_Byte_To_1302(dat);
- CLK=0;RST=0;
- }
- /*--讀取當(dāng)前日期時(shí)間--*/
- void Get_Time()
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- Time_Buffer[i]=Read_1302(0x81+2*i);
- }
- }
- /*--定時(shí)器0每秒刷新LCD顯示--*/
- void T0_INT() interrupt 1
- {
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- t0_num++;
- left();//顯示左半屏
- if(flag_year==0)
- {
- Display_Char(0,16,Digits+ Time_Buffer [6]/10*16);//顯示年的十位數(shù),占8列
- Display_Char(0,24,Digits+ Time_Buffer [6]%10*16); //顯示年的個(gè)位數(shù),占8列
- }
- else
- {
- if(t0_num<=5)
- {
- Display_Char(0,16,Digits+ Time_Buffer [6]/10*16);//顯示年的十位數(shù),占8列
- Display_Char(0,24,Digits+ Time_Buffer [6]%10*16); //顯示年的個(gè)位數(shù),占8列
- }
- if(t0_num>5&&t0_num<=10)
- {
- if(t0_num==10)t0_num=0;
- Display_Char(0,16,Digits+ Digits[11]/10*16);//顯示年的十位數(shù),占8列
- Display_Char(0,24,Digits+ Digits[11]%10*16); //顯示年的個(gè)位數(shù),占8列
- }
- }
- Display_Char(0,48,Digits+ Time_Buffer [4]/10*16); //顯示月的十位數(shù),占8列
- Display_Char(0,56,Digits+ Time_Buffer [4]%10*16); //顯示月的個(gè)位數(shù),占8列
- right();//顯示右半屏
- Display_Char(0,80,Digits+ Time_Buffer [3]/10*16); //顯示日的十位數(shù),占8列
- Display_Char(0,88,Digits+ Time_Buffer [3]%10*16); //顯示日的個(gè)位數(shù),占8列
- left();//顯示左半屏
- Display_Char(2,16,Digits+ Time_Buffer [2]/10*16); //顯示時(shí)的十位數(shù),占8列
- Display_Char(2,24,Digits+ Time_Buffer [2]%10*16); //顯示時(shí)的個(gè)位數(shù),占8列
- left();//顯示左半屏
- Display_Char(2,48,Digits+ Time_Buffer [1]/10*16); //顯示分的十位數(shù),占8列
- Display_Char(2,56,Digits+ Time_Buffer [1]%10*16); //顯示分的個(gè)位數(shù),占8列
- right();//顯示右半屏,秒顯示在右半屏部分
- Display_Char(2,80,Digits+ Time_Buffer [0]/10*16); //顯示秒的十位數(shù),占8列
- Display_Char(2,88,Digits+ Time_Buffer [0]%10*16); //顯示秒的個(gè)位數(shù),占8列
- right();//顯示右半屏
- Display_Word(4,64,Weekday_Words+( Time_Buffer [5]-1)*32);//顯示周日,占16列
- left();//顯示左半屏,溫度
- Display_Char(6,48,Digits+ Temp1/100*16); //顯示溫度十位數(shù),占8列
- Display_Char(6,56,Digits+ Temp1%100/10*16); //顯示溫度個(gè)位數(shù),占8列
- right();//顯示右半屏
- Display_Char(6,64,Digits+ 10*16); //顯示溫度小數(shù)點(diǎn),占8列
- Display_Char(6,72,Digits+ Temp%10*16); //顯示溫度十分位數(shù),占8列
- }
- /*--定時(shí)器0初始化程序--*/
- void Time0_initialize()
- {
- EA=1;//開(kāi)總中斷
- ET0=1;//開(kāi)定時(shí)/計(jì)數(shù)器0中斷
- TMOD=0x01;//設(shè)置工作方式1
- TH0=(65536-50000)/256;//放入計(jì)數(shù)初值
- TL0=(65536-50000)%256;//放入計(jì)數(shù)初值
- TR0=1;//開(kāi)定時(shí)/計(jì)數(shù)器0
- }
- /*--顯示固定漢字:年月日 ,星期,時(shí)分秒*/
- void Display()
- {
- left();//左半屏顯示
- Display_Char(0,0,Digits+2*16);//顯示2
- Display_Char(0,8,Digits);//顯示0
- /*--顯示固定漢字:年月日 ,星期,時(shí)分秒*/
- Display_Word(0,32,Date_Time_Words+0*32); //"年"字的顯示
- right();//右半屏顯示
- Display_Word(0,64,Date_Time_Words+1*32); //"月"字的顯示
- Display_Word(0,96,Date_Time_Words+2*32); //"日"字的顯示
- left();//左半屏顯示
- Display_Word(2,32,Date_Time_Words+5*32); //"時(shí)"字的顯示
- right();//右半屏顯示
- Display_Word(2,64,Date_Time_Words+6*32); //"分"字的顯示
- Display_Word(2,96,Date_Time_Words+7*32); //"秒"字的顯示,秒顯示在右半屏
- left();//左半屏顯示
- Display_Word(4,32,Date_Time_Words+3*32); //"星"字的顯示
- Display_Word(4,48,Date_Time_Words+4*32); //"期"字的顯示
- left();//左半屏顯示
- Display_Word(6,0,Templt+0*32); //"溫"字的顯示
- Display_Word(6,16,Templt+1*32); //"度"字的顯示
- Display_Word(6,32,Templt+2*32); //":"字的顯示
- right();//右半屏顯示
- Display_Word(6,80,Templt+3*32); //"℃"字的顯示
- }
- void delayms(uint xms)
- {
- uint y;
- while(xms--)for(y=110;y>0;y--);
- }
- //us級(jí)延時(shí)函數(shù)
- void Delayus(uchar xus)//晶振為12MHz,延時(shí)時(shí)間為2i+5 us
- {
- while(--xus);
- }
- //初始化DS18B20函數(shù)
- bit Init_DS18B20(void)
- {
- bit x;
- DQ=1;
- DQ=0;
- Delayus(250);
- DQ=1;
- Delayus(20);
- if(!DQ) x=0;
- else x=1;
- Delayus(250);
- DQ=1;
- return x;
- }
- //讀DS18B20函數(shù)
- uchar Read_DS18B20(void)
- {
- uchar i=0,Dat=0;
- for(i=0;i<8;i++)
- {
- DQ=1;
- DQ=0;
- Dat>>=1;
- DQ=1;
- if(DQ) Dat |= 0x80;
- DQ=1;
- Delayus(30);
- }
- return Dat;
- }
- //寫(xiě)DS18B20函數(shù)
- void Write_DS18B20(uchar Dat)
- {
- uchar i=0;
- for(i=0;i<8;i++)//循環(huán)8次,寫(xiě)入一個(gè)字節(jié)
- {
- DQ=1;//未發(fā)送前的狀態(tài)
- Dat >>= 1;//將要傳送的最低位放入CY
- DQ=0;//將總線拉低,產(chǎn)生寫(xiě)時(shí)序
- DQ=CY;//將要傳送的位狀態(tài)送到總線上
- Delayus(30);//延時(shí)50us,即保持總線狀態(tài),待DS18B20采樣
- DQ=1;//恢復(fù)期,總線置1
- }
- }
- //取溫度函數(shù)
- void GetTemp(void)//獲取溫度函數(shù)
- {
- uchar a=0,b=0;
- TR0=0;//關(guān)閉定時(shí)器,防止定時(shí)器中斷干擾DS18B20
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
51單片機(jī)顯示時(shí)間(可調(diào)整)(DS1302時(shí)鐘 12864LCD顯示).docx
(61.09 KB, 下載次數(shù): 202)
2017-7-27 15:29 上傳
點(diǎn)擊文件名下載附件
程序
|