头像-132069

Wu雨雨雨

个人成就

获得 1 次赞

帮助过0人

51单片机有源蜂鸣器一次响声小,一次正常

下面是程序,其他的都很简单,红色标出了蜂鸣器部分#include <reg52.h>                    //52系列单片机头文件     #define uchar unsigned char//申明变量和位口 sbit     K1=P3^4;     //对应按钮K1sbit     K2=P3^5;    //对应按钮K2            sbit    dula=P2^6;     //段选申明 sbit    wela=P2^7;     //位选申明 sbit    beep=P2^3;        //蜂鸣器申明 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0~9,A~F的16进制void delayms(unsigned int xms);       //延时函数申明unsigned char numt0=0,miao=0,fen=0,lunci=0;    //  计数变量unsigned char CK1=0,CK2=0;   //串口接收变量(全局)//延时函数void delayms(unsigned int xms)                                {        unsigned int i,j;        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒                for(j=112;j>0;j--);}//计时器初始化函数void init()   {    //********计时器**********        TMOD=0x21;                 //模式设置,00100001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。        TR0=0;                         //不打开定时器        TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。        TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12        ET0=1;                         //开定时器0中断        EA=1;                         //开总中断         //***************串口通信**********************     TMOD=0X21;                        ////模式设置,00100001,可见采用的是定时器1,工作与模式1(M1=0,M0=1)        SCON=0X50;                        //设置为工作方式1        PCON=0X00;                        //0x00不加倍    0x80加倍        TH1=0XFD;                    //计数器初始值设置,注意波特率是4800的        TL1=0XF3D;                                                                 ES=1;                                                //打开接收中断        EA=1;                                                //打开总中断        TR1=1;                                            //打开计数器                         }//数码管显示函数 void display(uchar fen1,uchar miao1){                //*******分钟操作*********                unsigned char fenshi,fenge;        unsigned char  miaoshi,miaoge;        fenshi=fen1/10;        fenge=fen1%10;                          dula=1;                //秒钟十位赋值            P0=table[fenshi];              dula=0;                        P0=0xff;                        wela=1;        P0=0xF7;        wela=0;                         delayms(5);                        dula=1;                 //分钟十位赋值         P0=table[fenge];        dula=0;                       P0=0xff;                       wela=1;        P0=0xEF;        wela=0;                        delayms(5);                //********中间的一个横线*****        dula=1;                        P0=0x40;              dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器         wela=1;        P0=0xFB;        wela=0;                 //打开段选位 、赋值、关闭闭段选位        delayms(5);                        //*******秒钟操作*********                miaoshi =  miao1/10;        miaoge  =  miao1%10;          //参数处理                     dula=1;                        P0=table[miaoshi];              dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器         wela=1;        P0=0xFE;        wela=0;                 //打开段选位 、赋值、关闭闭段选位        delayms(5);                        dula=1;                 //秒钟十位赋值         P0=table[miaoge];        dula=0;                       P0=0xff;                       wela=1;        P0=0xFD;        wela=0;                        delayms(5);        }//判断按键函数unsigned char keyscan(){        unsigned char keyValue = 0; //保存键值        if (K1==0)                        //检测按键K1是否按下        {                delayms(10);           //消除抖动                if (K1==0)              //再次检测按键是否按下                {                        TR0=~TR0;        //启动或开始计时器******一开始时,这个按键按下去后才会启动                           while(!K1);    //等待按键释放                        }        }        if (K2==0)                //检测按键K1是否按下        {                delayms(10);        //消除抖动                if (K2==0)        //再次检测按键是否按下                {                        miao=0;                        fen=0;          //清零                        lunci=0;         //清零同时,判别变量清零                    while(!K2);    //等待按键释放                        }        }        return keyValue;   //将读取到键值的值返回}//开始次一轮函数void NextTurn ( unsigned char fenstop){     &

51单片机有源蜂鸣器一次响声正常,一次响声很小?

