標(biāo)題: 單片機(jī)按鍵調(diào)光程序,調(diào)光正常,但就是不能關(guān)燈 [打印本頁]
作者: 247015164 時(shí)間: 2019-10-17 19:36
標(biāo)題: 單片機(jī)按鍵調(diào)光程序,調(diào)光正常,但就是不能關(guān)燈
#include "reg52.h" //此文件中定義了單片機(jī)的一些特殊功能寄存器
typedef unsigned int u16; //對數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;
sbit k1=P1^0;
sbit k2=P1^1;
sbit led=P0^0;
sbit k3=P1^2;
u16 count,value,timer1;
void delayms(u16 ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
void Timer1Init()
{
TMOD|=0X10;//選擇為定時(shí)器1模式,工作方式1,僅用TR1打開啟動(dòng)。
TH1 = 0xFF;
TL1 = 0xff; //1us
ET1=1;//打開定時(shí)器1中斷允許
EA=1;//打開總中斷
TR1=1;//打開定時(shí)器
}
void tiaoguang()
{
if(count>100)
{
count=0;
if(k1==0) //DIR控制增加
{
value++;
}
if(k2==0)
{
value--;
}
}
if(value>=990)
{
value=990;
}
if(value<=10)
{
value=10;
}
if(timer1>1000) //PWM周期為1000*1us
{
timer1=0;
}
if(timer1 <value)
{
led=1;
}
else
{
led=0;
}
}
void main()
{
u8 a;
Timer1Init(); //定時(shí)器1初始化
while(1)
{
if(k3==0)
{
delayms(10);
if(k3==1)
a++;
if(a>1)
a=0;
}
switch(a)
{
case(0): tiaoguang() ;break;//恢復(fù)亮度
case(1): led=0 ;break;//熄滅LED
}
}
}
void Time1(void) interrupt 3 //3 為定時(shí)器1的中斷號 1 定時(shí)器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
{
TH1 = 0xFF;
TL1 = 0xff; //1us
timer1++;
count++;
}
程序運(yùn)行的時(shí)候不能關(guān)燈,用實(shí)驗(yàn)板進(jìn)行實(shí)驗(yàn)的,調(diào)光正常,但就是不能關(guān)燈,不明白哪里錯(cuò)了,像大神們請教下
作者: wulin 時(shí)間: 2019-10-18 06:56
錯(cuò)誤1.k3是控制亮滅,你不可能在10ms內(nèi)做到if(k3==0)--delayms(10)--if(k3==1),所以不可能有a++;
錯(cuò)誤2.定時(shí)器1中斷設(shè)置1us,但是完成中斷內(nèi)指令需要16us,CPU沒有時(shí)間正常執(zhí)行主循環(huán)任務(wù)
作者: whx.000 時(shí)間: 2019-10-18 08:09
PWM好像就是無法關(guān)燈,以前我也關(guān)不了。你可以調(diào)節(jié)PWM的頻率使其關(guān)燈啊,調(diào)到最小不是和關(guān)燈一個(gè)現(xiàn)象嗎
作者: bai_yun_123 時(shí)間: 2019-10-18 09:00
變量的定義最好賦初值,然后你的k3==1的時(shí)候的按鍵抖動(dòng)延時(shí)沒有設(shè),看你k1,k2的抖動(dòng)延時(shí)也沒有設(shè),除了這些暫時(shí)還沒看出有什么不妥當(dāng)?shù)牡胤剑饕覍χ袛噙@個(gè)定義不熟,沒辦法通篇理解程序
作者: jijkf 時(shí)間: 2019-10-18 10:07
按鍵要延時(shí)抖動(dòng)
作者: jijkf 時(shí)間: 2019-10-18 10:08
按鍵要延時(shí)抖動(dòng)
作者: 247015164 時(shí)間: 2019-10-27 09:31
更正,經(jīng)過調(diào)試,如果想要按k3關(guān)閉led的燈光可以將主程序判斷k3==1處改為k3==0 如下:
void main()
{
u8 a;
Timer1Init(); //定時(shí)器1初始化
while(1)
{
if(k3==0)
{
delayms(10);
if(k3==0)
a++;
if(a>1)
a=0;
}
switch(a)
{
case(0): tiaoguang() ;break;//恢復(fù)亮度
case(1): led=0 ;break;//熄滅LED
}
}
}
現(xiàn)在還有一個(gè)問題是,在調(diào)暗led燈是在20%的亮度左右會(huì)閃爍。我看了下有人說做進(jìn)中斷里就可以解決。但不太了解運(yùn)行的方式(程序)
望各位可以指導(dǎo)一下。謝謝
作者: 247015164 時(shí)間: 2019-10-27 09:31
在硬件上,開關(guān)是做了處理的了,程序里就不在寫延時(shí)了
作者: lids 時(shí)間: 2019-11-4 15:29
看看我這個(gè)程序,你就知道怎么關(guān)燈了
| 歡迎光臨 (http://m.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |