标题:
单片机+12864+DS1302+红外遥控+温度显示+农历时钟程序
[打印本页]
作者:
这是个用户名
时间:
2019-1-10 17:02
标题:
单片机+12864+DS1302+红外遥控+温度显示+农历时钟程序
单片机源程序如下:
#include "STC12C5A60S2.H"
#include "Delay.h"
#include "LCD12864.h"
#include "Display.h"
#include "DS1302.h"
#include "UART.h"
#define uint unsigned int
#define uchar unsigned char
//sfr IAP_CONTR = 0xC7; //STC12C5A60S2复位寄存器
bit ReadTimeFlag;//定义读时间标志
sbit backlight=P1^4; //控制液晶的继电器
sbit IRIN = P3^2; //红外接收器数据线
uchar IRCOM[7];
uchar Key; //红外遥控器键值
void Init_Timer0() //定时器0初始化
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Init_Int0() // 外部中断0初始化
{
IT0 = 1; //指定外部中断0下降沿触发,INT0 (P3.2)
EX0 = 1; //使能外部中断
EA = 1; //开总中断
}
void main()
{
uchar i=0; //
lcm_init(); //液晶初始化
welcome(); //调用欢迎信息
Ds1302_Init(); //初始化DS1302
UART_Init(); //串口初始化
Init_Timer0(); //定时器0初始化
Init_Int0(); // 外部中断0初始化
delay(1000);
lcm_clr(); //清屏
Clean_12864_GDRAM(); //清屏
while(1)
{
if(SetFlag) //如果接收到串口信息则更新时钟
{
for(i=0;i<8;i++)
{
time_buf1[i]=time_buf2[2*i]*10+time_buf2[2*i+1];//数据整合,如2个数 1和5整合成15
}
Ds1302_Write_Time();//接收更新的时间然后写入ds1302
SetFlag=0; //时钟信息更新后标志位清零
}
if(ReadTimeFlag)
{
ReadTimeFlag=0;
//lcd_display(); //LCD12864显示
displaydate(); //显示日期
displayxq(); //显示星期
displaytime(); //显示时间
disptemp(); //显示温度
displaynl(); //显示农历
Ds1302_Read_Time(); //DS1302读取时间
}
}
}
void Timer0_isr() interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
num++;
if(num==50) //大致100ms
{
num=0;
ReadTimeFlag=1; //读标志位置1
}
}
void Red_Ray(uchar a) //红外遥控处理函数
{
switch(a)
{
case(0x64)://开关背光
backlight=!backlight;
break;
case(0x90)://系统软复位
IAP_CONTR=0x60;
break;
case(0x44)://年+
if(backlight) //如果LCD12864背光开启
{
time_buf1[1]++;
if(time_buf1[1]==100)
{
time_buf1[1]=0;
}
Ds1302_Write_Time();
}
break;
case(0x04)://年-
if(backlight) //如果LCD12864背光开启
{
time_buf1[1]--;
if(time_buf1[1]==255)
{
time_buf1[1]=99;
}
Ds1302_Write_Time();
}
break;
case(0x70)://月+
if(backlight) //如果LCD12864背光开启
{
time_buf1[2]++;
if(time_buf1[2]==13)
{
time_buf1[2]=1;
}
Ds1302_Write_Time();
}
break;
case(0x51)://月-
if(backlight) //如果LCD12864背光开启
{
time_buf1[2]--;
if(time_buf1[2]==0)
{
time_buf1[2]=12;
}
Ds1302_Write_Time();
}
break;
case(0x61)://日+
if(backlight) //如果LCD12864背光开启
{
time_buf1[3]++;
if(time_buf1[3]==32)
{
time_buf1[3]=1;
}
Ds1302_Write_Time();
}
break;
case(0x91)://日-
if(backlight) //如果LCD12864背光开启
{
time_buf1[3]--;
if(time_buf1[3]==0)
{
time_buf1[3]=31;
}
Ds1302_Write_Time();
}
break;
case(0x30)://小时+
if(backlight) //如果LCD12864背光开启
{
time_buf1[4]++;
if(time_buf1[4]==24)
{
time_buf1[4]=0;
}
Ds1302_Write_Time();
}
break;
case(0x81)://小时-
if(backlight) //如果LCD12864背光开启
{
time_buf1[4]--;
if(time_buf1[4]==255)
{
time_buf1[4]=23;
}
Ds1302_Write_Time();
}
break;
case(0x80)://分钟+
if(backlight) //如果LCD12864背光开启
{
time_buf1[5]++;
if(time_buf1[5]==60)
{
time_buf1[5]=0;
}
Ds1302_Write_Time();
}
break;
case(0x31)://分钟-
if(backlight) //如果LCD12864背光开启
{
time_buf1[5]--;
if(time_buf1[5]==255)
{
time_buf1[5]=59;
}
Ds1302_Write_Time();
}
break;
case(0x24)://秒+
if(backlight) //如果LCD12864背光开启
{
time_buf1[6]++;
if(time_buf1[6]==60)
{
time_buf1[6]=0;
}
Ds1302_Write_Time();
}
break;
case(0x25)://秒-
if(backlight) //如果LCD12864背光开启
{
time_buf1[6]--;
if(time_buf1[6]==255)
{
time_buf1[6]=59;
}
Ds1302_Write_Time();
}
break;
}
}
void delay1(uchar x) //x*0.14MS 红外接收专用延时函数
{
uchar i;
while(x--)
{
//for (i = 0; i<13; i++); //12T
for (i = 0; i<70; i++); //1T
}
}
void Int0_isr() interrupt 0 //外部中断0服务函数
{
uchar j,k,N=0;
EX0 = 0;
delay1(15);
if (IRIN==1)
{
EX0 =1;
return;
} //确认IR信号出现
while(!IRIN) //等IR变为高电平,跳过9ms的前导低电平信号。
{
delay1(1);
}
for(j=0;j<4;j++) //收集四组数据
{
for (k=0;k<8;k++) //每组数据有8位
{
while(IRIN) //等 IR 变为低电平,跳过4.5ms的前导高电平信号。
{
delay1(1);
}
while(!IRIN) //等 IR 变为高电平
{
delay1(1);
}
while(IRIN) //计算IR高电平时长
{
delay1(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms计数过长自动离开。
} //高电平计数完毕
IRCOM[j]=IRCOM[j] >> 1; //数据最高位补“0”
if(N>=8)
{
IRCOM[j] = IRCOM[j] | 0x80;
} //数据最高位补"1"
N=0;
}
}
if(IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
IRCOM[5]=IRCOM[2] & 0x0F; //取键码的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位变为低四位
if(IRCOM[5]>9)
{
IRCOM[5]=IRCOM[5]+0x37;
}
else
{
IRCOM[5]=IRCOM[5]+0x30;
}
if(IRCOM[6]>9)
{
IRCOM[6]=IRCOM[6]+0x37;
}
else
{
IRCOM[6]=IRCOM[6]+0x30;
}
EX0 = 1;
Key=(16*IRCOM[5]+IRCOM[6]-17*'0');
Red_Ray(Key);
}
/*
====================
红外遥控器键值表
0x54 0x64 0x74
0x44 0x04 0x34
0x70 0x51 0x90
0x61 0x91 0x40
0x30 0x81 0x55
0x80 0x31 0x15
0x24 0x25 0x14
====================
*/
复制代码
所有资料51hei提供下载:
12864 DS1302 红外遥控 温度显示 农历时钟程序.rar
(250.92 KB, 下载次数: 30)
2019-1-10 17:01 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2019-1-10 17:22
补全原理图或者详细说明一下电路连接即可获得100+黑币
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1