#include<reg51.h>
#include<stdio.h>
#include<intrins.h>
#include<string.h>
////////////////////////////////////////////////
#define TURE 1
#define FALSE 0
////////////////////////////////////////////////
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
sfr P4 = 0xC0;
sfr P4SW = 0xBB;
uchar sec, min, hour, day, month,counter,xingqi,AL1SEC,AL1MIN,AL1HOUR,AL1DAY,AL2MIN,AL2HOUR,AL2DAY,AMZT;
uchar EDA=7;
uint year;
bit ack;
uint cnt = 0;
uint cntled1ss;
uint cntled2ss;
uint cntled3ss;
uint cntled4ss;
uint cntled5ss;
uchar i = 0;
uchar j = 10;
uint td=10; //1-10
bit led1ss=0;
bit led2ss=0;
bit led3ss=0;
bit led4ss=0;
bit led5ss=0;
bit mingejiaen=1;
bit minshijiaen=1;
bit hourgejiaen=1;
bit hourshijiaen=1;
uint L1=0;
uint L2=0;
uint L3=0;
uint L4=0;
uint L5=0;
sbit leden1 = P0^1;
sbit leden2 = P0^3;
sbit leden3 = P0^7;
sbit leden4 = P2^7;
sbit leden5 = P0^6;
sbit gejia = P1^0;
sbit shijia = P1^0;
sbit led1 = P0^0;
sbit led2 = P0^2;
sbit led3 = P0^4;
sbit led4 = P4^4;
sbit led5 = P2^6;
sbit led6 = P2^2;
sbit led7 = P2^0;
sbit ledzs1 = P1^0;
sbit ledzs2 = P1^1;
sbit ledzs3 = P1^2;
sbit ledzs4 = P1^3;
sbit ledzs5 = P1^4;
sbit ledzs6 = P1^5;
sbit ledzs7 = P1^6;
sbit ledzs8 = P1^7;
sbit ledzs11 = P3^3;
sbit ledzs22 = P3^4;
sbit ledzs33 = P3^5;
sbit ledzs44 = P3^6;
sbit ledzs55 = P3^7;
sbit SDA=P2^4; //模拟I2C数据传送位SDA
sbit SCL=P2^5; //模拟I2C时钟控制位SCL
#define ADDRTW 0xD0 //器件写地址
#define ADDRTD 0xD1 //器件读地址
#define DS3231_SEC 0x00 //秒
#define DS3231_MIN 0x01 //分
#define DS3231_HOUR 0x02 //时
#define DS3231_DAY 0x03 //星期
#define DS3231_DATE 0x04 //日
#define DS3231_MONTH 0x05 //月
#define DS3231_YEAR 0x06 //年
//闹铃1
#define DS3231_Al1SEC 0x07 //秒
#define DS3231_AL1MIN 0x08 //分
#define DS3231_AL1HOUR 0x09 //时
#define DS3231_AL1DAY 0x0A //星期/日
//闹铃2
#define DS3231_AL2MIN 0x0b //分
#define DS3231_AL2HOUR 0x0c //时
#define DS3231_AL2DAY 0x0d //星期/日
#define DS3231_CONTROL 0x0e //控制寄存器
#define DS3231_STATUS 0x0f //状态寄存器
bit ack;
sbit IR=P3^2;//红外接口标志
sbit RS = P0^4;//Pin4
sbit RW = P3^3; //Pin5 O.3
sbit E = P0^2;//Pin6
#define Data P2 //数据端口
char code Tab[16]="0123456789ABCDEF";
char data TimeNum[]=" ";
char data Test1[]=" ";
////////////////////////////////////////////
unsigned char irtime;//红外用全局变量
bit irpro_ok,irok;
unsigned char IRcord[4];
unsigned char irdata[33];
void ShowString (unsigned char line,char *ptr);
//////////////////////////////////////////////
void Ir_work(void);
void Ircordpro(void);
/*************************************************************/
void tim0_isr (void) interrupt 1 using 1//定时器 0 中断服务函数
{
irtime++;
}
///////////////////////////////////////////////////////////////////////
void ex0_isr (void) interrupt 0 using 0//外部中断 0 服务函数
{
static unsigned char i;
static bit startflag;
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码 TC9012 的头码
i=0;
irdata[i]=irtime;
irtime=0;
i++;
if(i==33) //共 33 位,第一位是没用的
{
irok=1; //标志位
i=0;
}
}
else
{irtime=0;startflag=1;}
}
////////////////////////////////////////////////////////////////////
void TIM0init(void)//定时器 0 初始化
{
//TMOD=0x12;//定时器 0 工作方式 2,TH0 是重装值,TL0 是初值
TH0=0x00;//重装值
TL0=0x00;//初始值
ET0=1;//开中断
TR0=1;//开定时器
}
///////////////////////////////////////////////////////////////////
void EX0init(void)
{
IT0 = 1; // 选择下降沿触发方式
EX0 = 1; // 使能外部中断
EA = 1; //开启总中断
}
/****************************************************************/
/******************************************************************/
void Ir_work(void)//红外键值散转程序
{
TimeNum[0] = Tab[IRcord[0]/16];
//TimeNum[6] = Tab[IRcord[0]%16];
//TimeNum[7] = '^';
//TimeNum[8] = Tab[IRcord[1]/16];
TimeNum[1] = Tab[IRcord[1]%16];
//TimeNum[10] = '^';
TimeNum[2] = Tab[IRcord[2]/16];
TimeNum[3] = Tab[IRcord[2]%16];
TimeNum[4] = ' ';
TimeNum[5] = ' ';
TimeNum[6] = ' ';
TimeNum[7] = ' ';
TimeNum[8] = ' ';
TimeNum[9] = ' ';
TimeNum[10] = ' ';
TimeNum[11] = ' ';
TimeNum[12] = ' ';
TimeNum[13] = ' ';
TimeNum[14] = ' ';
TimeNum[15] = ' ';
//TimeNum[14] = Tab[IRcord[3]/16];
//TimeNum[15] = Tab[IRcord[3]%16];
ShowString(1,TimeNum);//显示红外码值
irpro_ok=0;
}
/*****************************************************************/
void Ircordpro(void)//红外码值处理函数
{
unsigned char i, j, k;
unsigned char cord,value;
k=1;//去掉第一位
for(i=0;i<4;i++)//处理 4 个字节
{
for(j=1;j<=8;j++) //处理 1 个字节 8 位
{
cord=irdata[k];
if(cord>7)//大于某值为 1
{
value=value|0x80; //值为‘1’
}
else
{
value=value; //值为‘0’
}
if(j<8)
{
value=value>>1; //右移
}
k++;
}
IRcord[i]=value;
value=0;
} irpro_ok=1;//处理完毕标志位置 1
}
/******************************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//操作前的短延时
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //操作前的短延时
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则命令代码高 4 位为 0xc
else
p=pos+0x80; //是第二行则命令代码高 4 位为 0x8
WriteCommand (p);
WriteData (c);
}
/*************************************************************************/
void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循环显示 16 个字符
}
/*********************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //显示模式
WriteCommand(0x38); //显示模式
WriteCommand(0x38); //显示模式
WriteCommand(0x06); //显示光标移动位置
WriteCommand(0x0c); //显示开及光标设置
WriteCommand(0x01); //显示清屏
}
/////////////////////////////////////////////////////////////////
void ledyinshe( ulong j )
{ led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1;
switch(j)
{
case 0: led1=0;led2=0;led3=0;led4=1;led5=0;led6=0;led7=0; break;
case 1: led1=1;led2=0;led3=1;led4=1;led5=0;led6=1;led7=1; break;
case 2: led1=0;led2=1;led3=0;led4=0;led5=0;led6=1;led7=0; break;
case 3: led1=0;led2=0;led3=1;led4=0;led5=0;led6=1;led7=0; break;
case 4: led1=1;led2=0;led3=1;led4=0;led5=0;led6=0;led7=1; break;
case 5: led1=0;led2=0;led3=1;led4=0;led5=1;led6=0;led7=0; break;
case 6: led1=0;led2=0;led3=0;led4=0;led5=1;led6=0;led7=0; break;
case 7: led1=1;led2=0;led3=1;led4=1;led5=0;led6=0;led7=0; break;
case 8: led1=0;led2=0;led3=0;led4=0;led5=0;led6=0;led7=0; break;
case 9: led1=0;led2=0;led3=1;led4=0;led5=0;led6=0;led7=0; break;
case 10:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=0; break;
case 11:led1=1;led2=1;led3=1;led4=0;led5=1;led6=1;led7=1; break;
case 12:led1=0;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
case 13:led1=1;led2=1;led3=1;led4=1;led5=1;led6=1;led7=1; break;
default:break;
}
}
void delay1ms(uchar j)
{
while(j!=0)
{uchar i;
for(i=124;i>0;i--); //延时124*8+10=1002us
j--;
}
}
void delay1(unsigned char i)
{
for(i;i>0;i--);
}
uchar BCD2HEX(uchar val) //BCD转换为Byte
评论0