久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
紅外遙控設置電子時鐘帶溫度和鬧鐘單片機源碼
[打印本頁]
作者:
heicad
時間:
2017-7-29 02:22
標題:
紅外遙控設置電子時鐘帶溫度和鬧鐘單片機源碼
分享一個51單片機做的紅外遙控電子時鐘:
0.png
(12.07 KB, 下載次數: 142)
下載附件
2017-7-29 02:20 上傳
單片機源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit fmq=P3^6; //蜂鳴器
sbit key=P1^4; //鬧鐘鳴叫取消鍵
bit irflag,alarmflag,clockflag; //irflag-紅外解碼成功標志 alarmflag-進入鬧鐘設置標志 clockflag-鬧鐘開關標志
uchar ircode[4];//紅外解碼數據數組
uchar code redcode[]="0123456789ABCDEF"; //紅外解碼數據使用的字符
uchar code discode1[]={"DAY:"};
uchar code discode2[]={"TIME:"};
uchar code alarmcode1[]="SET ALARM TIME";
uchar code alarmon[]="ON " ;
uchar code alarmoff[]="OFF";
uchar num; //記錄按鍵次數的變量,用來判斷是否輸入了2個數字,如果輸入了兩個數字就移動光標到第一位
uchar setflag=0; //時鐘設置項變量,用來區(qū)分設置的是時鐘的時 分 秒 日 月 年
uchar hour,minute,h,l,i; //全局變量 DS1302時鐘的小時,分鐘數據,用來在定時器中和鬧鐘的數據比對判斷是否鬧鈴時間已到,
//h-調整時間數據時輸入數據的高位 l-調整時間數據時輸入數據的地位
void delayms(uint xms) //普通延時
{
uint m;
uchar n;
for(m=0;m<xms;m++)
for(n=0;n<129;n++);
}
void delayus() //微秒級延時
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay882(void) //紅外解碼時延時800毫秒
{
uchar a,b;
for(b=8;b>0;b--)
for(a=49;a>0;a--);
}
void delay1000(void) //紅外解碼時延時1000毫秒
{
uchar a,b;
for(b=102;b>0;b--)
for(a=3;a>0;a--);
}
void delay2400(void) //紅外解碼時延時2400毫秒
{
uchar a,b;
for(b=96;b>0;b--)
for(a=10;a>0;a--);
}
void beep() //蜂鳴器鳴叫
{
uchar n;
for(n=0;n<100;n++)
{
fmq=0;
delayms(1);
fmq=1;
delayms(1);
}
}
void ring() //鬧鈴響
{
uchar n;
for(n=0;n<100;n++)
{
fmq=0;
delayms(1);
fmq=1;
delayms(1);
fmq=0;
delayms(5);
fmq=1;
delayms(5);
}
}
//DS1602液晶顯示部分
sbit rs=P2^0;
sbit rw=P2^1;
sbit e=P2^2;
sbit bf=P0^7;
bit ds1602state() //取液晶的忙碌狀態(tài)
{
bit flg;
rs=0;
rw=1;
e=1;
delayus();
flg=bf;
delayus();
e=0;
return flg;
}
void ds1602order(uchar dat) //寫入液晶的命令
{
while(ds1602state());
rs=0;
rw=0;
e=0;
delayus();
P0=dat;
delayus();
e=1;
delayus();
e=0;
}
void ds1602data(uchar dat) //寫入液晶的數據
{
while(ds1602state());
rs=1;
rw=0;
e=0;
delayus();
P0=dat;
delayus();
e=1;
delayus();
e=0;
}
void ds1602address(uchar dat) //寫入液晶的地址
{
ds1602order(0x80|dat);
}
void ds1602init() //液晶初始化
{
delayms(15);
ds1602order(0x38);
delayms(5);
ds1602order(0x0c);
delayms(5);
ds1602order(0x06);
delayms(5);
ds1602order(0x01);
delayms(5);
}
//DS18B20程序
sbit dq=P3^3;
uchar wendu; //DS18B20溫度保存變量
bit ds18b20init() //DS18B20初始化
{
bit flg;
uchar n;
dq=1;
for(n=0;n<2;n++);
dq=0;
for(n=0;n<200;n++);
dq=1;
for(n=0;n<10;n++);
flg=dq;
for(n=0;n<100;n++);
return flg;
}
void ds18b20write(uchar dat) //DS18B20寫入數據
{
uchar n,m;
for(n=0;n<8;n++)
{
dq=1;
_nop_();
dq=0;
_nop_();
dq=dat&0x01;
for(m=0;m<30;m++);
dq=1;
for(m=0;m<2;m++);
dat>>=1;
}
}
uchar ds18b20read() //DS18B20讀出數據
{
uchar n,m,dat;
for(n=0;n<8;n++)
{
dq=1;
_nop_();
dq=0;
_nop_();
dq=1;
for(m=0;m<2;m++);
dat=dat>>1;
if(dq==1)
dat|=0x80;
dq=1;
for(m=0;m<2;m++);
}
return dat;
}
void ds18b20wendu() //DS18B20溫度轉換 沒有對負溫度進行相關的判斷和操作
{
uchar wenduh,wendul;
ds18b20init();
ds18b20write(0xcc);
ds18b20write(0x44);
ds18b20init();
ds18b20write(0xcc);
ds18b20write(0xbe);
wendul=ds18b20read();
wenduh=ds18b20read();
wendu=(wendul>>4)|(wenduh<<4);
}
//DS1302時鐘程序
sbit scl=P1^0;
sbit sd=P1^1;
sbit rst=P1^2;
uchar code discode3[]={"0123456789"}; //DS1302時鐘顯示使用的字符數據
void ds1302write(uchar dat) //DS1302寫數據
{
uchar n;
scl=0;
for(n=0;n<8;n++)
{
sd=dat&0x01;
delayus();
scl=1;
delayus();
scl=0;
delayus();
dat>>=1;
}
}
uchar ds1302read() //DS1302讀數據
{
uchar dat,n;
for(n=0;n<8;n++)
{
dat>>=1;
if(sd==1)
dat|=0x80;
scl=1;
delayus();
scl=0;
delayus();
}
return dat;
}
void ds1302writedata(uchar add,uchar dat) //DS1302寫入指定地址數據
{
rst=0;
scl=0;
rst=1;
ds1302write(add);
ds1302write(dat);
scl=1;
rst=0;
}
uchar ds1302readdata(uchar add) //DS1302讀出指定地址數據
{
uchar dat;
rst=0;
scl=0;
rst=1;
ds1302write(add);
dat=ds1302read();
scl=1;
rst=0;
return dat;
}
void ds1302init() //DS1302寫入初始數據
{
if(ds1302readdata(0x81)&0x80)
{
ds1302writedata(0x8e,0x00);
ds1302writedata(0x80,0x00);
ds1302writedata(0x82,0x25);
ds1302writedata(0x84,0x12);
ds1302writedata(0x86,0x02);
ds1302writedata(0x88,0x04);
ds1302writedata(0x8a,0x02);
ds1302writedata(0x8c,0x13);
ds1302writedata(0x8e,0x80);
ds1302writedata(0x90,0xa5);
}
}
void ds1302disp() //DS1302時鐘數據顯示
{
uchar secondh,secondl,minuteh,minutel,hourh,hourl,dayh,dayl,monthh,monthl,week,yearh,yearl; //時鐘數據的相關高位和地位
hour=ds1302readdata(0x85);
minute=ds1302readdata(0x83);
secondh=ds1302readdata(0x81)>>4; //DS1302秒數據的高位
secondl=ds1302readdata(0x81)&0x0f; //DS1302秒數據的低位
minuteh=minute>>4;
minutel=minute&0x0f;
hourh=hour>>4;
hourl=hour&0x0f;
dayh=ds1302readdata(0x87)>>4;
dayl=ds1302readdata(0x87)&0x0f;
monthh=ds1302readdata(0x89)>>4;
monthl=ds1302readdata(0x89)&0x0f;
yearh=ds1302readdata(0x8d)>>4;
yearl=ds1302readdata(0x8d)&0x0f;
week=ds1302readdata(0x8b)&0x0f;
ds1602address(0x04);
ds1602data('2');
ds1602data('0');
ds1602data(discode3[yearh]);
ds1602data(discode3[yearl]);
ds1602data('-');
ds1602data(discode3[monthh]);
ds1602data(discode3[monthl]);
ds1602data('-');
ds1602data(discode3[dayh]);
ds1602data(discode3[dayl]);
ds1602data(' ');
ds1602data(discode3[week]);
ds1602address(0x45);
ds1602data(discode3[hourh]);
ds1602data(discode3[hourl]);
ds1602data(':');
ds1602data(discode3[minuteh]);
ds1602data(discode3[minutel]);
ds1602data(':');
ds1602data(discode3[secondh]);
ds1602data(discode3[secondl]);
ds1602data(' ');
ds1602data(discode3[wendu/10]);
ds1602data(discode3[wendu%10]);
}
//24c08讀寫程序
sbit sclk=P3^4;
sbit sda=P3^5;
uchar alarmcode[4]; //24c08中保存的鬧鐘數據,alarmcode[0]-鬧鐘數據的小時 alarmcode[1]-鬧鐘數據的分鐘 alarmcode[2]-鬧鐘數據的秒
//alarmcode[3]-鬧鐘開關標志 (0為鬧鐘關閉,1為鬧鐘開啟)
void iic24c08start() //24c08啟動
{
sda=1;
sclk=1;
delayus();
sda=0;
sclk=0;
delayus();
}
void iic24c08stop() //24c08停止
{
sda=0;
sclk=1;
delayus();
sda=1;
delayus();
}
void iic24c08answer() //24c08應答
{
uchar n;
sclk=1;
delayus();
while((sda==1)&&(n<255))
n++;
sclk=0;
delayus();
}
void iic24c08write(uchar dat) //24c08寫數據
{
uchar n;
for(n=0;n<8;n++)
{
sda=dat&0x80;
delayus();
sclk=1;
delayus();
sclk=0;
delayus();
dat<<=1;
}
}
uchar iic24c08read() //24c08讀數據
{
uchar n,dat;
for(n=0;n<8;n++)
{
sclk=1;
dat<<=1;
if(sda==1)
dat|=0x01;
delayus();
sclk=1;
delayus();
sclk=0;
delayus();
}
return dat;
}
void iic24c08writeadd(uchar add,uchar dat) //24c08寫指定地址數據
{
iic24c08start();
iic24c08write(0xa0);
iic24c08answer();
iic24c08write(add);
iic24c08answer();
iic24c08write(dat);
iic24c08answer();
iic24c08stop();
delayms(15);
}
uchar iic24c08readadd(uchar add) //24c08讀指定地址數據
{
uchar dat;
iic24c08start();
iic24c08write(0xa0);
iic24c08answer();
iic24c08write(add);
iic24c08answer();
iic24c08start();
iic24c08write(0xa1);
iic24c08answer();
dat=iic24c08read();
iic24c08stop();
return dat;
}
//紅外解碼程序
sbit ir=P3^2;
void decode()
{
uchar u,m;
while(ir==0);
delay2400();
if(ir==1) //延時2.4ms后如果是高電平則是新碼
{
delay2400(); //延時4.8ms避開4.5ms的高電平
for(u=0;u<4;u++)
{
for(m=0;m<8;m++)
{
while(ir==0); //等待地址碼第1位高電平到來
delay882(); //延時882ms判斷此時引腳電平
if(ir==0)
{
ircode[u]>>=1;
ircode[u]=ircode[u]&0x7f;
}
else if(ir==1)
{
delay1000();
ircode[u]>>=1;
ircode[u]=ircode[u]|0x80;
}
} //1位數據接收結束
} //32位二進制碼接收結束
}
if(ircode[2]==~ircode[3])
{ irflag=1;
}
}
//外部中斷0和定時器0初始化
void timeinit()
{
EA=1;
EX0=1;
IT0=1;
ET0=1;
TMOD=0X01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=0;
}
void main()
{
uchar n; //計數次數變量
timeinit();
ds1602init();
ds1602address(0x00);
while(discode1[n]!='\0') //在DS1602寫入字符 DATE
{
ds1602data(discode1[n]);
n++;
}
n=0;
ds1602address(0x40);
while(discode2[n]!='\0') //在DS1602寫入字符 TIME
{
ds1602data(discode2[n]);
n++;
}
ds1302init();
n=0;
for(n=0;n<4;n++)
{
alarmcode[n]=iic24c08readadd(n);
}
clockflag=(bit)alarmcode[3];
if(clockflag)
{
TR0=1;
}
while(1)
{
if(setflag==0&&alarmflag==0)
{
ds18b20wendu();
ds1302disp();
}
if(irflag==1) //紅外解碼成功后通過switch函數匹配紅外碼對應的操作
{
switch(ircode[2])
{
case 0x45: //設置時鐘的年 光標在年數據第一位上閃爍
if(alarmflag==0) //如果已經進入了鬧鐘設置界面,按此紅外碼無效
{
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x06);
delayms(5);
setflag=1;
h=ds1302readdata(0x8d)>>4;
l=ds1302readdata(0x8d)&0x0f;
beep();
}
break;
case 0x46: //設置時鐘的月 光標在月數據第一位上閃爍
if(alarmflag==0)
{
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x09);
delayms(5);
setflag=2;
h=ds1302readdata(0x89)>>4;
l=ds1302readdata(0x89)&0x0f;
beep();
}
break;
case 0x47: //設置時鐘的日 光標在日數據第一位上閃爍
if(alarmflag==0)
{
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x0c);
delayms(5);
setflag=3;
h=ds1302readdata(0x87)>>4;
l=ds1302readdata(0x87)&0x0f;
beep();
}
break;
case 0x44://設置時鐘的星期 光標在星期數據第一位上閃爍
if(alarmflag==0)
{
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x0f);
delayms(5);
setflag=4;
h=ds1302readdata(0x8b)>>4;
l=ds1302readdata(0x8b)&0x0f;
beep();
}
break;
case 0x40: //設置時鐘的小時 光標在小時數據第一位上閃爍
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x45);
if(alarmflag==0) //設置時鐘小時數據 (alarmflag=1時表示已經進入鬧鐘設置界面)
{
setflag=5;
h=ds1302readdata(0x85)>>4;
l=ds1302readdata(0x85)&0x0f;
beep();
}
else //設置鬧鐘小時
{
setflag=8;
h=alarmcode[0]>>4;
l=alarmcode[0]&0x0f;
beep();
}
break;
case 0x43: //設置時鐘的分 光標在分數據第一位上閃爍
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x48);
delayms(5);
if(alarmflag==0)
{
setflag=6;
h=ds1302readdata(0x83)>>4;
l=ds1302readdata(0x83)&0x0f;
beep();
}
else
{
setflag=9;
h=alarmcode[1]>>4;
l=alarmcode[1]&0x0f;
beep();
}
break;
case 0x07: //設置時鐘的秒 光標在秒數據第一位上閃爍
num=0;
ds1602order(0x0f);
delayms(5);
ds1602address(0x4b);
delayms(5);
if(alarmflag==0)
{
setflag=7;
h=ds1302readdata(0x81)>>4;
l=ds1302readdata(0x81)&0x0f;
beep();
}
else
{
setflag=10;
h=alarmcode[2]>>4;
l=alarmcode[2]&0x0f;
beep();
}
break;
case 0x19: //進入鬧鐘設置界面
alarmflag=1;
setflag=0;
for(n=0;n<4;n++) //從24c08中讀取鬧鐘數據以便在下面顯示
{
alarmcode[n]=iic24c08readadd(n);
}
clockflag=(bit)alarmcode[3];
beep();
ds1602order(0x01);
delayms(5);
ds1602order(0xc);
ds1602address(0x01);
n=0;
while(alarmcode1[n]!='\0') //在DS1602顯示字符SET ALARM TIME
{
ds1602data(alarmcode1[n]);
n++;
}
n=0;
if(alarmcode[3]==0) //根據24c08中鬧鐘開關數據顯示相應的字符ON OFF
{
ds1602address(0x41);
while(alarmoff[n]!='\0')
{
ds1602data(alarmoff[n]);
n++;
}
}
else
{
ds1602address(0x41);
while(alarmon[n]!='\0')
{
ds1602data(alarmon[n]);
n++;
}
}
ds1602address(0x45);
ds1602data(discode3[alarmcode[0]>>4]);
ds1602data(discode3[alarmcode[0]&0x0f]);
ds1602data(':');
ds1602data(discode3[alarmcode[1]>>4]);
ds1602data(discode3[alarmcode[1]&0x0f]);
ds1602data(':');
ds1602data(discode3[alarmcode[2]>>4]);
ds1602data(discode3[alarmcode[2]&0x0f]);
ds1602address(0x40);
break;
case 0x0d: //鬧鐘開關設置
if(alarmflag==1)
{
beep();
ds1602order(0x0c);
clockflag=~clockflag;
if(clockflag==0)
{
ds1602address(0x41);
n=0;
while(alarmoff[n]!='\0')
{
ds1602data(alarmoff[n]);
n++;
}
iic24c08writeadd(0x03,0x00);
TR0=0;
}
else
{
ds1602address(0x41);
n=0;
while(alarmon[n]!='\0')
{
ds1602data(alarmon[n]);
n++;
}
iic24c08writeadd(0x03,0x01);
TR0=1;
for(n=0;n<4;n++)
{
alarmcode[n]=iic24c08readadd(n);
}
}
}
break;
case 0x16: //輸入字符0
if(setflag!=0)
{
num++; //輸入次數加1
ds1602data('0');
switch(num) //匹配輸入次數
{
case 1: h=0; break; //高位數據
case 2: num=0; l=0; ds1602order(0x10);delayms(5); ds1602order(0x10); delayms(5);break; //低位數據
}
beep();
}
break;
case 0x0c:
if(setflag!=0)
{
num++;
ds1602data('1');
switch(num)
{
case 1: h=1; break;
case 2: num=0;l=1;ds1602order(0x10);delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0x18:
if(setflag!=0)
{
num++;
ds1602data('2');
switch(num)
{
case 1: h=2; break;
case 2: num=0; l=2;ds1602order(0x10);delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0X5E:
if(setflag!=0)
{
num++;
ds1602data('3');
switch(num)
{
case 1: h=3; break;
case 2: num=0; l=3;ds1602order(0x10); delayms(5); ds1602order(0x10); delayms(5);break;
}
beep();
}
break;
case 0X08:
if(setflag!=0)
{
num++;
ds1602data('4');
switch(num)
{
case 1: h=4; break;
case 2: num=0; l=4; ds1602order(0x10);delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0X1C:
if(setflag!=0)
{
num++;
ds1602data('5');
switch(num)
{
case 1: h=5; break;
case 2: num=0; l=5; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0X5A:
if(setflag!=0)
{
num++;
ds1602data('6');
switch(num)
{
case 1: h=6; break;
case 2: num=0; l=6; ds1602order(0x10); delayms(5); ds1602order(0x10); delayms(5);break;
}
beep();
}
break;
case 0X42:
if(setflag!=0)
{
num++;
ds1602data('7');
switch(num)
{
case 1: h=7; break;
case 2: num=0; l=7; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0X52:
if(setflag!=0)
{
num++;
ds1602data('8');
switch(num)
{
case 1: h=8; break;
case 2: num=0; l=8; ds1602order(0x10); delayms(5); ds1602order(0x10);delayms(5); break;
}
beep();
}
break;
case 0X4A:
if(setflag!=0)
{
num++;
ds1602data('9');
switch(num)
{
case 1: h=9; break;
case 2: num=0; l=9; ds1602order(0x10);delayms(5); ds1602order(0x10); delayms(5);break;
}
beep();
}
break;
case 0X15: //取消返回碼
setflag=0;
irflag=0;
if(alarmflag==1) //如果進入過鬧鐘設置界面,需要重新寫入DS1302的初始字符數據
{
alarmflag=0;
n=0;
ds1602address(0x00);
while(discode1[n]!='\0')
{
ds1602data(discode1[n]);
n++;
}
n=0;
ds1602address(0x40);
while(discode2[n]!='\0')
{
ds1602data(discode2[n]);
n++;
}
}
beep();
……………………
…………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
紅外遙控設置電子時鐘帶溫度和鬧鐘.rar
(57.67 KB, 下載次數: 44)
2017-7-29 02:19 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
一区2区
|
日韩中文字幕一区
|
亚洲精品久久久一区二区三区
|
日韩毛片在线视频
|
亚洲第1页
|
日韩欧美一区二区三区免费观看
|
七七婷婷婷婷精品国产
|
91精品国产综合久久久久久丝袜
|
中文字幕在线欧美
|
日韩高清一区
|
免费九九视频
|
久久免费精品
|
国产精品久久久久久久7电影
|
亚洲国产精品视频
|
亚洲一区二区三区欧美
|
日韩中文字幕
|
亚洲激情综合
|
欧美精品成人一区二区三区四区
|
精品色
|
国产成人精品午夜视频免费
|
国产精品久久在线观看
|
精品一区二区三区四区视频
|
久草新在线
|
国产欧美日韩综合精品一区二区
|
欧美一区二区成人
|
久久亚洲欧美日韩精品专区
|
欧美另类视频
|
欧美一区二区在线观看
|
精品不卡
|
婷婷色国产偷v国产偷v小说
|
99这里只有精品视频
|
性一交一乱一透一a级
|
国产福利91精品
|
狠狠躁躁夜夜躁波多野结依
|
91一区二区
|
午夜专区
|
91精品国产综合久久久久蜜臀
|
国产高清一区二区
|
正在播放国产精品
|
成人1区
|
欧美国产精品
|