標(biāo)題:
單片機(jī)紅外遙控可調(diào)時(shí)鐘程序源代碼
[打印本頁(yè)]
作者:
niujia
時(shí)間:
2015-7-15 23:31
標(biāo)題:
單片機(jī)紅外遙控可調(diào)時(shí)鐘程序源代碼
數(shù)碼管顯示部分的原理圖(開(kāi)發(fā)板中只需要截圖顯示部分即可):
http://www.torrancerestoration.com/f/51hei-5.pdf
電路:紅外接收頭接在 單片機(jī)的
外部中斷0口。數(shù)碼管用8位共陰極數(shù)碼管,2個(gè)573鎖存 詳見(jiàn)上面的51hei單片機(jī)開(kāi)發(fā)板的pdf圖,本人測(cè)試成了.
程序源代碼:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
uchar smg_du[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar smg_we[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar miao,fen,shi,flag_set,key_can;
uchar startflag,bitnum,irtime;
uchar irreceok,irprosok,flag_s;
bit flag_500ms;
uchar dis_smg[6];
uchar irdata[33];
uchar ircode[4];
uchar bdata bdat;
sbit dat0=bdat^0;
sbit dat1=bdat^1;
sbit dat2=bdat^2;
sbit dat3=bdat^3;
sbit dat4=bdat^4;
sbit dat5=bdat^5;
sbit dat6=bdat^6;
sbit dat7=bdat^7;
void smg_s(uchar dat) //用于閃爍
{
bdat=dat;
if(dat0==1)
dis_smg[0]=0x00;
if(dat1==1)
dis_smg[1]=0x00;
if(dat2==1)
dis_smg[2]=0x00;
if(dat3==1)
dis_smg[3]=0x00;
if(dat4==1)
dis_smg[4]=0x00;
if(dat5==1)
dis_smg[5]=0x00;
if(dat6==1)
dis_smg[6]=0x00;
if(dat7==1)
dis_smg[7]=0x00;
}
void dis_init() //顯示初始化
{
dis_smg[0]=smg_du[miao%10];
dis_smg[1]=smg_du[miao/10];
dis_smg[2]=smg_du[fen%10]|0x80;
dis_smg[3]=smg_du[fen/10];
dis_smg[4]=smg_du[shi%10]|0x80;
dis_smg[5]=smg_du[shi/10];
}
void display()
{
static uchar i;
P0=0x00;
dula=1;
dula=0;
P0=smg_we[5-i];
wela=1;
wela=0;
P0=dis_smg[i];
dula=1;
dula=0;
i++;
if(i==6)
i=0;
}
void timer0_init() //定時(shí)器0方式1,用于時(shí)鐘定時(shí)
{
TH0=0;
TL0=0;
ET0=1;
TR0=1;
}
//定時(shí)器1方式2,用于紅外時(shí)間加數(shù)
void timer1_init()
{
TMOD=0X20|0x01; //選擇定時(shí)器0和定時(shí)器1
TH1=0;
TL1=0;
ET1=1;
TR1=1;
EA=1;
}
//外部中斷0,用于確定紅外數(shù)據(jù)
void int0_init()
{ //下降沿觸發(fā)
IT0=1;
EX0=1;
EA=1;
}
void irpros() //紅外數(shù)據(jù)處理函數(shù)
{
uchar k=1,value;
uchar i,j;
for(j=0;j<4;j++)
{
for(i=0;i<8;i++)
{
value=value>>1; //低位在前,高位在后
if(irdata[k]>6) //比較數(shù)據(jù),確定數(shù)據(jù)為1還是為0
{
value=value|0x80; //數(shù)據(jù)為一
}
k++;
}
ircode[j]=value;
}
irprosok=1;
}
void keyinit() //按鍵初始化
{
switch(ircode[3])
{
case 0xfe:key_can=1;break; //選擇鍵
case 0xfd:key_can=2;break; //加鍵
case 0xff:key_can=3;break; //減鍵
}
ircode[3]=0; //紅外數(shù)據(jù)最后一位
}
void clock_can() //時(shí)間調(diào)整
{
if(key_can==1)
{
key_can=0;
flag_set++;
if(flag_set>=4)
{
flag_set=0;
flag_s=0x00;
}
if(flag_set==1)
flag_s=0x30;
if(flag_set==2)
flag_s=0x0c;
if(flag_set==3)
flag_s=0x03;
}
if(key_can==2)
{
key_can=0;
if(flag_set==1)
{
shi++;
if(shi>=24)
shi=0;
}
if(flag_set==2)
{
fen++;
if(fen>=60)
fen=0;
}
if(flag_set==3)
{
miao++;
if(miao>=60)
miao=0;
}
}
if(key_can==3)
{
key_can=0;
if(flag_set==1)
{
if(shi==0)
shi=24;
shi--;
}
if(flag_set==2)
{
if(fen==0)
fen=60;
fen--;
}
if(flag_set==3)
{
if(miao==0)
miao=60;
miao--;
}
}
}
void main()
{
timer0_init();
timer1_init();
int0_init();
dis_init();
while(1)
{
if(flag_500ms)
dis_init();
else
smg_s(flag_s);
if(irreceok)
{
irpros();
irreceok=0;
}
if(irprosok)
{
irprosok=0;
dis_init();
}
keyinit();
clock_can();
display();
}
}
void timer0() interrupt 1
{
static uchar i,j;
TH0=0x3c;
TL0=0xb0;
j++;
if(j>=10)
{
j=0;
flag_500ms=~flag_500ms;
}
i++;
if(flag_set==0)
if(i>=20)
{
i=0;
miao++;
if(miao>=60)
{
miao=0;
fen++;
if(fen>=60)
{
fen=0;
shi++;
if(shi>=24)
{
shi=0;
}
}
}
}
}
void timer1() interrupt 3
{
irtime++;
}
void int0() interrupt 0
{
if(startflag)
{
if(irtime>32)
{
bitnum=0;
}
irdata[bitnum]=irtime;
irtime=0;
bitnum++;
if(bitnum==33)
{
bitnum=0;
irreceok=1;
}
}
else
{
startflag=1;
irtime=0;
}
}
復(fù)制代碼
作者:
micmiutom
時(shí)間:
2017-5-1 16:55
能提供一下電路圖嗎?
作者:
lids
時(shí)間:
2017-5-2 14:20
本帖最后由 lids 于 2017-5-2 14:24 編輯
用的什么遙控器,是不是圖片這種遙控器,我把程序下載到單片機(jī),6位數(shù)碼管能顯示走時(shí),但是按遙控器沒(méi)反應(yīng)
QQ截圖20170502142309.png
(93.13 KB, 下載次數(shù): 43)
下載附件
2017-5-2 14:23 上傳
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1