欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
剛接觸單片機,如何編寫這個led控制小程序?頭好大
[打印本頁]
作者:
shyydy
時間:
2019-3-23 05:06
標題:
剛接觸單片機,如何編寫這個led控制小程序?頭好大
現在已經會通過一或兩個按鍵實現點亮關閉LED了,也就是改變端口高低電平狀態。
然后現在想實現這么個東西,在程序里加入延時處理,具體內容如下:
按住按鈕K(K1=0),3秒后,LED點亮(LED=0)5秒然后滅掉(LED=1)不再亮。任何時候一但松開K(K1=1),LED則一直是滅的(LED=1)
重點就是以上動作只有在K按住時才會執行動作,一但松開則程序復位。而且延時我也不會寫。。。
頭好大
作者:
shyydy
時間:
2019-3-23 05:15
51單片機
作者:
shyydy
時間:
2019-3-23 05:21
已經實現了按住開燈,松開滅燈了,只剩下那個萬惡的延時程序了
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
/*******************************************************************************
* 函 數 名 : delay
* 函數功能 : 延時函數,i=1時,大約延時10us
*******************************************************************************/
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0
{
delay(300000);
led=0
}
while(!k1)
{
led=1;
}
}
}
void main()
{
while(1)
{
keypros();
}
}
作者:
shyydy
時間:
2019-3-23 05:37
已經實現了,按住三秒后亮五秒后滅,只剩下一下問題了:
不能實現松開按鍵LED瞬間滅!!
現在是一但點亮必須要等五秒才滅
#include "reg52.h"
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000);
if(k1==0)
{
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
led=0;
for(i=5000;i>0;i--)
for(j=110;j>0;j--);
led=1;
}
while(!k1);
{
led=1;
}
}
}
void main()
{
while(1)
{
keypros();
}
}
作者:
shyydy
時間:
2019-3-23 05:39
不對,剛又試了下,現在是只要按一下鍵,就執行
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
led=0;
for(i=5000;i>0;i--)
for(j=110;j>0;j--);
led=1;
作者:
robinsonlin
時間:
2019-3-23 10:26
#include "reg52.h"
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000); //軟延時,消除按鍵抖動
if(k1==0)
{
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
led=0;
for(i=5000;i>0;i--) //這行的執行沒有加判斷,每次循環都會執行這個5秒延時后,再改變led的狀態
for(j=110;j>0;j--);
led=1;
}
while(!k1);
{
led=1;
}
}
}
void main()
{
while(1)
{
keypros();
}
}
比較欣賞你的學習態度,敢于實踐,從小實驗開始,找樂趣,找動力。 你這個辦法是可以簡單實現你想要的功能,但是問題很多,單片機的功能遠不止如此。 延時和程序結構也不是你這樣弄的。 試著用定時器去實現主功能延時,慢慢實踐,加油。
作者:
wulin
時間:
2019-3-23 11:28
shyydy 發表于 2019-3-23 05:39
不對,剛又試了下,現在是只要按一下鍵,就執行
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
你用delay延時再怎么折騰都是枉費心機,要用定時器!給你改好了,根據晶振頻率選擇定時器重載值。
#include "reg52.h"
//#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
u8 count=0;//消抖計數變量
u16 num=0; //定時計數變量
bit sign=0; //啟動標志
/*
void delay(u16 i)
{
while(i--);
}
*/
void Timer0Init() //250微秒自動重載
{
TMOD= 0x02; //設置定時器模式
TL0 = 0x06; //設置定時初值12.000MHz
TH0 = 0x06; //設置定時重載值12.000MHz
// TL0 = 0x1A; //設置定時初值11.0592MHz
// TH0 = 0x1A; //設置定時重載值11.0592MHz
TF0 = 0; //清除TF0標志
TR0 = 1; //定時器0開始計時
}
void main()
{
Timer0Init();
while(1)
{
if(TF0==1)
{
TF0=0; //清除TF0標志
if(k1==0) //鍵按下
{
if(++count>=50 && sign==0)
sign=1;
}
else //鍵抬起
{
count=0;
sign=0;
num=0;
led=1;
}
if(sign==1)
{
num++;
if(num>12000 && num<32000)
led=0;
else led=1;
if(num>32000)
num=32000;
}
}
}
}
復制代碼
作者:
robinsonlin
時間:
2019-3-23 11:35
#include "reg52.h"
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
void delay(u16 i)
{
while(i--);
}
void keypros()
{
if(k1==0)
{
delay(1000); //軟延時,消除按鍵抖動
if(k1==0)
{
for(i=3000;i>0;i--)
for(j=110;j>0;j--);
led=0;
for(i=5000;i>0;i--) //這行的執行沒有加判斷,每次大循環都會執行這個5秒延時
for(j=110;j>0;j--);
led=1;
}
while(!k1);
{
led=1;
}
}
}
void main()
{
while(1)
{
keypros();
}
}
看起來你的c語言功底還可以,只是對51不太了解。 在小實驗中找樂趣找動力,值得贊賞。 不過單片機的延時不是你這樣做的,你需要再深度了解一下定時器的使用。 按鍵的掃描,最好也用中斷來處理。
作者:
zjjhtony
時間:
2019-3-23 12:11
#include "reg52.h"
#define uint unsigned int
typedef unsigned int u16;
typedef unsigned char u8;
sbit k1=P3^4;
sbit led=P1^5;
uint i,j;
u8 time_count=0; //定時累加計數
u8 flag=0; //3s的延時開和5s延時關閉標志
u8 start_flag=0; //開始定時的標志,0是允許定時輸出,1表示已經定時輸出。
void delay(u16 i) //鍵盤防止抖動延時標志
{
while(i--);
}
void time0_on()
{
TMOD=0x01; //定時器0 16位定時模式
TH0=(65536-50000)/256; //定時器0定時時間為50000us=50ms
TL0=(65536-50000)%256; //
EA=1; //總中斷允許
ET0=1; //定時器0中斷允許
TR0=1; //啟動定時器0
}
void led_output()
{
if(start_flag==0) //判斷是否允許輸出
{
start_flag=1; //start_flag=1,下次不能允許輸出
time_count=60; //60*50ms=3000S的延時打開LED
flag=0; //當前是延時打開
time0_on(); //定時器開。
}
}
void led_off() //按鍵釋放處理程序
{
led=1; //LED關閉
TR0=0; //定時器關閉
start_flag=0; //允許輸出復位
}
void keypros() //按鍵處理程序
{
if(k1==0)
{
delay(1000); //去抖動延時
if(k1==0)
{
led_output(); //LED輸出處理
}
}
else
{
led_off(); //按鍵釋放處理程序
}
}
void t0_time(void)interrupt 1 using 0 //定時器0中斷處理程序
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //重裝初值50000us=50ms
time_count--; //計數器自減
if(time_count==0) //計數器3s或5S到
{
switch(flag)
{
case 0: //3S延時到
flag=1; //切換到5S
time_count=100; //100*50ms=5s
led=0; //led亮
break;
case 1: //5S延時到
flag=0; //切換到3S
TR0=0; //延時完成關閉定時器0
led=1; //led滅
break;
}
}
}
void main()
{
while(1)
{
keypros(); //按鍵處理
}
}
復制代碼
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1