程序流程圖
未命名文件.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; //燈光電平取反 }
|