標題:
單片機+12864+DS1302+紅外遙控+溫度顯示+農(nóng)歷時鐘程序
[打印本頁]
作者:
這是個用戶名
時間:
2019-1-10 17:02
標題:
單片機+12864+DS1302+紅外遙控+溫度顯示+農(nóng)歷時鐘程序
單片機源程序如下:
#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; //紅外接收器數(shù)據(jù)線
uchar IRCOM[7];
uchar Key; //紅外遙控器鍵值
void Init_Timer0() //定時器0初始化
{
TMOD |= 0x01; //使用模式1,16位定時器,使用"|"符號可以在使用多個定時器時不受影響
EA=1; //總中斷打開
ET0=1; //定時器中斷打開
TR0=1; //定時器開關(guān)打開
}
void Init_Int0() // 外部中斷0初始化
{
IT0 = 1; //指定外部中斷0下降沿觸發(fā),INT0 (P3.2)
EX0 = 1; //使能外部中斷
EA = 1; //開總中斷
}
void main()
{
uchar i=0; //
lcm_init(); //液晶初始化
welcome(); //調(diào)用歡迎信息
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];//數(shù)據(jù)整合,如2個數(shù) 1和5整合成15
}
Ds1302_Write_Time();//接收更新的時間然后寫入ds1302
SetFlag=0; //時鐘信息更新后標志位清零
}
if(ReadTimeFlag)
{
ReadTimeFlag=0;
//lcd_display(); //LCD12864顯示
displaydate(); //顯示日期
displayxq(); //顯示星期
displaytime(); //顯示時間
disptemp(); //顯示溫度
displaynl(); //顯示農(nóng)歷
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) //紅外遙控處理函數(shù)
{
switch(a)
{
case(0x64)://開關(guān)背光
backlight=!backlight;
break;
case(0x90)://系統(tǒng)軟復位
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 紅外接收專用延時函數(shù)
{
uchar i;
while(x--)
{
//for (i = 0; i<13; i++); //12T
for (i = 0; i<70; i++); //1T
}
}
void Int0_isr() interrupt 0 //外部中斷0服務(wù)函數(shù)
{
uchar j,k,N=0;
EX0 = 0;
delay1(15);
if (IRIN==1)
{
EX0 =1;
return;
} //確認IR信號出現(xiàn)
while(!IRIN) //等IR變?yōu)楦唠娖,跳過9ms的前導低電平信號。
{
delay1(1);
}
for(j=0;j<4;j++) //收集四組數(shù)據(jù)
{
for (k=0;k<8;k++) //每組數(shù)據(jù)有8位
{
while(IRIN) //等 IR 變?yōu)榈碗娖,跳過4.5ms的前導高電平信號。
{
delay1(1);
}
while(!IRIN) //等 IR 變?yōu)楦唠娖?br />
{
delay1(1);
}
while(IRIN) //計算IR高電平時長
{
delay1(1);
N++;
if (N>=30)
{
EX0=1;
return;
} //0.14ms計數(shù)過長自動離開。
} //高電平計數(shù)完畢
IRCOM[j]=IRCOM[j] >> 1; //數(shù)據(jù)最高位補“0”
if(N>=8)
{
IRCOM[j] = IRCOM[j] | 0x80;
} //數(shù)據(jù)最高位補"1"
N=0;
}
}
if(IRCOM[2]!=~IRCOM[3])
{
EX0=1;
return;
}
IRCOM[5]=IRCOM[2] & 0x0F; //取鍵碼的低四位
IRCOM[6]=IRCOM[2] >> 4; //右移4次,高四位變?yōu)榈退奈?br />
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 紅外遙控 溫度顯示 農(nóng)歷時鐘程序.rar
(250.92 KB, 下載次數(shù): 30)
2019-1-10 17:01 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
作者:
admin
時間:
2019-1-10 17:22
補全原理圖或者詳細說明一下電路連接即可獲得100+黑幣
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1