欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
基于51單片機電子萬年歷設計 lcd12864+24c02+ds1302
[打印本頁]
作者:
aciteam_wyj
時間:
2019-10-17 20:29
標題:
基于51單片機電子萬年歷設計 lcd12864+24c02+ds1302
原則 技術有限 分享無限
作品名稱:基于51單片機電子萬年歷設計
作評功能:1:實現ds1302的讀寫
2:lcd12864的顯示
3:24c02的讀寫
4:更改日期,時間
5:整點報時,鬧鐘的功能
6:陰陽歷的轉換
硬件部分:普中開發板(程序內明確標明接線方式)
軟件部分:
原創
1:代碼規范:易于更改
2:封裝良好,可以直接移植。
1F63723179C3E715DCD5AB9357461A0A.png
(2.62 MB, 下載次數: 63)
下載附件
2019-10-17 20:29 上傳
單片機源程序如下:
#include "reg51.h" //此文件中定義了單片機的一些特殊功能寄存器
#include "lcd12864.h"
#include "ds1302.h"
#include "24c04.h"
#include "stdio.h"
#include "string.h"
#include "ALG.h"
//預編譯
#define DISPLAY_DATA_SIZE 30 //顯示顯示一幀數據長度
#define GPIO_KEY P1
//全局變量
unsigned char display_buff[DISPLAY_DATA_SIZE];
unsigned char ds1302_buff[2*sizeof(TIME)];
unsigned char key_value=0xff;
unsigned char receive_buff[sizeof(TIME)];
unsigned char store_row=0;
unsigned char store_line=0;
unsigned char interface_flag=0;
unsigned char ds1302_receive_flag=0;
unsigned char temp[8];
unsigned char display_flag=0;
unsigned char table[32][4]=
{
{0x01,0x01, 0x00, 0x12},
{0x01,0x20, 0x00, 0x12},
{0x01,0x30, 0x00, 0x12},
{0x00,0x40, 0x00, 0x12},
{0x00,0x50, 0x00, 0x12},
{0x01,0x00, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x01, 0x00, 0x12},
{0x01,0x20, 0x00, 0x12},
{0x01,0x30, 0x00, 0x12},
{0x00,0x40, 0x00, 0x12},
{0x00,0x50, 0x00, 0x12},
{0x01,0x00, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x01, 0x00, 0x12},
{0x01,0x20, 0x00, 0x12},
{0x01,0x30, 0x00, 0x12},
{0x00,0x40, 0x00, 0x12},
{0x00,0x50, 0x00, 0x12},
{0x01,0x00, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x01, 0x00, 0x12},
{0x01,0x20, 0x00, 0x12},
{0x01,0x30, 0x00, 0x12},
{0x00,0x40, 0x00, 0x12},
{0x00,0x50, 0x00, 0x12},
{0x01,0x00, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12},
{0x01,0x50, 0x01, 0x12}
};
sbit buzzer=P3^7;
//全局函數聲明
void system_init(void);
void delay_ms(int ms);
void lcd_display(char row,char* buff,char num);
void timer_init(void);
void key_check(void);
void major_interface(void);
void store_interface(void);
void time_interface(void);
void key_pro(void);
void bcd_to_ascii(unsigned char* buff,unsigned char num);
void data_pro(unsigned char*des_buff,unsigned char*src_buff,unsigned char num);
/*
biref 主函數
param 無
return 無
*/
void main(void)
{
unsigned char temp[7];
unsigned char i=0;
system_init();
//在24cxx中讀取數據。
for(i=0;i<32;i++)
{
read_24cxx(0x00+i*4,table+i,4);
}
while(1)
{
major_interface();
store_interface();
time_interface();
key_check();
key_pro();
}
}
/*
biref 系統初始化函數
param 無
return 無
*/
void system_init(void)
{
LCD12864_Init();
Ds1302Init(TIME);
// Ds18b20Init();
timer_init();
}
/*
biref 延時函數
param 延時時間,單位ms;
return 無
*/
void delay_ms(int ms)
{
int x,i;
x=ms;
while(x--)
for(i=123;i;i--);
}
/*
biref 12864顯示函數
param 顯示緩存區
return 無
*/
void lcd_display(char row,char* buff,char num)
{
unsigned int i;
switch(row)
{
case 0:
{
LCD12864_SetWindow(0, 0);
for(i=0;i<num;i++)
{
LCD12864_WriteData(buff[i]);
}
break;
}
case 1:
{
LCD12864_SetWindow(1, 0);
for(i=0;i<num;i++)
{
LCD12864_WriteData(buff[i]);
}
break;
}
case 2:
{
LCD12864_SetWindow(2, 0);
for(i=0;i<num;i++)
{
LCD12864_WriteData(buff[i]);
}
break;
}
case 3:
{
LCD12864_SetWindow(3, 0);
for(i=0;i<num;i++)
{
LCD12864_WriteData(buff[i]);
}
break;
}
default:
{
break;
}
}
}
/*
biref BCD碼轉換到ASCII
param 無
return 無
*/
void bcd_to_ascii(unsigned char* buff,unsigned char num)
{
unsigned int i;
for(i=0;i<num;i++)
{
if(buff[i]>=0&&buff[i]<=9)
buff[i]+=0x30;
}
}
/*
biref ds1302數據處理函數
param des_buff 目標數組
src_buff 源數組
num 源頭數組長度
return 無
*/
void data_pro(unsigned char* des_buff,unsigned char*src_buff,unsigned char num)
{
unsigned int i;
unsigned char t;
for(i=0;i<num;i++)
{
des_buff[2*i]=src_buff[i]/16;
des_buff[2*i+1]=src_buff[i]%16;
}
for(i=0;i<num;i++)//實現數組的整體倒序
{
t=des_buff[i];
des_buff[i]=des_buff[2*num-1-i];
des_buff[2*num-1-i]=t;
}
for(i=0;i<num;i++)
{
t=des_buff[2*i];
des_buff[2*i]=des_buff[2*i+1];
des_buff[2*i+1]=t;
}
}
/*
biref 定時器0初始化
param 無
return 無
*/
void timer_init(void)
{
TMOD|=0X01;
TH0=(65536-50000)/0xff;
TL0=(65536-50000)%0xff;
ET0=1;
EA=1;
TR0=1;
}
/*
biref 定時器0中斷服務函數
param 無
return 無
*/
void Timer0() interrupt 1
{
static unsigned char number=0;
unsigned char i=0;
TH0=(65536-50000)/0xff;
TL0=(65536-50000)%0xff;
number++;
if(number==20)
{
Ds1302ReadTime();
ds1302_receive_flag=1;
if(TIME[0]==0x00 &&TIME[1]==0x00)
{
for(i=0;i<200;i++)
{
buzzer=~buzzer;
delay_ms(2);
}
}
for(i=0;i<32;i++)
{
if(!strncmp(table[0]+1+i*sizeof(table[0]),TIME,sizeof(table[0])-1)&& *(table[0]+i*sizeof(table[0]))==0x01 )
{
for(i=0;i<50;i++)
{
buzzer=~buzzer;
delay_ms(20);
}
break;
}
}
number=0;
}
}
/*
biref 按鍵檢測
param 無
return 無
*/
void key_check(void)
{
char a=0;
GPIO_KEY=0x0f;
key_value=0xff;
if(GPIO_KEY!=0x0f)//讀取按鍵是否按下
{
delay_ms(10);//延時10ms進行消抖
if(GPIO_KEY!=0x0f)//再次檢測鍵盤是否按下
{
//測試列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): key_value=0;break;
case(0X0b): key_value=1;break;
case(0X0d): key_value=2;break;
case(0X0e): key_value=3;break;
}
//測試行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): key_value=key_value;break;
case(0Xb0): key_value=key_value+4;break;
case(0Xd0): key_value=key_value+8;break;
case(0Xe0): key_value=key_value+12;break;
}
while((a<50)&&(GPIO_KEY!=0xf0)) //檢測按鍵松手檢測
{
delay_ms(10);
a++;
}
}
}
}
/*
biref 按鍵處理
param 無
return 無
*/
unsigned char key_num=1;
void key_pro(void)
{
unsigned char i=0;
unsigned char temp[7],t;
switch(key_value)
{
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
case 8:
case 9:
{
if(interface_flag==1)//存儲界面的按鍵
{
if(key_num%2==1)
{
table[store_row][sizeof(table[0])-1-store_line]=table[store_row][sizeof(table[0])-1-store_line]&0x0f|key_value<<4;
key_num++;
}
else
{
table[store_row][sizeof(table[0])-1-store_line]=table[store_row][sizeof(table[0])-1-store_line]&0xf0|key_value;
key_num++;
if(store_line<=1)
store_line++;
else
store_line=2;
}
display_flag=1;
}
else if(interface_flag==2)//時間更改界面的按鍵
{
if(key_num%2==1)
{
ds1302_buff[2*store_line]=key_value+0x30;
key_num++;
}
else
{
ds1302_buff[2*store_line+1]=key_value+0x30;
key_num++;
if(store_line<=5)
store_line++;
else
store_line=6;
}
display_flag=1;
}
else
{
}
break;
}
case 10:
{
if(store_line>=1)
store_line--;
else
store_line=0;
display_flag=1;
break;
}
case 11:
{
if(interface_flag==1)
{
if(store_line<=1)
store_line++;
else
store_line=2;
display_flag=1;
}
else if(interface_flag==2)
{
if(store_line<=5)
store_line++;
else
store_line=6;
display_flag=1;
}
else
{
}
break;
}
case 12:
{
if(store_row<=30)
store_row++;
else
store_row=31;
display_flag=1;
break;
}
case 13:
{
if(store_row>=1)
store_row--;
else
store_row=0;
display_flag=1;
break;
}
case 14://界面切換按鈕
{
if(interface_flag==0)
{
LCD12864_WriteCmd(0x01);
interface_flag=1;
store_line=0;
store_row=0;
display_flag=1;
key_num=1;
}
else if(interface_flag==1)
{
for(i=0;i<32;i++)
{
write_24cxx(0x00+4*i,table+i,sizeof(table[0]));
}
LCD12864_WriteCmd(0x01);
display_flag=1;
interface_flag=2;
store_line=0;
store_row=1;
key_num=1;
}
else if(interface_flag==2)
{
LCD12864_WriteCmd(0x01);
for(i=0;i<sizeof(ds1302_buff)/sizeof(ds1302_buff[0]);i++)
{
ds1302_buff[i]-=0x30;
}
for(i=0;i<sizeof(ds1302_buff)/sizeof(ds1302_buff[0]);i++)
{
temp[i]=(ds1302_buff[2*i]<<4)+ds1302_buff[2*i+1];
}
for(i=0;i<sizeof(temp)/sizeof(temp[0])/2;i++)
{
t=temp[i];
temp[i]=temp[sizeof(temp)-1-i];
temp[sizeof(temp)-1-i]=t;
}
Ds1302Init(temp);
display_flag=1;
interface_flag=0;
}
else
{
while(1);
}
break;
}
case 15:
{
table[store_row][0]=~table[store_row][0];
display_flag=1;
break;
}
default:
break;
}
}
/*
biref 主要界面顯示
param 無
return 無
*/
void major_interface(void)
{
if(interface_flag==0&&ds1302_receive_flag==1)
{
ds1302_receive_flag=0;
LCD12864_WriteCmd(0x0c);
Ds1302ReadTime();
data_pro(ds1302_buff,TIME,sizeof(TIME)/sizeof(TIME[0]));
solar_to_lunar(2000+ds1302_buff[0]*10+ds1302_buff[1],ds1302_buff[4]*10+ds1302_buff[2],ds1302_buff[6]*10+ds1302_buff[7],display_buff);
lcd_display(3,display_buff,8);
bcd_to_ascii(ds1302_buff,sizeof(ds1302_buff)/sizeof(ds1302_buff[0]));
sprintf(display_buff,"20%2.2s年%2.2s月%2.2s日",ds1302_buff,ds1302_buff+4,ds1302_buff+6);
lcd_display(0,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
sprintf(display_buff," 星期%2.2s ",ds1302_buff+2);
lcd_display(1,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
sprintf(display_buff," %2.2s時%2.2s分%2.2s秒 ",ds1302_buff+8,ds1302_buff+10,ds1302_buff+12);
lcd_display(2,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
}
}
/*
biref 存儲界面
param 無
return 無
*/
void store_interface(void)
{
unsigned char i;
if(interface_flag==1)
{
if(display_flag==1)
{
for(i=0;i<4;i++)
{
data_pro(temp,table+4*(store_row/4)+i,sizeof(table[0]));
bcd_to_ascii(temp,sizeof(temp)/sizeof(temp[0]));
if(temp[7]=='1')
{
sprintf(display_buff,"%6.2s--%2.2s--%2.2s開",temp,temp+2,temp+4);
display_buff[0]=(store_row/4*4+i)/10+0x30;
display_buff[1]=(store_row/4*4+i)%10+0x30;
lcd_display(i,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
}
else
{
sprintf(display_buff,"%6.2s--%2.2s--%2.2s關",temp,temp+2,temp+4);
display_buff[0]=(store_row/4*4+i)/10+0x30;
display_buff[1]=(store_row/4*4+i)%10+0x30;
lcd_display(i,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
}
}
display_flag=0;
}
LCD12864_WriteCmd(0x0f);
switch(store_line)
{
case 0:
LCD12864_SetWindow(store_row%4,2);
break;
case 1:
LCD12864_SetWindow(store_row%4,4);
break;
case 2:
LCD12864_SetWindow(store_row%4,6);
break;
case 3:
LCD12864_SetWindow(store_row%4,7);
break;
default:
break;
}
}
}
/*
biref 時間調節界面
param 無
return 無
*/
void time_interface(void)
{
unsigned char str[]="更改時間界面";
if(interface_flag==2)
{
if(display_flag==1)
{
lcd_display(0,str,sizeof(str));
sprintf(display_buff,"20%2.2s年%2.2s月%2.2s日",ds1302_buff,ds1302_buff+4,ds1302_buff+6);
lcd_display(1,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
sprintf(display_buff," 星期%2.2s ",ds1302_buff+2);
lcd_display(2,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
sprintf(display_buff," %2.2s時%2.2s分%2.2s秒 ",ds1302_buff+8,ds1302_buff+10,ds1302_buff+12);
lcd_display(3,display_buff,sizeof(display_buff)/sizeof(display_buff[0])-14);
display_flag=0;
}
LCD12864_WriteCmd(0x0f);
switch(store_line)
{
case 0:
LCD12864_SetWindow(1,1);
break;
case 1:
LCD12864_SetWindow(2,4);
break;
case 2:
LCD12864_SetWindow(1,3);
break;
case 3:
LCD12864_SetWindow(1,5);
break;
case 4:
LCD12864_SetWindow(3,1);
break;
case 5:
LCD12864_SetWindow(3,3);
break;
case 6:
LCD12864_SetWindow(3,5);
break;
default:
break;
}
}
}
復制代碼
所有資料51hei提供下載:
電子萬年歷.rar
(141.26 KB, 下載次數: 322)
2019-10-17 20:29 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
8imi8
時間:
2019-10-20 11:57
感謝分享
作者:
mm792120513
時間:
2020-2-27 22:52
感謝分享
作者:
YeeeJ
時間:
2020-3-17 17:11
你好 請問有原理圖嗎?
作者:
jjl8568
時間:
2020-4-19 08:50
編譯沒通過!!!
作者:
清茶煮酒
時間:
2020-10-29 17:23
想知道壓縮包里除了代碼還有啥
作者:
多喝熱水,3遍
時間:
2020-11-2 09:35
請問這個支持仿真嗎?
作者:
Obamaa
時間:
2020-11-11 21:57
給個原理圖唄
作者:
Chen1108
時間:
2021-1-7 17:07
表示看不出這么接線。。。。。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1