单片机C程序求助攻,急急急急急急
时间:10-02
整理:3721RD
点击:
//输出0 -1方波,由键盘输入频率值,可由键盘调节频率和占空比
#include<reg52.h>
#include<math.h>
#define uint unsigned int
static unsigned int pwno,n; //pwno 占空比;n 频率;
uint counter=0; //计数器;
sbit out = P1^0; //波形输出端口
void delay(uint xms) //延迟函数
{
uint i,j;
for(j=xms;j>0;j--)
for(i=110;i>0;i--);
}
int keyCheck() //键盘检测按键,并输出key值
{
char temp;
uint key=0;
while(1)
{
if(key!=0) break;//如果key被赋值了证明键盘被按下,跳出循环,返回key值
//******************************** 扫描第四列
P2= 0xfe;
temp= P2;
if(temp!=0xfe)
{
delay(10);
if(temp!=0xfe) //防抖
{
switch(temp)
{
case 0xee: key= 14;break;
case 0xde: key= 16;break;
case 0xbe: key= 15;break;
case 0x7e: key= 13;break;
}
}
}
//******************************** 扫描第三列
P2= 0xfd;
temp= P2;
if(temp!=0xfd)
{
delay(10);
if(temp!=0xfd)
{
switch(temp)
{
case 0xed: key= 7;break;
case 0xdd: key= 8;break;
case 0xbd: key= 9;break;
case 0x7d: key=12;break;
}
}
}
//******************************** 扫描第二列
P2= 0xfb;
temp= P2;
if(temp!=0xfb)
{
delay(10);
if(temp!=0xfb)
{
switch(temp)
{
case 0xeb: key= 4;break;
case 0xdb: key= 5;break;
case 0xbb: key= 6;break;
case 0x7b: key= 11;break;
}
}
}
//******************************** 扫描第一列
P2= 0xf7;
temp= P2;
if(temp!=0xf7)
{
delay(10);
if(temp!=0xf7)
{
switch(temp)
{
case 0xe7: key= 1;break;
case 0xd7: key= 2;break;
case 0xb7: key= 3;break;
case 0x77: key= 10;break;
}
}
}
};
return key;
}
void main()
{
uint i,j,c;
i=0;
j=0;
c=0;
n=100;
out = 0;
P2 = 0xff;
while(1)
{
i=keyCheck();
while(1)
{
c=keyCheck();
if(c==14) break;
};
j = keyCheck();
n = 100000/(i*pow(10,j)); //计数需要达到的个数,即为频率
pwno = n/2; //占空比初值为50%
TMOD = 0x02; //定时器
TH0 = 256-92; //100us
TL0 = TH0;
EA = 1;
ET0 = 1;
TR0 = 1; //中断返回点
while(1) //后续调整频率和占空比,并有reset功能(c=15)
{
c=keyCheck();
if(c==10) n--;
if(c==11) n++;
if(c==12) pwno++;
if(c==13) pwno--;
if(c==15) break;
};
};
}
timer0()interrupt 1 using 1
{
counter++; //中断一次为100us
if(counter>n) counter=0; //大于n时候 归0;
if(counter<=pwno) out = 1;
else out = 0;
}
#include<reg52.h>
#include<math.h>
#define uint unsigned int
static unsigned int pwno,n; //pwno 占空比;n 频率;
uint counter=0; //计数器;
sbit out = P1^0; //波形输出端口
void delay(uint xms) //延迟函数
{
uint i,j;
for(j=xms;j>0;j--)
for(i=110;i>0;i--);
}
int keyCheck() //键盘检测按键,并输出key值
{
char temp;
uint key=0;
while(1)
{
if(key!=0) break;//如果key被赋值了证明键盘被按下,跳出循环,返回key值
//******************************** 扫描第四列
P2= 0xfe;
temp= P2;
if(temp!=0xfe)
{
delay(10);
if(temp!=0xfe) //防抖
{
switch(temp)
{
case 0xee: key= 14;break;
case 0xde: key= 16;break;
case 0xbe: key= 15;break;
case 0x7e: key= 13;break;
}
}
}
//******************************** 扫描第三列
P2= 0xfd;
temp= P2;
if(temp!=0xfd)
{
delay(10);
if(temp!=0xfd)
{
switch(temp)
{
case 0xed: key= 7;break;
case 0xdd: key= 8;break;
case 0xbd: key= 9;break;
case 0x7d: key=12;break;
}
}
}
//******************************** 扫描第二列
P2= 0xfb;
temp= P2;
if(temp!=0xfb)
{
delay(10);
if(temp!=0xfb)
{
switch(temp)
{
case 0xeb: key= 4;break;
case 0xdb: key= 5;break;
case 0xbb: key= 6;break;
case 0x7b: key= 11;break;
}
}
}
//******************************** 扫描第一列
P2= 0xf7;
temp= P2;
if(temp!=0xf7)
{
delay(10);
if(temp!=0xf7)
{
switch(temp)
{
case 0xe7: key= 1;break;
case 0xd7: key= 2;break;
case 0xb7: key= 3;break;
case 0x77: key= 10;break;
}
}
}
};
return key;
}
void main()
{
uint i,j,c;
i=0;
j=0;
c=0;
n=100;
out = 0;
P2 = 0xff;
while(1)
{
i=keyCheck();
while(1)
{
c=keyCheck();
if(c==14) break;
};
j = keyCheck();
n = 100000/(i*pow(10,j)); //计数需要达到的个数,即为频率
pwno = n/2; //占空比初值为50%
TMOD = 0x02; //定时器
TH0 = 256-92; //100us
TL0 = TH0;
EA = 1;
ET0 = 1;
TR0 = 1; //中断返回点
while(1) //后续调整频率和占空比,并有reset功能(c=15)
{
c=keyCheck();
if(c==10) n--;
if(c==11) n++;
if(c==12) pwno++;
if(c==13) pwno--;
if(c==15) break;
};
};
}
timer0()interrupt 1 using 1
{
counter++; //中断一次为100us
if(counter>n) counter=0; //大于n时候 归0;
if(counter<=pwno) out = 1;
else out = 0;
}

程序没仔细看,所以不知道你要表达的具体问题,个人只是感觉,你那个keycheck()里头太啰嗦,是思路不清的表现,建议你先优化键盘检测程序后
理清楚思路,这样有助于发现解决问题。
另外,问问题的核心;你遇到什么问题?
你贴了代码,贴了图,难道你觉得别人会复制你的代码去仿真吗?一般人没这个时间与精力。
各位大哥大神帮帮忙。耐心看下。
又是proteus发到单片机板块!
而且还是控制pwm占空比的程序!
有救吗?
这里没人的么。求高手啊
呵呵,有吧!
你参考一下
http://bbs.elecfans.com/jishu_472128_1_1.html
救命啊~~~~急急急
= =忘记说了,谢谢提醒
整体思路 是
先由键盘输入一个值(频率值的数值位),再按确认(c=14),再输入一个值(频率值的数量级位),之后就进入波形输出,期间可以由 键盘控制频率和占空比。你看看哪里有问题。
keycheck 程序 由于16键,只能这样写了。每一行每一行的扫。
仿真 后,波形起初为0(设置好的初值);但是按完确认(c=14)后;波形就一直是1了。
要求我写程序第一行了。
没有得到输出要求的波形。
我也觉得keycheck 有问题。但是按程序执行来看没问题啊- -。
回头我在看看, 不会调试.....哭啊。
大神救命
已经解决了,谢谢
已经解决了。自己跳进自己的陷阱里了。
