中斷擴展+流水燈+直流電機+舵機+全彩LED+蜂鳴器+溫濕度+8 位鎖存數碼管:
通過 74HC595 或其他芯片的擴展技術,實現將 INT0 擴展為 16 個中斷按鍵,按下后立即響應。
按鍵1.控制流水燈的方向,向左、向右。
按鍵2.控制流水燈的速度,高速、低速。
按鍵3.控制直流電機的方向,順時針、逆時針。
按鍵4.控制直流電機的開關,啟動、停止。
按鍵5.切換舵機的角度,每次增加 30°,到了+90°再增大,則變成-90°。
按鍵6.切換全彩 LED(RGBLED)的顏色,從滅到白共 8 種情況。
按鍵7.切換蜂鳴器的嘀嗒聲的頻率,低頻、高頻,且要保持響兩三秒時間。
采用硬件定時器計時,每隔 3 秒,通過 DHT11 采集溫濕度,溫濕度數值通過串口發送到上位機(虛擬終端),波特率 9600bps(注意單 片機的晶振設置為 11.0592MHz),溫濕度數值通過 8 位鎖存數碼管例如 MAX7219 顯示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
51hei.png (30.34 KB, 下載次數: 46)
下載附件
2021-8-13 22:35 上傳
51hei.png (38 KB, 下載次數: 53)
下載附件
2021-8-13 22:35 上傳
單片機源程序如下:
- #include "reg51.h"
- #include "intrins.h"
- #include "m7219.h"
- #include "dht11.h"
- #define u8 unsigned char
- #define u16 unsigned int
- u8 code LEDcode[12]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b,0x00,0x01}; //0,1,2,3,4,5,6,7,8,9,全滅,-
- /* 0x77,0x1f,0x4e,0x3d,0x4f,0x47,0x67,0x3e,0xff, */ /*A,B,C,D,E,F,P,U,全亮*/
- sbit A=P2^5;
- sbit D=P2^6;
- sbit C=P2^7;
- sbit P10=P1^0;
- sbit P11=P1^1;
- sbit P12=P1^2;
- sbit P13=P1^3;
- sbit pwm1=P1^4;
- sbit pwm2=P1^5;
- sbit pwm3=P1^6;
- sbit beep=P1^7;
- sbit B1=P0^2;
- sbit G1=P0^1;
- sbit R1=P0^0;
- sbit GS1=P2^0;
- sbit GS2=P2^1;
- u8 i,j,k=0,jiao=0,fang1=0,t=0,time,fang2=0,run=0,color=0,pinlv=0;
- u16 ms50=0,tms50=0;
- void delay(u16 i){while(i--);}
- void T0_init(void)
- {
- TMOD = 0x01;
- TH0 = 0x3C;
- TL0 = 0xB0;
- EA = 1;
- ET0 = 1;
- TR0 = 1;
- }
- void UART1_init(void)
- {
- TMOD=0x20; //定時器T1使用工作方式2
- TH1=253;TL1=253;// 設置初值
- TR1=1; // 開始計時
- SCON=0x50; //工作方式1,波特率9600bps,允許接收
- ES=1;
- EA=1; // 打開所以中斷
- TI=0;
- RI=0;
- }
- void UART1_Send(u8 dat)
- {
- ES=0;//關串口中斷
- SBUF=dat;
- while(TI!=1);//等待發送成功
- TI=0;//清除發送中斷標志
- ES=1;//開串口中斷
- }
- void Buzzer_Delay500us() //@12.000MHz
- {
- u8 i;
- _nop_();
- i = 247;
- while (--i);
- }
- void UART1_Sends(char *s)
- {
- while(*s)UART1_Send(*s++);
- }
- void deng()
- {
- if(t==0)
- {
- if(fang1==0)
- {P10=1;
- delay(10000);
- P10=0;
- P11=1;
- delay(10000);
- P11=0;
- P12=1;
- delay(10000);
- P12=0;
- P13=1;
- delay(10000);
- P13=0;}
- if(fang1==1)
- {P13=1;
- delay(10000);
- P13=0;
- P12=1;
- delay(10000);
- P12=0;
- P11=1;
- delay(10000);
- P11=0;
- P10=1;
- delay(10000);
- P10=0;}
- }
- if(t==1)
- {
- if(fang1==0)
- {P10=1;
- delay(30000);
- P10=0;
- P11=1;
- delay(30000);
- P11=0;
- P12=1;
- delay(30000);
- P12=0;
- P13=1;
- delay(30000);
- P13=0;}
- if(fang1==1)
- {P13=1;
- delay(30000);
- P13=0;
- P12=1;
- delay(30000);
- P12=0;
- P11=1;
- delay(30000);
- P11=0;
- P10=1;
- delay(30000);
- P10=0;}
- }
- }
- void dianji()
- {
- if(run==0)
- {pwm1=1;pwm2=1;}
- if(run==1)
- {
- if(fang2==0)
- {
- pwm2=1;
- pwm1=0;
- delay(300);;
- }
- if(fang2==1)
- {
- pwm1=1;
- pwm2=0;
- delay(300);
- }
- }
- }
- void duoji()
- {
- switch(jiao)
- {
- case 0:{pwm3=1;delay(50);
- pwm3=0;delay(1950);} break;// -90度
- case 1:{pwm3=1;delay(118);
- pwm3=0;delay(1882);} break;// -60度
- case 2:{pwm3=1;delay(135);
- pwm3=0;delay(1865);} break;// -30度
- case 3:{pwm3=1;delay(152);
- pwm3=0;delay(1848);} break;// 0度
- case 4:{pwm3=1;delay(169);
- pwm3=0;delay(1831);} break;// 30度
- case 5:{pwm3=1;delay(186);
- pwm3=0;delay(1814);} break;// 60度
- case 6:{pwm3=1;delay(250);
- pwm3=0;delay(1750);} break;// +90度
- }
- }
- void RGBLED()
- {
- switch(color)
- {
- case 0:{ R1=1;G1=1;B1=1;} break;// 黑色
- case 1:{ R1=0;G1=1;B1=1;} break;// 紅色
- case 2:{ R1=0;G1=0;B1=1;} break;// 黃色
- case 3:{ R1=1;G1=0;B1=1;} break;// 綠色
- case 4:{ R1=1;G1=0;B1=0;} break;// 青色
- case 5:{ R1=1;G1=1;B1=0;} break;// 藍色
- case 6:{ R1=0;G1=1;B1=0;} break;// 紫色
- case 7:{ R1=0;G1=0;B1=0;} break;// 白色
- }
- }
- void Buzzer_Time(u16 ms)
- {
- u16 i;
- for(i=0;i<ms*2;i++)
- {
- beep=!beep;
- Buzzer_Delay500us();
- }
- }
- void Buzzer_Time2(u16 ms)
- {
- u16 i;
- for(i=0;i<ms*2;i++)
- {
- beep=!beep;
- Buzzer_Delay500us();
- Buzzer_Delay500us();
- Buzzer_Delay500us();
- }
- }
- void Beep()
- {
- if(pinlv==0) beep=1;
- if(pinlv==1)
- { Buzzer_Time2(2000);
- }
- if(pinlv==2)
- { Buzzer_Time(2000);
- }
- }
- void WS()
- {
- tms50=0;
- DHT11_RH();
- UART1_Sends("溫度:");
- UART1_Send (wen/10+'0');
- UART1_Send (wen%10+'0');
- UART1_Sends("濕度:");
- UART1_Send (shi/10+'0');
- UART1_Send (shi%10+'0');
- UART1_Send(0x0d);UART1_Send(0x0a);
- MAX7219_send16(1,LEDcode[wen/10]);
- MAX7219_send16(2,LEDcode[wen%10]);
- MAX7219_send16(4,LEDcode[shi/10]);
- MAX7219_send16(5,LEDcode[shi%10]);
- }
- void main()
- {
- IT0=1;EX0=1;EA=1;
- T0_init();
- UART1_init();
- MAX7219_init();
- MAX7219_clear();
- while(1)
- {
- if(k==0)
- MAX7219_send16(7,LEDcode[0]);
- MAX7219_send16(8,LEDcode[i+1]);
- if(k==1)
- {
- MAX7219_send16(7,LEDcode[i/10]);
- MAX7219_send16(8,LEDcode[i%10]);
- }
- deng();
- dianji();
- duoji();
- RGBLED();
- Beep();
-
- }
- }
- void Keydown() interrupt 0
- { i=0;
- if(A==0) i=i+1;
- if(D==0) i=i+2;
- if(C==0) i=i+4;
- if(GS1==0) k=0;
- if(GS2==0) {k=1;i=i+9;}
- switch(i)
- {
- case 0: fang1=!fang1;break;
- case 1: t=!t; break;
- case 2: fang2=!fang2;break;
- case 3: run=!run;break;
- case 4: {jiao++;
- if(jiao>=7) jiao=0;} break;
- case 5: {color++;
- if(color>=8) color=0;} break;
- case 6: {pinlv++;
- if(pinlv>=3) pinlv=0;} break;
- }
- }
- void T0_INT(void) interrupt 1//每隔15ms自動進來一次
- {
- TH0 = 0x3C;
- TL0 = 0xB0;
- ms50++;
- tms50++;
- if(tms50==300)
- {
- tms50=0;
- WS();
- }
- }
- void UART1_INT(void) interrupt 4
- {
- if(RI){RI=0;}//如果是串口輸入引起的中斷
- else{TI=0;}//否則就是串口輸出引起的中斷
-
- }
復制代碼
51hei.png (8.73 KB, 下載次數: 64)
下載附件
2021-8-13 22:39 上傳
仿真代碼資料51hei附件下載:
仿真.7z
(131.11 KB, 下載次數: 43)
2021-8-13 22:38 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|