下面是程序,其他的都很简单,红色标出了蜂鸣器部分#include <reg52.h>                    //52系列单片机头文件     #define uchar unsigned char//申明变量和位口 sbit     K1=P3^4;     //对应按钮K1sbit     K2=P3^5;    //对应按钮K2            sbit    dula=P2^6;     //段选申明 sbit    wela=P2^7;     //位选申明 sbit    beep=P2^3;        //蜂鸣器申明 unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //0~9,A~F的16进制void delayms(unsigned int xms);       //延时函数申明unsigned char numt0=0,miao=0,fen=0,lunci=0;    //  计数变量unsigned char CK1=0,CK2=0;   //串口接收变量(全局)//延时函数void delayms(unsigned int xms)                                {        unsigned int i,j;        for(i=xms;i>0;i--)                      //i=xms即延时约xms毫秒                for(j=112;j>0;j--);}//计时器初始化函数void init()   {    //********计时器**********        TMOD=0x21;                 //模式设置,00100001,可见采用的是定时器0,工作与模式1(M1=0,M0=1)。        TR0=0;                         //不打开定时器        TH0=(65536-46080)/256;// 由于晶振为11.0592,故所记次数应为46080,计时器每隔50000微秒发起一次中断。        TL0=(65536-46080)%256;//46080的来历,为50000*11.0592/12        ET0=1;                         //开定时器0中断        EA=1;                         //开总中断         //***************串口通信**********************     TMOD=0X21;                        ////模式设置,00100001,可见采用的是定时器1,工作与模式1(M1=0,M0=1)        SCON=0X50;                        //设置为工作方式1        PCON=0X00;                        //0x00不加倍    0x80加倍        TH1=0XFD;                    //计数器初始值设置,注意波特率是4800的        TL1=0XF3D;                                                                 ES=1;                                                //打开接收中断        EA=1;                                                //打开总中断        TR1=1;                                            //打开计数器                         }//数码管显示函数 void display(uchar fen1,uchar miao1){                //*******分钟操作*********                unsigned char fenshi,fenge;        unsigned char  miaoshi,miaoge;        fenshi=fen1/10;        fenge=fen1%10;                          dula=1;                //秒钟十位赋值            P0=table[fenshi];              dula=0;                        P0=0xff;                        wela=1;        P0=0xF7;        wela=0;                         delayms(5);                        dula=1;                 //分钟十位赋值         P0=table[fenge];        dula=0;                       P0=0xff;                       wela=1;        P0=0xEF;        wela=0;                        delayms(5);                //********中间的一个横线*****        dula=1;                        P0=0x40;              dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器         wela=1;        P0=0xFB;        wela=0;                 //打开段选位 、赋值、关闭闭段选位        delayms(5);                        //*******秒钟操作*********                miaoshi =  miao1/10;        miaoge  =  miao1%10;          //参数处理                     dula=1;                        P0=table[miaoshi];              dula=0;                 //打开段选位 .....秒钟个位赋值......关闭闭段选位    P0=0xff;                //送段选数据前关闭所有所有显示,防止打开位选锁存器         wela=1;        P0=0xFE;        wela=0;                 //打开段选位 、赋值、关闭闭段选位        delayms(5);                        dula=1;                 //秒钟十位赋值         P0=table[miaoge];        dula=0;                       P0=0xff;                       wela=1;        P0=0xFD;        wela=0;                        delayms(5);        }//判断按键函数unsigned char keyscan(){        unsigned char keyValue = 0; //保存键值        if (K1==0)                        //检测按键K1是否按下        {                delayms(10);           //消除抖动                if (K1==0)              //再次检测按键是否按下                {                        TR0=~TR0;        //启动或开始计时器******一开始时,这个按键按下去后才会启动                           while(!K1);    //等待按键释放                        }        }        if (K2==0)                //检测按键K1是否按下        {                delayms(10);        //消除抖动                if (K2==0)        //再次检测按键是否按下                {                        miao=0;                        fen=0;          //清零                        lunci=0;         //清零同时,判别变量清零                    while(!K2);    //等待按键释放                        }        }        return keyValue;   //将读取到键值的值返回}//开始次一轮函数void NextTurn ( unsigned char fenstop){     &

想让大家帮我看看程序错在哪里

自己学习单片机,买了本郭天祥的教材,但没有买对应的开发板,买了STC90C51版的。书里面的程序某些地方和买开发板附送的程序有些出入,虽说大同小异,但小异把自己给难住了,很久,调试了几天也没弄好。 要实现的功能很简单,但就是行不通,应该是数码管处理那里出了问题 程序这样写不出来,C版的也传不上来,就弄了个word。