欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
用pwm調節led燈亮度 編譯沒毛病 燒錄到單片機沒反應 這個代碼哪里出問題?
[打印本頁]
作者:
knight123.
時間:
2020-11-24 00:12
標題:
用pwm調節led燈亮度 編譯沒毛病 燒錄到單片機沒反應 這個代碼哪里出問題?
*單片機實現PWM調節LED燈的亮度*/
#include<reg52.h>
#define uchar unsigned char
sbit P2_0=P2^0;
sbit key1=P3^4;
sbit key2=P3^5;
uchar zkb,i;// zkb指占空比
void delay(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函數
{
TMOD=0X01;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
EA=1;
ET0=1;
TR0=1;
}
void keyscan() //鍵盤掃描
{
P3=0XFF;
if(key1==0)
{
delay(5);
if(key1==0)
{
while(!key1);
if(zkb<9)
{
zkb++;
}
}
}
if(key2==0)
{
delay(5);
if(key2==0)
{
while(!key2);
if(zkb>0)
{
zkb--;
}
}
}
}
void main() //主函數
{
zkb=2;
init();
while(1)
{
keyscan();
}
}
void time0(void) interrupt 1 //中斷函數
{
TH0=(65536-10)/256;
TL0=(65536-10)%256;
++i;
if(i>10)
{
i=0;
};
if(i<=zkb)
{
P2_0=1;
}
else P2_0=0;
}
作者:
wulin
時間:
2020-11-24 00:12
樓主這個程序從表面看沒有什么毛病,其實有諸多毛病。
1.設置中斷周期10us,但10us時間根本完不成中斷任務,必然達不到設計意圖。
2.延時程序看來按1ms寫的,但數據類型用錯,實際延時時間只有1/4。
3.按鍵掃描函數語句排列不當,導致按鍵松手才能響應。
4.計數方式不當,導致PWM控制范圍只能10~90%。達不到0~100%。
修改如下:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit P2_0=P2^0;
sbit key1=P3^4;
sbit key2=P3^5;
uchar zkb,i;// zkb指占空比
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init() //初始化函數
{
TMOD=0X01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
EA=1;
ET0=1;
TR0=1;
}
void keyscan() //鍵盤掃描
{
if(key1==0)
{
delay(10);
if(key1==0)
{
if(zkb<10)
{
zkb++;
}
while(!key1);
}
}
if(key2==0)
{
delay(10);
if(key2==0)
{
if(zkb>0)
{
zkb--;
}
while(!key2);
}
}
}
void main()
{
zkb=2;
init();
while(1)
{
keyscan();
}
}
void time0(void) interrupt 1 //中斷函數
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
++i;
if(i==10)
{
i=0;
}
if(zkb>i)
{
P2_0=1;
}
else P2_0=0;
}
復制代碼
作者:
666662222222
時間:
2020-11-24 10:06
uint timer0_count=0; //計數次數,由于定時器的本質是計數器
void timer0_init(void) //定時器0初始化
{
TMOD=0x01; //設置定時器0的定時方式
TH0=(65536-50000)/256; //設置初值,相當于每50毫秒進入一次中斷函數
TL0=(65536-50000)/256;
EA=1; //開啟總中斷
ET0=1; //開啟定時器0中斷
TR0=1; //啟動定時器0中斷
}
void timer0_interrupt(void)interrupt 1 //定時器0的中斷函數
{
count++; //每加一次代表過了一個50毫秒
if(count==220) //代表過了11秒
{
//然后打開LED2;
}
//之后的15秒鐘的自己就OK了吧
}
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1