标题:
单片机红外遥控可调时钟程序源代码
[打印本页]
作者:
niujia
时间:
2015-7-15 23:31
标题:
单片机红外遥控可调时钟程序源代码
数码管显示部分的原理图(开发板中只需要截图显示部分即可):
http://www.51hei.com/f/51hei-5.pdf
电路:红外接收头接在 单片机的
外部中断0口。数码管用8位共阴极数码管,2个573锁存 详见上面的51hei单片机开发板的pdf图,本人测试成了.
程序源代码:
#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() //定时器0方式1,用于时钟定时
{
TH0=0;
TL0=0;
ET0=1;
TR0=1;
}
//定时器1方式2,用于红外时间加数
void timer1_init()
{
TMOD=0X20|0x01; //选择定时器0和定时器1
TH1=0;
TL1=0;
ET1=1;
TR1=1;
EA=1;
}
//外部中断0,用于确定红外数据
void int0_init()
{ //下降沿触发
IT0=1;
EX0=1;
EA=1;
}
void irpros() //红外数据处理函数
{
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) //比较数据,确定数据为1还是为0
{
value=value|0x80; //数据为一
}
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; //红外数据最后一位
}
void clock_can() //时间调整
{
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;
}
}
复制代码
作者:
micmiutom
时间:
2017-5-1 16:55
能提供一下电路图吗?
作者:
lids
时间:
2017-5-2 14:20
本帖最后由 lids 于 2017-5-2 14:24 编辑
用的什么遥控器,是不是图片这种遥控器,我把程序下载到单片机,6位数码管能显示走时,但是按遥控器没反应
QQ截图20170502142309.png
(93.13 KB, 下载次数: 43)
下载附件
2017-5-2 14:23 上传
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1