微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机C程序求助攻,急急急急急急

单片机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;       
}


程序没仔细看,所以不知道你要表达的具体问题,个人只是感觉,你那个keycheck()里头太啰嗦,是思路不清的表现,建议你先优化键盘检测程序后
理清楚思路,这样有助于发现解决问题。

另外,问问题的核心;你遇到什么问题?
你贴了代码,贴了图,难道你觉得别人会复制你的代码去仿真吗?一般人没这个时间与精力。

各位大哥大神帮帮忙。耐心看下。

又是proteus发到单片机板块!
而且还是控制pwm占空比的程序!

有救吗?

这里没人的么。求高手啊

呵呵,有吧!

你参考一下
http://bbs.elecfans.com/jishu_472128_1_1.html

救命啊~~~~急急急

= =忘记说了,谢谢提醒
整体思路 是  
先由键盘输入一个值(频率值的数值位),再按确认(c=14),再输入一个值(频率值的数量级位),之后就进入波形输出,期间可以由 键盘控制频率和占空比。你看看哪里有问题。
keycheck 程序 由于16键,只能这样写了。每一行每一行的扫。
仿真 后,波形起初为0(设置好的初值);但是按完确认(c=14)后;波形就一直是1了。
要求我写程序第一行了。
没有得到输出要求的波形。
我也觉得keycheck 有问题。但是按程序执行来看没问题啊- -。
回头我在看看, 不会调试.....哭啊。
大神救命

已经解决了,谢谢

已经解决了。自己跳进自己的陷阱里了。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top