概況:
1,可用鍵盤控制各個(gè)房間的用電器.
2,也可用無線遙控控制各個(gè)房間里的電器.
3,也可連接電腦,用電腦程序,控制各個(gè)房間里的電器.
4,帶一個(gè)大數(shù)碼管實(shí)時(shí)時(shí)鐘,用DS1302做.
只要時(shí)和分位,可代替大鐘.
整點(diǎn)報(bào)時(shí)(蜂鳴一下),可設(shè)定2 個(gè)鬧鈴,
5,可用4*4鍵盤直接調(diào)整時(shí)間,設(shè)定鬧鐘.
6,用兩個(gè)單片機(jī)互相通訊.
7,一個(gè)單片機(jī)負(fù)責(zé)鍵盤,時(shí)鐘,數(shù)碼管顯示,蜂鳴器
(取名2號機(jī))
8,另一個(gè)單片機(jī)負(fù)責(zé)檢測傳感器輸入,連接NRF24L01無線模塊。輸出控制各個(gè)房間用電器,(取名1號機(jī))
9,現(xiàn)在想到輸入傳感器有,2個(gè)光敏電阻傳感器,一個(gè)磁鐵干簧管傳感器。
10,輸出器件有,各房間的電燈,風(fēng)扇,一個(gè)報(bào)警號筒。
功能將會不斷加.......
可學(xué)到的知識點(diǎn):
我認(rèn)最主要的是綜合各個(gè)模塊的能力。
1、DS1302的應(yīng)用
2、鍵盤掃描程序、鍵盤輸入程序、。。。
工程進(jìn)展:
2012年4月3日
做了有一個(gè)星期了,已完成時(shí)間顯示、4*4鍵盤直接調(diào)整時(shí)間、設(shè)定鬧鐘、整點(diǎn)報(bào)時(shí)。
2012年4月9日
現(xiàn)將一些變量、功能函數(shù)名摘錄如下。
bit tiaoshibz;//調(diào)時(shí)標(biāo)示
uchar zhishuPointer;//調(diào)時(shí) 位指針
uchar zhishuPointer;//調(diào)時(shí) 位指針
uchar xianshipointer;//顯示旋轉(zhuǎn)指針
uchar miaojilu;//秒記錄,用于秒位閃爍
uchar miaojishu;//秒位閃亮的時(shí)間
bit miaobz;//秒位閃亮結(jié)束的標(biāo)致
uchar data xiancun[4];//顯示緩存 xiancun[0]為時(shí)的十位 xiancun[3]為分的個(gè)位
uchar miaojilu;//秒記錄,用于秒位閃爍
uchar miaojishu;//秒位閃亮的時(shí)間
bit miaobz;//秒位閃亮結(jié)束的標(biāo)致
uchar data xiancun[4];//顯示緩存 xiancun[0]為時(shí)的十位 xiancun[3]為分的個(gè)位
bit naozhongbz1,naozhongbz2;//鬧鐘啟動標(biāo)致
bit naozhongnaolingbz;//鬧鐘鬧鈴開始標(biāo)致
uchar naozhong1[4];//鬧鐘用定時(shí)用 naozhong[0]為時(shí)的十位 naozhong[3]為分的個(gè)位
uchar naozhong2[4];
uchar zhengdianbaoshi;//整點(diǎn)報(bào)時(shí)
bit naozhongnaolingbz;//鬧鐘鬧鈴開始標(biāo)致
uchar naozhong1[4];//鬧鐘用定時(shí)用 naozhong[0]為時(shí)的十位 naozhong[3]為分的個(gè)位
uchar naozhong2[4];
uchar zhengdianbaoshi;//整點(diǎn)報(bào)時(shí)
/********鍵盤用***********/
uchar code SKEY[16]={10,11,12,13,3,6,9,14,2,5,8,0,1,4,7,15};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/**********DS1302功能函數(shù)聲明**************/
void DS1302InputByte(unsigned char d);
unsigned char DS1302OutputByte(void);
void Write1302(unsigned char ucAddr, unsigned char ucDa);
unsigned char Read1302(unsigned char ucAddr);
void DS1302_SetProtect(bit flag);
void DS1302_SetTime(unsigned char Address, unsigned char Value);
void DS1302_GetTime(struct Clock *Time);
void TimeToStr(struct Clock *Time,bit bz);
/*void DateToStr(struct Clock *Time);*/
void Initial_DS1302(void);
//void BurstWrite1302(unsigned char *pWClock); //往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式)
//void BurstRead1302(unsigned char *pRClock); //讀取DS1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式)
//void DS1302_TimeStop(bit flag); // 是否將時(shí)鐘停止
uchar code SKEY[16]={10,11,12,13,3,6,9,14,2,5,8,0,1,4,7,15};
uchar code act[4]={0xfe,0xfd,0xfb,0xf7};
uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/**********DS1302功能函數(shù)聲明**************/
void DS1302InputByte(unsigned char d);
unsigned char DS1302OutputByte(void);
void Write1302(unsigned char ucAddr, unsigned char ucDa);
unsigned char Read1302(unsigned char ucAddr);
void DS1302_SetProtect(bit flag);
void DS1302_SetTime(unsigned char Address, unsigned char Value);
void DS1302_GetTime(struct Clock *Time);
void TimeToStr(struct Clock *Time,bit bz);
/*void DateToStr(struct Clock *Time);*/
void Initial_DS1302(void);
//void BurstWrite1302(unsigned char *pWClock); //往DS1302寫入時(shí)鐘數(shù)據(jù)(多字節(jié)方式)
//void BurstRead1302(unsigned char *pRClock); //讀取DS1302時(shí)鐘數(shù)據(jù)(時(shí)鐘多字節(jié)方式)
//void DS1302_TimeStop(bit flag); // 是否將時(shí)鐘停止
/***********功能函數(shù)聲明*******************/
char scan_key(void);
void ControlInput(uchar a);
uchar jianceshuzhi(uchar pointer,char n);//檢測輸入數(shù)值是否合法
void zhishu(void);//鍵盤直接輸入
void naozhong(uchar bz1,uchar bz2);//鬧鐘 內(nèi)含整點(diǎn)報(bào)時(shí)(蜂鳴一下)
void baojing(uint);//鬧鈴聲
void shanshuo(uchar a);
/*********串口函數(shù)聲明**************/
void fasong (uchar a); //發(fā)送一字節(jié)
void huiying(void); //回應(yīng)電腦,(發(fā)送輸入,輸出的狀態(tài)給電腦)
void yingda(void);
void yueding(bit a);
void Stringfasong(uchar *p);
char scan_key(void);
void ControlInput(uchar a);
uchar jianceshuzhi(uchar pointer,char n);//檢測輸入數(shù)值是否合法
void zhishu(void);//鍵盤直接輸入
void naozhong(uchar bz1,uchar bz2);//鬧鐘 內(nèi)含整點(diǎn)報(bào)時(shí)(蜂鳴一下)
void baojing(uint);//鬧鈴聲
void shanshuo(uchar a);
/*********串口函數(shù)聲明**************/
void fasong (uchar a); //發(fā)送一字節(jié)
void huiying(void); //回應(yīng)電腦,(發(fā)送輸入,輸出的狀態(tài)給電腦)
void yingda(void);
void yueding(bit a);
void Stringfasong(uchar *p);
前天終于把兩個(gè)單片機(jī)用SPI接口通訊的試驗(yàn)做成功了。
現(xiàn)在正在研究NRF24L01。把這個(gè)實(shí)驗(yàn)做成功,再添加到智能房間程序中,就可以用無線遙控家里的用電器了。
2012年5月1日
NRF24L01 收發(fā)實(shí)驗(yàn)己成功。
2012年5月6日
前幾天研究NRF2401時(shí),一不小心接錯(cuò)了線,燒壞了一塊。
昨天又在淘寶上買了兩塊,現(xiàn)在還在路上。
這幾天又研究了VB程序,就是在我去年編的那個(gè)人機(jī)界面上改的。取名叫“人機(jī)界面”。
下面是截圖:
能實(shí)現(xiàn)的功能有:
8個(gè)命令按鈕可控制P0的狀態(tài),單擊一次,狀態(tài)取反。
綠色正方形指示P0各位狀態(tài)。
8個(gè)綠色圓點(diǎn)指示P2口各位狀態(tài)。
指示都是具有實(shí)時(shí)性的。只要端口狀態(tài)改變,單片機(jī)就會把狀態(tài)發(fā)給電腦指示出來。
前幾天又加了個(gè)調(diào)時(shí)窗口,調(diào)時(shí)窗口的程序有檢測輸入時(shí)數(shù)據(jù)是否合法功能。對不合法的數(shù)據(jù),將拒絕輸入。
經(jīng)過多次調(diào)試,現(xiàn)己實(shí)現(xiàn)了電腦對DS1302的調(diào)時(shí)。
調(diào)時(shí)的過程是,電腦發(fā)把時(shí)間數(shù)據(jù)發(fā)給1號機(jī),一號機(jī)再發(fā)給2號機(jī),和電腦。
研究到無線模塊這里,卡住了,這幾天電腦也出問題。打算先放一段時(shí)間。2012年6月3日
這幾天又有新進(jìn)展了,無線模塊,硬件實(shí)驗(yàn)成功,昨天又在淘寶上買了一個(gè)遠(yuǎn)距離的nRF24l01p,現(xiàn)在正在路上呢,我會盡把無線模塊部分的程序整合到智能房間中去的。2012年7月16日
今天把PLC上模擬定時(shí)器功能給編出來了。
PLC上有T0到Tn個(gè)定時(shí)器,在單片編程中有時(shí)也要用到好多定時(shí)器到延時(shí)或別的什么的。我一直想用C語言實(shí)現(xiàn)這樣的
功能。今天給做出來了。并在實(shí)驗(yàn)板上實(shí)驗(yàn)通過了。現(xiàn)在發(fā)出來與愛好單片機(jī)有朋友們分享。
#include <REG51.H>
#define uint unsigned int
#define uchar unsigned char
//uchar code SEG87[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar jishu;
uint sec;//秒變量,可計(jì)大約18小時(shí),
#define uint unsigned int
#define uchar unsigned char
//uchar code SEG87[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//uchar code SEG7[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar jishu;
uint sec;//秒變量,可計(jì)大約18小時(shí),
//加一個(gè)定時(shí)器就要加一個(gè)記錄當(dāng)前時(shí)間的變量 jilu
//和Tnbz標(biāo)致
uint jilu1,jilu2,jilu3,jilu4,jilu5;
bit t1bz,t2bz,t3bz,t4bz,t5bz;
sbit D1=P3^3;//定義按鍵輸入
sbit D2=P3^4;
sbit D3=P3^5;
sbit D4=P3^2;
uint jilu1,jilu2,jilu3,jilu4,jilu5;
bit t1bz,t2bz,t3bz,t4bz,t5bz;
sbit D1=P3^3;//定義按鍵輸入
sbit D2=P3^4;
sbit D3=P3^5;
sbit D4=P3^2;
/****************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
{for(j=0;j<960;j++)
{;}}
}
/***********************************/
void delay(uint k)
{
uint data i,j;
for(i=0;i<k;i++)
{for(j=0;j<960;j++)
{;}}
}
/***********************************/
/***********************************/
void timer0(void) interrupt 1//用于計(jì)時(shí)
{
TH0=-(35000/256);
TL0=-(40000%256);
jishu++;
if(jishu==20)
sec++;//秒變量 尚未考慮sec溢出情況
}
/***********************************/
void main(void)
{
TH0=-(50000/256);
TL0=-(50000%256);
ET0=1;
EA=1;
TR0=1;
sec=3600;
while(1)
{
//*****虛擬定時(shí)器1******
void timer0(void) interrupt 1//用于計(jì)時(shí)
{
TH0=-(35000/256);
TL0=-(40000%256);
jishu++;
if(jishu==20)
sec++;//秒變量 尚未考慮sec溢出情況
}
/***********************************/
void main(void)
{
TH0=-(50000/256);
TL0=-(50000%256);
ET0=1;
EA=1;
TR0=1;
sec=3600;
while(1)
{
//*****虛擬定時(shí)器1******
if(!t1bz)
{ if(!D1)
{ delay(20);
if(!D1)
{jilu1=sec;
t1bz=1;
}
}
}
if(sec-jilu1==2)//這里的 2 為延時(shí)時(shí)間,改就此值可
{ if(!D1)
{ delay(20);
if(!D1)
{jilu1=sec;
t1bz=1;
}
}
}
if(sec-jilu1==2)//這里的 2 為延時(shí)時(shí)間,改就此值可
//改變延時(shí)時(shí)間
{P2=0xef;
t1bz=0;
}
//*******************************
{P2=0xef;
t1bz=0;
}
//*******************************
if(!t2bz)
{ if(!D2)
{ delay(20);
if(!D2)
{jilu2=sec;
t2bz=1;
}
}
}
if(sec-jilu2==4)
{P2=0xdf;
t2bz=0;
}
//*********************************
if(!t3bz)
{ if(!D3)
{ delay(20);
if(!D3)
{jilu3=sec;
t3bz=1;
}
}
}
if(sec-jilu3==6)
{P2=0xbf;
t3bz=0;
}
//*****下面是用虛擬定時(shí)器4,5實(shí)現(xiàn)P2^0位LED,閃爍。
{ if(!D2)
{ delay(20);
if(!D2)
{jilu2=sec;
t2bz=1;
}
}
}
if(sec-jilu2==4)
{P2=0xdf;
t2bz=0;
}
//*********************************
if(!t3bz)
{ if(!D3)
{ delay(20);
if(!D3)
{jilu3=sec;
t3bz=1;
}
}
}
if(sec-jilu3==6)
{P2=0xbf;
t3bz=0;
}
//*****下面是用虛擬定時(shí)器4,5實(shí)現(xiàn)P2^0位LED,閃爍。
if(!t4bz)
{ jilu5=0;
jilu4=sec;
t4bz=1;
}
if(sec-jilu4==1)
{
P2|=0x01;
t5bz=1;
}
//******************************
if(t5bz)
{
jilu4=0;
jilu5=sec;
{ jilu5=0;
jilu4=sec;
t4bz=1;
}
if(sec-jilu4==1)
{
P2|=0x01;
t5bz=1;
}
//******************************
if(t5bz)
{
jilu4=0;
jilu5=sec;
t5bz=0;
}
if(sec-jilu5==1)
{P2&=0xfe;
t4bz=0;
}
}
}
}
if(sec-jilu5==1)
{P2&=0xfe;
t4bz=0;
}
}
}
自己感覺以上程序比較繞人,費(fèi)腦子。有興趣有朋友看的時(shí)候一定要有耐心哦。
2012年7月22日
智能房間的硬件工作,從上個(gè)星期天正式開始了。這次為了確保能穩(wěn)定可靠的工作,我盡量的避免了用細(xì)如牛毛的細(xì)銅絲作跳線。下面的圖片是進(jìn)展情況。
2012年8月19日
用的是LM339 暫時(shí)接了3個(gè)傳感器,兩個(gè)光敏電阻,一個(gè)溫度電阻,剩下的1/4作備份。