linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 -电子工程世界-论坛 -手机版...
本人現在想用IO口做PWM輸出,頻率1KHz,然后用兩按鍵(+、-)來調節占空比0-100%,對應數碼管顯示000-100。
現波形是OK了,也可以調占空比,但是出現一個問題數碼管顯示亂七八糟,調了兩天都沒有調好,還請大哥們幫忙指
點。
#include
#define uint?? unsigned int
#define uchar unsigned char
sbit up=P2^0;?????? //加1按鍵
sbit down=P2^1;???? //減1按鍵
sbit pwm_out=P1^0;? //PWM輸出端口
char disp=0;?????? //顯示計數器
char pwm_disp=50;?? //占空比顯示單元,初始化為中間值
timer0_count=100;//定時中斷計數器
uchar code disp_bit[]={0xbf,0xdf,0xef}; //數碼管位碼 P2.4,P2.5,P2.6
uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//數碼管段碼??????? 0,1,2,3,4,5,6,7,8,9
void display();
//延時子函數
void delay(int x)
{
int i,j;
for(i=0;i
for(j=1;j<120;j++);
}
//T0定時器初使化
void init()
{
TMOD=0x01;????????? //T0方式1計時
TH0=(65536-8)/256;? //定時10uS
TL0=(65536-8)%256;
EA=1;?????????????? //總中斷開
ET0=1;????????????? //定時器0開
TR0=1;???? //啟動定時器
}
//T0定時中斷子函數
void timer0() interrupt 1 using 0
{
TH0=(65536-8)/256;? //重置定時初值 10uS
TL0=(65536-8)%256;
if(pwm_disp==timer0_count )//占空比計數器等于定時中斷計數器否
{
pwm_out=1;??????? //開通輸出
}
if(timer0_count==0)?? //定時中斷計數器為0否
{
pwm_out=0;???????? //關斷輸出
timer0_count=100;? //重置初始值
}
timer0_count--;
}
//顯示子函數
void display()
{?? delay(10);
switch(disp)
{? case 0:
{
P2=0xbf;???????????????? //P2為位碼
P0=TABLE[pwm_disp/100];? //P0為段碼
break;
}
case 1:
{
P2=0xdf;
P0=TABLE[(pwm_disp%100)/10];
break;
}
case 2:
{
P2=0xef;
P0=TABLE[pwm_disp%10];
break;
}
}
disp++;//顯示計數器加1
if(disp>=3)//顯示計數器等于3
disp=0; //則清零
}
//主程序
void main()
{
init();
while(1)
{
if(up==0)//增1鍵按下否
{ delay(10);
if(up==0)
{ pwm_disp++;
if( pwm_disp>100)
pwm_disp=0;
if(up==0);
}
}
if(down==0)//減1鍵按下否
{ delay(10);
if(down==0)
{ pwm_disp--;
if( pwm_disp==0)
pwm_disp=100;
if(down==0);
}
}
}
}
總結
以上是生活随笔為你收集整理的linux 普通io实现pwm,用普通IO口做PWM输出 - 51单片机 -电子工程世界-论坛 -手机版...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json里面的list数据取不出来_[工
- 下一篇: linux socket资源耗尽,TCP