当前位置:文档之家› 51单片机c语言知识电子万年历完整编辑程序

51单片机c语言知识电子万年历完整编辑程序

//sbit beep=P3^3;
uint temp;
float f_temp;
uint warn_l1=270;
uint warn_l2=250;
uint warn_h1=300;
uint warn_h2=320;
uint get_temp();
void delayms(uint x);
void write_com(uchar com);
该程序为51单片机c语言电子万年历
#include"reg52.h"
//#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit DATA=P0^7;
void DisplayYear(uchar x);
void DisplayWeek(uchar x);
void dis_temp(uint t);
void read_date(void);
void turn_val(char newval,uchar flag,
uchar newaddr,uchar s1num);
minute=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = ReadSet1302(0x85);
hour=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = ReadSet1302(0x87);
write_data(' ');
dis_temp(get_temp());
}
void DisSecond(uchar x)
{
uchar i,j;
ReadValue = ReadSet1302(0x81);
second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
WriteSet1302(0x8c,((14/10)<<4|(14%10))); //nian
//WriteSet1302(0x8a,((4/10)<<4|(4%10)));
}
/////////////////////////////////////////////////////////////////
write_data(j+0x30);
write_com(0x88);
write_data('/');
}
void DisplayYear(uchax/10;
j=x%10;
write_com(0x81);
write_data(2+0x30);
write_com(0x82);
write_data(i+0x30);
write_com(0x8a);
write_data(j+0x30);
}
void DisplayMonth(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0x86);
write_data(i+0x30);
write_com(0x87);
{
write_data(table2[x]);
x++;
}
}
void read_date(void)
{
ReadValue = ReadSet1302(0x81);
second=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
ReadValue = ReadSet1302(0x83);
void Write1302(uchar dat)
{
uchar i;
SCLK=0; //拉低SCLK,为脉冲上升沿写入数据做好准备
delayms(2); //稍微等待,使硬件做好准备
for(i=0;i<8;i++) //连续写8个二进制位数据
{
DATA=dat&0x01; //取出dat的第0位数据写入1302
year=((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
write_data(i+0x30);
write_com(0x80+0x44);
write_data(j+0x30);
write_com(0x80+0x45);
write_data(':');
}
void DisplayHour(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
write_com(0x80+0x40);
sbit RST=P0^5;
sbit SCLK=P0^6;
sbit menu=P3^0; //菜单
sbit add=P3^1; //加一
sbit dec=P3^7; //减一
sbit led0=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
sbit led3=P1^3;
sbit ds=P3^2;
void write_data(uchar date);
void init();
void dis_temp(uint t);
void Write1302(uchar dat);
void WriteSet1302(uchar Cmd,uchar dat);
uchar Read1302(void);
uchar ReadSet1302(uchar Cmd);
write_data(0+0x30);
write_com(0x83);
write_data(i+0x30);
write_com(0x84);
write_data(j+0x30);
write_com(0x85);
write_data('/');
}
void DisplayWeek(uchar x)
{ uchar i;
dat|=0x80; //将1取出,写在dat的最高位
SCLK=1; //将SCLK置于高电平,为下降沿读出
delayms(2); //稍微等待
SCLK=0; //拉低SCLK,形成脉冲下降沿
delayms(2); //稍微等待
}
return dat; //将读出的数据返回
}
uchar ReadSet1302(uchar Cmd)
uchar ReadValue,num,time;
void delayms(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
////////////////////////////////////////////////////////////
{
RST=0; //禁止数据传递
SCLK=0; //确保写数居前SCLK被拉低
RST=1; //启动数据传输
delayms(2); //稍微等待,使硬件做好准备
Write1302(Cmd); //写入命令字
Write1302(dat); //写数据
SCLK=1; //将时钟电平置于已知状态
RST=0; //禁止数据传递
}
void Init_DS1302(void)
{
WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((59/10)<<4|(59%10))); //根据写分寄存器命令字,写入分的初始值
delayms(2); //稍微等待,使硬件做好准备
SCLK=1; //上升沿写入数据
delayms(2); //稍微等待,使硬件做好准备
SCLK=0; //重新拉低SCLK,形成脉冲
dat>>=1; //将dat的各数据位右移1位,准备写入下一个数据位
}
}
void WriteSet1302(uchar Cmd,uchar dat)
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/////////////////////////////////////////////////////////////////
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P2=date;
delayms(5);
相关主题