① 51單片機 10個按鍵控制10個繼電器 按第一個按鍵第一個繼電器吸合1小時後自動斷開 第二個同樣 互不影響
#include<reg51.h>
#defineucharunsignedchar
ucharflag[10],cnt,sec[10],min[10];
sbitk1=P1^0;
sbitk2=P1^1;
sbitk3=P1^2;
sbitk4=P1^3;
sbitk5=P1^4;
sbitk6=P1^5;
sbitk7=P1^6;
sbitk8=P1^7;
sbitk8=P0^0;
sbitk10=P0^1;
sbitjdq1=P0^2;
sbitjdq2=P0^3;
sbitjdq3=P0^4;
sbitjdq4=P0^5;
sbitjdq5=P0^6;
sbitjdq6=P0^7;
sbitjdq7=P2^0;
sbitjdq8=P2^1;
sbitjdq9=P2^2;
sbitjdq10=P2^3;
voidt0isr()interrupt1
{
uchari;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
cnt++;
if(cnt>=20)
{
cnt=0;
for(i=0;i<10;i++)
{
sec[i]++;
if(sec[i]>59)
{
sec[i]=0;
min[i]++;
if(min[i]>59)
{
min[i]=0;
flag[i]=1;
}
}
}
}
main()
{
uchari;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(k1==0)
{
while(k1==0);
cnt=0;
flag[0]=0;
sec[0]=0;
min[0]=0;
jdq1=0;
}
.......共10個鍵,差不多
switch(i)
{
case0:if(flag[0]==1)jdq1=1;break;
case1:if(flag[1]==1)jdq2=1;break;
case2:if(flag[2]==1)jdq3=1;break;
case3:if(flag[3]==1)jdq4=1;break;
case4:if(flag[4]==1)jdq5=1;break;
case5:if(flag[5]==1)jdq6=1;break;
case6:if(flag[6]==1)jdq7=1;break;
case7:if(flag[7]==1)jdq8=1;break;
case8:if(flag[8]==1)jdq9=1;break;
case9:if(flag[9]==1)jdq10=1;break;
}
i++;
}
}
② 51單片機如何控制蜂鳴器發出不同聲調
我這里有現成的程序,把分給我,留下信箱,我就給你發過去,呵呵。我利用軟體定時和中斷方式都有,可以演奏音樂,不過蜂鳴器演奏的實在夠難聽。
看來樓主對程序不感興趣,我還是告訴你吧,你定時必須知道准確的定時時間,音樂中DO RE MI-----SI都是有一定的頻率也就是Hz,都如下:
c1:262Hz--thtl=0xf8b3
d1:294Hz--0xf972
e1:330Hz--0xfa14
f1:349Hz--0xfa66
g1:392Hz--0xfb03
a1:440Hz--0xfb8f
b1:494Hz--0xfc0b
前面是HZ,後面是我用硬體定時得到的TH和TL的值。
比如你想發C1的音,先用軟體定一個262*2Hz的延時反復調用,在一個周期內使buzzer響,再接著一個周期使buzzer不響,如此反復就得到了262Hz的聲音,也就類似發出了C1的聲音。
反正是夠難聽的。
③ 51單片機,為什麼當jdq1==1時,不進行串口發送,請高手
檢查一下你的串口初始化是否正確
void commInit()
{
SCON = 0x52;
PCON = 0x80;
TMOD = 0x21;
TH1 = 0x0FA;
TL1 = 0x0FA;
TCON = 0x40;
}
波特率可以更加你的需要設置,如果你的串口初始化正確,你要看一下你的RTS引腳是否一直處於復位狀態,這將導致單片機不能向串口發送數據。
④ 51單片機絕對的難題。。
程序一開始,flage=0,if 不成立,程序結束,沒有循環,Game Over,這就是 俗稱 的 單次系統。
這樣的問題 也敢提出來 當 絕對難題!!偶 很 佩服 LZ 的勇氣!!
⑤ 51單片機控制舵機,舵機不轉
雖然這種「鍋派」程序爛了點,但舵機還是可以控制的。其中 占空比范圍是 1/40 ~ 5/40,至於能轉多大角度,LZ 先算下能不能看出來。
另外,LZ 說的 分2種情況,那都不是正確的硬體。應該把2種情況合起來。獨立5V 跟 GND,然後把GND 跟 開發板 連起來。
⑥ 菜鳥求問 51單片機 舵機 手機藍牙APP設置
1、以上程序寫在串口中斷中,讀串口BUFF數據賦給a變數
2、手機app與單片機藍牙進行連接
3、設置相同波特率、停止位、校驗碼
4、app發送字元型的『3』,『4』,『5』
⑦ 有使用jd51單片機的同學嗎
這不是個二選一的問題,首先.
做自動化的,相當多的人是這兩種都有深入了解的.
建議從51開始,這個是基礎,也容易上手,了解這個,後續的東西就容易了,
還有個好處,有這個基礎(硬體,軟體C51之類),PLC的東西,你就會覺得順理成章.
本來PLC設計出來就是為了降低使用難度的,但那是要至少對通常硬體有個大致了解的基礎上的,
若一開始就局限於PLC,一些基本特徵的理解反而會成為障礙.
看看現在知道上對PLC的提問集中在什麼范圍內,你會有同感.
⑧ 誰可以幫我編一個51單片機型號為STC89C52RC 舵機型號為mg995的轉向程序
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延時函數
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
//定時器初始化
void Time0_init()
{
TMOD=0x01; //定時器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定時器0中斷程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判斷0.5ms次數是否小於角度標識
pwm=1; //是,pwm輸出高電平
else
pwm=0; //否,輸出低電平
count=count+1;
count=count%40; //次數始終保持為40,即保持周期為20ms
}
//按鍵掃描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按鍵按下則20ms周期重新開始計時
if(jd==6)
jd=5; //已經是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已經0度,保持
while(jian==0);
}
}
}
//數碼管顯示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
⑨ 51單片機識別0x10及其以上的十六進制數不成功
你這程序寫的也沒誰了,都是重復代碼,更有意思是,sw_out( )子程序中卻用了while(1),然後再用break中止循環,這樣寫毫無意義,乾脆去掉這一對代碼,沒有這么寫程序的,太不規范。還有向串口發回原數據,每段都重復,那就放在串口中斷程序中,接收後立即返回呀。主程序在b==1時才調sw_out( )函數,這樣,sw_out( )只做識別a是什麼值,做什麼動作。
那麼,你的問題的原因是,在主程序調用sw_out( )中發送a,採用查詢方式,但串口卻是開中斷的,所以,在主程序中發送數據之前必須關串口中斷,ES=0; 等發送完再開,ES=1; 太麻煩。不如在串口中斷程序中,接收完就馬上發送,少了很多麻煩和錯誤。
⑩ 如何用51單片機控制舵機的單片機程序是怎麼寫的希望你也能給我發一個編寫程序和電路圖
單片機系統實現對舵機輸出轉角的控制,必須首先完成兩項任務:首先,產生基本的PWM周期信號,即產生20ms的周期信號;其次,調整脈寬,即單片機調節PWM信號的占空比。單片機能使PWM信號的脈沖寬度實現微秒級的變化,從而提高舵機的轉角精度。單片機完成控制演算法,再將PWM信號輸出到舵機。
發一個自己原來寫的簡單的。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar count,jd;
sbit pwm=P1^0;
sbit jia=P3^2;
sbit jian=P3^3;
uchar code table[10] = {0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f};
//延時函數
void delay(uchar x)
{
uchar i,j;
for(i=x;i>0;i--)
for(j=125;j>0;j--);
}
//定時器初始化
void Time0_init()
{
TMOD=0x01; //定時器0工作方式1
IE=0x82;
TH0=0xfe;
TL0=0x33; //11.0592MHZ晶振,0.5ms
TR0=1;
}
//定時器0中斷程序
void Time0() interrupt 1
{
TH0=0xfe;
TL0=0x33;
if(count<jd) //判斷0.5ms次數是否小於角度標識
pwm=1; //是,pwm輸出高電平
else
pwm=0; //否,輸出低電平
count=count+1;
count=count%40; //次數始終保持為40,即保持周期為20ms
}
//按鍵掃描
void keyscan()
{
if(jia==0)
{
delay(10);
if(jia==0)
{
jd++; //角度增加 1
count=0; //按鍵按下則20ms周期重新開始計時
if(jd==6)
jd=5; //已經是180度,保持
while(jia==0);
}
}
if(jian==0)
{
delay(10);
if(jian==0)
{
jd--;
count=0;
if(jd==0)
jd=1; //已經0度,保持
while(jian==0);
}
}
}
//數碼管顯示
void display()
{
uchar ,shi,ge ;
switch(jd)
{
case 1:
=0;
shi=0;
ge=0;
break;
case 2:
=0;
shi=4;
ge=5;
break;
case 3:
=0;
shi=9;
ge=0;
break;
case 4:
=1;
shi=3;
ge=5;
break;
case 5:
=1;
shi=8;
ge=0;
break;
}
P0=table[];
P2=1;
delay(5);
P0=table[shi];
P2=2;
delay(5);
P0=table[ge];
P2=3;
delay(5);
}
void main()
{
//jd=1;
count=0;
Time0_init();
while(1)
{
keyscan();
display();
}
}
電路圖很簡單的,幾個按鍵,再在單片機最小系統上接出一個信號線,再給舵機供上電就可以了。