標(biāo)題: 單片機(jī)設(shè)計(jì)四路定時(shí)開(kāi)關(guān),匯編,c均可 ,要求有注釋, 求幫助 [打印本頁(yè)]
作者: 18439776334 時(shí)間: 2018-12-26 21:37
標(biāo)題: 單片機(jī)設(shè)計(jì)四路定時(shí)開(kāi)關(guān),匯編,c均可 ,要求有注釋, 求幫助
3.四路定時(shí)開(kāi)關(guān)
總體要求:基于51單片機(jī)設(shè)計(jì)一個(gè)定時(shí)開(kāi)關(guān)用于定時(shí)控制四個(gè)回路的電源通斷。
基本要求:
1.主要應(yīng)用于定時(shí)控制四個(gè)回路的電源通斷。
2.以當(dāng)前時(shí)間為基準(zhǔn),以24小時(shí)為周期,可以任意設(shè)定哪個(gè)回路于某時(shí)刻開(kāi),到某時(shí)刻關(guān)。如可以設(shè)置第一個(gè)回路在8:30-11:30開(kāi),14:30-18:00開(kāi),其他時(shí)間段為關(guān)。
3.顯示出四路開(kāi)關(guān)的狀態(tài)及剩余時(shí)間。
作者: qaz963 時(shí)間: 2018-12-29 14:38
#include"reg51.h"
#define uint unsigned int
#define uchar unsigned char
sbit D9=P3^2;
sbit D10=P3^3;
sbit D11=P3^4;
sbit D12=P3^5;
sbit H1=P3^6;
sbit H2=P3^7;
sbit out1=P0^4;
sfr P1M1=0x91;
sfr P1M0=0x92;
bit sflag;
uchar num,shi,fen,k;
uchar shi1k,fen1k,shi2k,fen2k,shi3k,fen3k,shi4k,fen4k;
uchar shi1g,fen1g,shi2g,fen2g,shi3g,fen3g,shi4g,fen4g;
uchar s1;
unsigned int table1[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07,
0x7f,0x6f}; //數(shù)組共陰數(shù)碼管顯示從0到9
unsigned int table2[]={0xf7,0xfb,0xfd,0xfe}; //數(shù)碼管位定義
unsigned int table3[4]={0};
void display(unsigned char shi,unsigned char fen);
unsigned char key();
void Delay10ms();
void main()
{
P1M0=0xff;
P1M1=0x00;
TMOD=0x10;
TH1=0xd8;
TL1=0xf0;
EA=1; //總中斷
ET1=1; //定時(shí)器中斷
TR1=1; //開(kāi)啟定時(shí)器
while(1)
{
if(s1==0)
{
display(shi,fen);
}
k=key();
if(k==1)
{
s1++;
}
if(s1!=0)
{
TR1=0;
if(s1==1)
{
if(k==2) shi++;
if(k==3) shi--;
if(k==5) fen++;
if(k==6) fen--;
P2=0xfe;
display(shi,fen);
}
if(s1==2)
{
if(k==2) shi1k++;
if(k==3) shi1k--;
if(k==5) fen1k++;
if(k==6) fen1k--;
P2=0xfd;
display(shi1k,fen1k);
}
if(s1==3)
{
if(k==2) shi1g++;
if(k==3) shi1g--;
if(k==5) fen1g++;
if(k==6) fen1g--;
P2=0xff;
display(shi1g,fen1g);
}
if(s1==4)
{
if(k==2) shi2k++;
if(k==3) shi2k--;
if(k==5) fen2k++;
if(k==6) fen2k--;
P2=0xfb;
display(shi2k,fen2k);
}
if(s1==5)
{
if(k==2) shi2g++;
if(k==3) shi2g--;
if(k==5) fen2g++;
if(k==6) fen2g--;
P2=0xff;
display(shi2g,fen2g);
}
if(s1==6)
{
if(k==2) shi3k++;
if(k==3) shi3k--;
if(k==5) fen3k++;
if(k==6) fen3k--;
P2=0xf7;
display(shi3k,fen3k);
}
if(s1==7)
{
if(k==2) shi3g++;
if(k==3) shi3g--;
if(k==5) fen3g++;
if(k==6) fen3g--;
P2=0xff;
display(shi3g,fen3g);
}
if(s1==8)
{
if(k==2) shi4k++;
if(k==3) shi4k--;
if(k==5) fen4k++;
if(k==6) fen4k--;
P2=0xef;
display(shi4k,fen4k);
}
if(s1==9)
{
if(k==2) shi4g++;
if(k==3) shi4g--;
if(k==5) fen4g++;
if(k==6) fen4g--;
P2=0xff;
display(shi4g,fen4g);
}
if(s1==10)
{
s1=0;
TR1=1;
sflag=1;
}
}
if(s1==0&&sflag==1)
{
if(shi==shi1k&&fen==fen1k) {out1=0; D9=0;}
if(shi==shi1g&&fen==fen1g) { out1=1;D9=1;}
if(shi==shi2k&&fen==fen2k) D10=0;
if(shi==shi2g&&fen==fen2g) D10=1;
if(shi==shi3k&&fen==fen3k) D11=0;
if(shi==shi3g&&fen==fen3g) D11=1;
if(shi==shi4k&&fen==fen4k) D12=0;
if(shi==shi4g&&fen==fen4g) D12=1;
}
}
}
unsigned char key()
{
uchar temp1,temp2,k=0;
P0=0xff; //將P0口(列線)全部送高電平
H1=0;
H2=1;
temp1=P0; //讀取P0口當(dāng)前的狀態(tài)賦給temp,例如為11011111
temp1=temp1&0xe0;//將temp和0xe0進(jìn)行與運(yùn)算(11100000),結(jié)果為11000000
if(temp1!=0xe0) //如果temp不等于0xe0,則說(shuō)明有按鍵按下
{
Delay10ms(); //延時(shí)去抖操作
temp1=P0; //再重復(fù)一次上述操作
temp1=temp1&0xe0;
if(temp1!=0xe0)
{
temp1=P0;
//如果有按鍵按下,則將標(biāo)志位置1?
switch(temp1) //判斷按下的是該行的第幾列
{
case 0xdf:k=1;break; //11011111,第一行第一列
case 0xbf: k=2;break; //10111111,第一行,第二列
case 0x7f: k=3;break; //01111111,第一行,第三列
}
while(temp1!=0xe0) //等待按鍵釋放,只要結(jié)果不等于0xe0,則說(shuō)明按鍵沒(méi)有被釋放
{
temp1=P0;
temp1=temp1&0xe0;
}
}
}
P0=0xff; //將P0口(列線)全部送高電平
H1=1;
H2=0;
temp2=P0; //讀取P0口當(dāng)前的狀態(tài)賦給temp,例如為11011111
temp2=temp2&0xe0;//將temp和0xe0進(jìn)行與運(yùn)算(11100000),結(jié)果為11000000
if(temp2!=0xe0) //如果temp不等于0xe0,則說(shuō)明有按鍵按下
{
Delay10ms(); //延時(shí)去抖操作
temp2=P0; //再重復(fù)一次上述操作
temp2=temp2&0xe0;
if(temp2!=0xe0)
{
temp2=P0;
switch(temp2) //判斷按下的是該行的第幾列
{
case 0xdf: k=4;break; //11011111,第二行第一列
case 0xbf:k=5;break;//10111111,第二行,第二列
case 0x7f: k=6;break;//01111111,第二行,第三列
}
while(temp2!=0xe0) //等待按鍵釋放,只要結(jié)果不等于0xe0,則說(shuō)明按鍵沒(méi)有被釋放
{
temp2=P0;
temp2=temp2&0xe0;
}
}
}
return k;
}
void time1() interrupt 3 //定時(shí)器1的中斷服務(wù)
{
TH1=0xd8;
TL1=0xf0;
num++;
if(num==100)//到了100次,1秒時(shí)間到,代表1分鐘時(shí)間到
{
num=0;
fen++;
if(fen==60)//到60后清零
{
fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
void Delay10ms()
{
unsigned char i,j,g;
for(i=0;i<5;i++)
for(j=0;j<4;j++)
for(g=0;g<248;g++);
}
void display(unsigned char shi,unsigned char fen)
{ unsigned char m;
table3[0]=fen%10;
table3[1]=fen/10;
table3[2]=shi%10;
table3[3]=shi/10;
for(m=0;m<4;m++)
{
P0=table2[m];P1=table1[table3[m]];
Delay10ms();
}
if(m==4)
m=0;
}
作者: lxpzxd 時(shí)間: 2019-12-29 01:25
請(qǐng)問(wèn),有仿真原理圖嗎,光有程序看不太懂
作者: 小明小坤 時(shí)間: 2019-12-29 18:56
請(qǐng)問(wèn)有仿真文件嗎
歡迎光臨 (http://www.torrancerestoration.com/bbs/) |
Powered by Discuz! X3.1 |