📄 2402test.c
字号:
if(DT==0x12)
{
AT24C02_Write1Byte(address,0xff);
}
}
//===================================DS18B20驱动===========================================
sbit DQ=P2^0; // 定义DS18B20数据线
/*******************延时函数***********************************************************/
void Delay(int num)
{
while(num--) ;
}
/*******************初始化ds1820***********************************************************/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ=1; //DQ复位
Delay(8); //稍做延时
DQ=0; //单片机将DQ拉低
Delay(80); //精确延时大于480us
DQ=1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
/*******************读一个字节***********************************************************/
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for(i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
/*******************写一个字节***********************************************************/
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
Delay(5);
DQ=1;
dat>>=1;
}
}
/*******************读取温度***********************************************************/
unsigned int ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0x44); //启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*******************写一个字节***********************************************************/
void printTemperature(void)
{
unsigned int i=0;
unsigned char a=0,b=0,c=0;
i=ReadTemperature(); //读温度并送显
a=i/100;
if(a>0x06)
{
print(0xc0,"--.-");
}
else
{
print2(0xc1,a+0x30); //显示温度十位
b=i/10-a*10;
print2(0xc2,b+0x30); //个位
print(0xc3,"."); //"."
c=i-a*100-b*10;
print2(0xc4,c+0x30); //小位1位
}
print2(0xc5,0x00);
print(0xc6,"C"); //度C
}
//=================================DS1302时钟驱动===========================================//
//注释DS1302寄存器
// DS1302内部RAM分址:00 = 0xc0(写) = 0xc1(读) 奇数是读,偶数是写
/*******************定义DS1302时钟接口******************************************************/
sbit clock_clk=P3^5; //ds1302_clk(时钟线)
sbit clock_dat=P3^6; //ds1302_dat(数据线)
sbit clock_Rst=P3^7; //ds1302_Rst(复位线)
/*******************定义累加器A中的各位*****************************************************/
sbit a0=ACC^0;
sbit a1=ACC^1;
sbit a2=ACC^2;
sbit a3=ACC^3;
sbit a4=ACC^4;
sbit a5=ACC^5;
sbit a6=ACC^6;
sbit a7=ACC^7;
/*******************定义全局变量*********************************************************/
//unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w=0; //调时标志位
/*******************1302驱动程序(底层协议)***********************************************/
void clock_out(unsigned char dd)
{
ACC=dd;
clock_dat=a0;clock_clk=1;clock_clk=0;
clock_dat=a1;clock_clk=1;clock_clk=0;
clock_dat=a2;clock_clk=1;clock_clk=0;
clock_dat=a3;clock_clk=1;clock_clk=0;
clock_dat=a4;clock_clk=1;clock_clk=0;
clock_dat=a5;clock_clk=1;clock_clk=0;
clock_dat=a6;clock_clk=1;clock_clk=0;
clock_dat=a7;clock_clk=1;clock_clk=0;
}
/*******************DS1302写入字节(底层协议)**********************************************/
unsigned char clock_in(void)
{
clock_dat=1;
a0=clock_dat;
clock_clk=1;clock_clk=0;a1=clock_dat;
clock_clk=1;clock_clk=0;a2=clock_dat;
clock_clk=1;clock_clk=0;a3=clock_dat;
clock_clk=1;clock_clk=0;a4=clock_dat;
clock_clk=1;clock_clk=0;a5=clock_dat;
clock_clk=1;clock_clk=0;a6=clock_dat;
clock_clk=1;clock_clk=0;a7=clock_dat;
return(ACC);
}
/*******************DS1302写数据(底层协议)************************************************/
void write_clock(unsigned char ord, unsigned char dd)
{
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
clock_out(dd);
clock_Rst=0;
clock_clk=1;
}
/*******************DS1302读数据(底层协议)**********************************************/
unsigned char read_clock(unsigned char ord)
{
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*******************调时程序**********************************************************/
/*******************根据选择调整的相应项目加1并写入DS1302*****************************/
void Set_time(unsigned char sel,bit a)
{
signed char address,item,item2;
signed char max,mini;
write_clock(0x8e,0x00); //允许写操作
if(sel==7){address=0x80;max=59;mini=0;} //秒7
if(sel==6){address=0x82;max=59;mini=0;} //分钟6
if(sel==5){address=0x84;max=23;mini=0;} //小时5
if(sel==4){address=0x8a;max=7;mini=1;} //星期4
if(sel==3){address=0x86;max=31;mini=0;} //日3
if(sel==2){address=0x88;max=12;mini=0;} //月2
if(sel==1){address=0x8c;max=99; mini=0;} //年1
if(a==0) //如果a是0则表示现在键入的是 十位 数据
{
write_clock(address,0x00); //将 个位 的数据清0 防止数值范围计算有错
item=DT; //键值数给 十位
item2=0; // 个位 填入 0
}
else //否则是 个位数据
{
item=(read_clock(address+1))/16; //先读出 十位 数据
item2=DT; //键值放入 个位
}
item=(item)*10+(item2); //将 十位 和 个位 数据合成
if(item>max)
item=mini; //查看数值有效范围
if(item<mini)
item=max;
write_clock(address,(item/10)*16+item%10); //转换成16进制写入1302
write_clock(0x8e,0x80); //写保护,禁止写操作
}
/*******************检测时钟芯片是否未被初始化,如是则设置1302的初始时间********************/
void Init_1302(void) //2008年1月1日00时00分00秒星期二
{
menu=0;
if(read_clock(0xc1)!=0xaa)
{
write_clock(0x8e,0x00); //允许写操作
write_clock(0x8c,0x08); //08年
write_clock(0x8a,0x02); //星期二
write_clock(0x88,0x01); //01月
write_clock(0x86,0x01); //01日
write_clock(0x84,0x00); //00小时
write_clock(0x82,0x00); //00分钟
write_clock(0x80,0x00); //00秒
write_clock(0x90,0xa5); //充电
write_clock(0xc0,0xaa); //写入初始化标志RAM(第00个RAM位置)
write_clock(0x8e,0x80); //禁止写操作
AT24C02_Write1Byte(0x03,0x00); //初始化24C02中的报警开关选择寄存器
menu=1; //如果初始化则直接提示调时
}
}
/*******************定义小汉字**************************************************************/
uint8 code Xword[]={
0x02,0x05,0x02,0x00,0x00,0x00,0x00,0x00, //C,代码 0x03
0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00, //一,代码 0x04
0x00,0x0e,0x00,0x00,0x00,0xff,0x00,0x00, //二,代码 0x05
0x00,0xff,0x00,0x0e,0x00,0xff,0x00,0x00, //三,代码 0x06
0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,0x00, //四,代码 0x07
0x00,0xff,0x04,0x3f,0x09,0xff,0x00,0x00, //五,代码 0x08
0x00,0x04,0xff,0x00,0x0a,0x11,0x00,0x00, //六,代码 0x09
0x00,0x1f,0x11,0x1f,0x11,0x1f,0x00,0x00, //日,代码 0x0a
};
/*******************装入cgram***************************************************************/
void CgramWrite(void)
{
uint8 i;
LCM2402_WriteCMD(0x06); // CGRAM地址自动加1
LCM2402_WriteCMD(0x40); // CGRAM地址设为00处
for(i=0;i<64;i++)
{
LCM2402_WriteData(Xword[i]);
}
}
//=================================红外遥控接收===========================================//
sbit KBS=P3^2;
/********************************************************************************************
* 函数名称:keyboard_int
* 功 能:中断 红外遥控器数据接收初始化
********************INT0中断0 P3.2引脚,不能更改********************************************/
void keyboard_int(void)
{
TMOD=0x01; //定时器0方式1
EA=1; //允许CPU中断
IT0=1; //INT0下降沿有效
EX0=1; //开INT0中断
DT=0xff;
}
/********************************************************************************************
* 函数名称:keyboard
* 功 能:中断 红外遥控器数据接收
* 入口参数:无
* 出口参数:无
**********************定时器0中断处理*******************************************************/
void timeint(void) interrupt 1 using 2
{
TH0=0xFC;
TL0=0xE0; //设定时值为800us
if(IRCON<3)
{
if(IRCON2<8) //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
{
IRCON2++;
IRCode[IRCON]=IRCode[IRCON]<<1; //每读一次放入变量中的二进制的一个位,每次左移一位
IRCode[IRCON]=IRCode[IRCON]|KBS; //每八次填满一个字节,一个字节存放遥控编码4个位
//LED1=~LED1;
}
else
{
IRCON++; //填满一个字节,指向下一个变量
IRCON2=0; //计数清零
}
}
else
{
TR0=0; //关闭定时器
ET0=0; //定时器0中断关闭
if((IRCode[1]!=0xff)&&(IRCode[2]!=0xff))
{
if(IRCode[1]==0x55)
{
LED1=0;
switch(IRCode[2])
{
case 0xD2:DT=0X4C;break; //POWER ON
case 0xD3:DT=0X2F;break; //MUTE OFF
case 0xAB:DT=0x01;break; //1键控制
case 0xAC:DT=0x02;break; //2键控制
case 0xAD:DT=0x03;break; //3键控制
case 0xB2:DT=0x04;break; //4键控制
case 0xB3:DT=0x05;break; //5键控制
case 0xB4:DT=0x06;break; //6键控制
case 0xB5:DT=0x07;break; //7键控制
case 0xCA:DT=0x08;break; //8键控制
case 0xCB:DT=0x09;break; //9键控制
case 0xAA:DT=0x00;break; //0键控制
case 0xCC:DT=0X11;break; //-/--
case 0x54:DT=0X12;break; //SEARCH
case 0x2A:DT=0X17;break; //Vol+
case 0x2B:DT=0X1A;break; //Vol-
case 0xD5:DT=0X19;break; //RECALL
case 0xD4:DT=0X1B;break; //PP
}
}
if(IRCode[1]==0x56)
{
LED1=0;
switch(IRCode[2])
{
case 0xAA:DT=0x13;break; //PR+
case 0xAB:DT=0x14;break; //PR-
case 0xCD:DT=0x15;break; //FT+
case 0xD2:DT=0x16;break; //FT-
case 0xCB:DT=0x18;break; //STORE
case 0xB4:DT=0x1C;break; //SLEEP
case 0x4A:DT=0X1D;break; //AV
}
}
}
EX0=1; //开INT0中断
}
}
/*********************INT0中断***********************************************************************/
void INT0Fun(void) interrupt 0 using 3
{
EX0=0; //外部中断0关闭
ET0=1; //定时器0中断打开
TH0=0xFC;
TL0=0xE0; //设定时值为800us
for(IRCON=0;IRCON<3;IRCON++)
{
IRCode[IRCON]=0;
}
IRCON=0;
IRCON2=0; //计数清零
TR0=1; //开始计数
}
//=================================BEEP驱动===========================================//
sbit Bell_Out=P3^0; //元件是动圈式扬声器(并非有源蜂鸣器),需要MCU驱动发声
/****************原来扬声器声音*********************************************************
void beep(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
for(;a>0;a--) //第一个声音的长度
{
Bell_Out=~Bell_Out; //取反扬声器驱动口,以产生音频
Delay(b); //音调设置延时
}
for(;c>0;c--) //同上
{
Bell_Out=~Bell_Out;
Delay(d);
}
Bell_Out=1;
}
//------------------扬声器--按键音--------------------------
void beep_k(void)
{
beep(10,60,5,250);
}
//------------------扬声器--闹钟报警--------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -