標題: 單片機燈光控制器流程圖和源碼 [打印本頁]
作者: yzlj 時間: 2018-12-18 20:15
標題: 單片機燈光控制器流程圖和源碼
程序流程圖
未命名文件.png (71.96 KB, 下載次數: 45)
下載附件
2018-12-18 20:14 上傳
#include <reg51.h>
#include <stdio.h>
#define uchar unsigned char
sbit LED = P0^0;
uchar receive;
uchar sdata[11]={13,10,76,69,68,58,111,'0','0',13,10};
uchar slevel[11]={13,10,108,101,118,101,108,32,'0',13,10};
uchar delayH[9]={0xFC,0xF8,0xF4,0xF0,0xEC,0xE8,0xE4,0xE0,0xDC};
uchar delayL[9]={0x18,0x30,0x48,0x60,0x78,0x90,0xA8,0xC0,0xD8};
uchar j=9; //初始亮度等級,共9級
void main(void) //程序初始化
{
TMOD=0x21; //定時器T0工作在方式1,定時器T1工作在方式2
SCON=0x50; //串行口工作在方式1,允許接收
PCON=0x80; //波特率加倍
IT0=1;
IT1=1;
TH1=0xF3;
TL1=TH1;
PS=1; //串行口中斷優先級為1
ES=1;
EX0=1;
EX1=1;
EA=1;
TR0=1;
TR1=1;
LED=1;
while (1)
{;}
}
void smessage(uchar *p1) //串行口發送程序
{
uchar i;
ES=0;
for(i=0;i<=10;i++)
{
SBUF=*p1;
p1++;
while(!TI)
{;}
TI=0;
}
ES=1;
}
void adjust(uchar r1) //根據接收到的信息調整led亮滅
{
if(r1==0x31) //接收到‘1’時,開啟led小燈
{
ET0=1;
sdata[8]=0x00;
sdata[7]='n';
smessage(sdata); //發送字符串LED:on
}
else if(r1==0x30) //接收到‘0’時,關閉led小燈
{
ET0=0;
LED=1;
sdata[8]='f';
sdata[7]='f';
smessage(sdata); //發送字符串LED:off
}
if(ET0) //判斷led是否開啟
{
if(r1==0x2B) //開啟狀態接收到‘+’時,亮度增加
{
j++;
if(j==10) //限制最高亮度
j=9;
slevel[8]=j+48; //計算j數值的ASCII值
smessage(slevel); //發送字符串level j
}
else if(r1==0x2D) //開啟狀態接收到‘-’時,亮度降低
{
j--;
if(j==0) //限制最低亮度
j=1;
slevel[8]=j+48; //計算j數值的ASCII值
smessage(slevel); //發送字符串level j
}
}
}
void int1() interrupt 2 //開關按鈕中斷
{
if(ET0==1)
receive=0x30;
else
receive=0x31;
adjust(receive);
}
void int0() interrupt 0 //亮度調節按鈕中斷
{
uchar k;
k=P2; //獲取P2口狀態
if(k==0x7F) //亮度增加按鈕被按下
{
receive=0x2D;
adjust(receive);
}
else if(k=0xBF) //亮度降低按鈕被按下
{
receive=0x2B;
adjust(receive);
}
}
void terminal() interrupt 4 //串行口接收中斷
{
RI=0;
receive=SBUF;
adjust(receive);
}
void pwm(void) interrupt 1 //pwm定頻調寬,頻率100Hz
{
if(LED) //高電平時,載入下次低電平T0初值
{
TH0=delayH[j-1];
TL0=delayL[j-1];
}
Else //低電平時,載入下次高電平T0初值
{
TH0=delayH[9-j];
TL0=delayL[9-j];
}
LED=!LED; //燈光電平取反
}
| 歡迎光臨 (http://www.denmoz.com/bbs/) |
Powered by Discuz! X3.1 |