打印

经电位器取出电压老控制显示,音乐

[复制链接]
3015|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hanfei08131106|  楼主 | 2010-6-15 12:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
要求:取电位器电压,经12C5A60S2单片机内部A/D转换0--5V  对数字量0--1024电压,通过旋转电位器利用每一个整电压之间来控制一个状态,现在程序很不稳定,帮我看看啊!急急急急、、、
#include  <reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
sfr P1ASF=0x9d;
sfr ADC_CONTR =0xbc;    //power  speed1 speed0 flag  st chs2 chs1 chs0
sfr ADC_RES=0xbd;
sfr  ADC_RESL=0xbe;
sbit ser=P2^1;     //LED显示 595数据输入
sbit srclk1=P2^2;  //
sbit rclk1=P2^3;   //
sbit BEEP=P3^2;
sbit led=P1^7;
uchar th0_f;         //在中断中装载的T0的值高8位
uchar tl0_f;         //在中断中装载的T0的值低8位
uchar idata  LED[ ]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xfe,0xbf};//共阳极段码表说明
uchar idata  bb[]={0,0,10,0,11,11,11,11},cc[]={0,0,10,0,11,11,11,11};
uchar code freq[36*2]={            //T0的值,及输出频率对照表
    0xa9,0xef,//00220HZ,1          //0
    0x93,0xf0,//00233HZ,1#
    0x73,0xf1,//00247HZ,2
    0x49,0xf2,//00262HZ,2#
    0x07,0xf3,//00277HZ,3
    0xc8,0xf3,//00294HZ,4
    0x73,0xf4,//00311HZ,4#
    0x1e,0xf5,//00330HZ,5
    0xb6,0xf5,//00349HZ,5#
    0x4c,0xf6,//00370HZ,6
    0xd7,0xf6,//00392HZ,6#
    0x5a,0xf7,//00415HZ,7
    0xd8,0xf7,//00440HZ   1        //12
    0x4d,0xf8,//00466HZ 1#         //13
    0xbd,0xf8,//00494HZ 2          //14
    0x24,0xf9,//00523HZ 2#         //15
    0x87,0xf9,//00554HZ 3          //16
    0xe4,0xf9,//00587HZ 4          //17
    0x3d,0xfa,//00622HZ 4#         //18
    0x90,0xfa,//00659HZ 5          //19
    0xde,0xfa,//00698HZ 5#         //20
    0x29,0xfb,//00740HZ 6          //21
    0x6f,0xfb,//00784HZ 6#         //22
    0xb1,0xfb,//00831HZ 7          //23
    0xef,0xfb,//00880HZ '1
    0x2a,0xfc,//00932HZ '1#
    0x62,0xfc,//00988HZ '2
    0x95,0xfc,//01046HZ '2#
    0xc7,0xfc,//01109HZ '3
    0xf6,0xfc,//01175HZ '4
    0x22,0xfd,//01244HZ '4#
    0x4b,0xfd,//01318HZ '5
    0x73,0xfd,//01397HZ '5#
    0x98,0xfd,//01480HZ '6
    0xbb,0xfd,//01568HZ '6#
    0xdc,0xfd,//01661HZ '7        //35
};
timer0() interrupt 1              //定时中断0,用于产生歌唱频率
{
    TL0=tl0_f;                   //调入预定时值
    TH0=th0_f;
    BEEP=~BEEP;                  //取反音乐输出IO
    P2=~P2;
}

void delayXms(uint n)
{
    uint i,j;
    for(i=0;i<n;i++)
       for(j=0;j<125;j++);
}
void outbyte(uchar a,b)
{
uchar j;
   for(j=0;j<8;j++)   //位码移位串行输出
   {     if(a&0x80) ser=1;  else  ser=0;
            a=a<<1;
            srclk1=0;
            srclk1=1;
    }
  for(j=0;j<8;j++)   //位码移位串行输出
   {     if(b&0x80) ser=1;  else  ser=0;
            b=b<<1;
            srclk1=0;
            srclk1=1;
    }
   rclk1=0;   //595锁存脉冲
      rclk1=1;
  }
/*void AD_init() //ADC初始化
{
ADC_CONTR|=0x80;  //开ADC电源
        P1M0=0x01;
P1M1=0x00;
ADC_CONTR&=0xf8;
}   */
//--------------------------------------------------------------------
uint GET_AD_Result()//启动AD转换并返回转换值
{
uchar temp;
uint data_temp;
data_temp=0;
ADC_RES=0;
ADC_RESL=0;
ADC_CONTR|=0x08;//启动AD
re: temp=0x10;
temp&=ADC_CONTR;//查询ADC_FLAG,忙标志,转换完否
if(temp==0)
  goto re;
ADC_CONTR&=0xe0;//P1.0为AD输入口
data_temp=ADC_RES;
data_temp<<=2;
data_temp+=ADC_RESL;
return data_temp;
}

//--------------------------------------------------------------------
void main(void) using 0
{
uint result,temp,i,a,c,d,e,f;
uchar aa[3]={0,0,0};
P1ASF=0x01;
ADC_CONTR=0xe0;                   //P1.0为AD输入口
        while(1)
        {
                 ulong n;
                 uchar i;
                 uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567'1 八个音符在频率表中的位置
                 TMOD=0x00;                   //使用定时器0的13位工作模式    0x00效果更好
                 TR0=1;
                 ET0=1;
                 EA=1;
                result=GET_AD_Result();
  aa[2]=result*5/1024;     //模拟量显示0-5v   数学转换
                bb[0]=6;
                bb[1]=0;
                bb[2]=1;
                bb[3]=1;
                bb[4]=3;
                bb[5]=1;
                bb[6]=8;
                bb[7]=0;
                cc[0]=0;
                cc[1]=8;
                cc[2]=1;
                cc[3]=3;
                cc[4]=1;
                cc[5]=1;
                cc[6]=0;
                cc[7]=6;
                e=0xfe;
                f=aa[2]%10;
                if(f==0)       //控制蜂鸣器
                           {
                              delayXms(1000);
                              if(f==0)
                           {
                              for(i=0;i<8;i++)          //循环播放8个音符
                                {
                                   tl0_f=freq[jie8[i]*2];     //置一个音符的值
                                   th0_f=freq[jie8[i]*2+1];
                                   for(n=0;n<50000;n++);      //延时1秒左右
                                }
                                }
                           }
                if(f==1)
                           {
                           delayXms(1000);
                           if(f==1)//显示学号
                           {
                             for(i=0;i<8;i++)
                  {
                     d=LED[cc[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  }
                                }
                           }  ;
                 if(f==2)     //学号显示
                           {  delayXms(1000);
                              if(f==2)
                              {
                             for(i=0;i<8;i++)
                  {
                     d=LED[bb[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  }
                                }
                           } ;
                   if(f==3)
                           {
                           delayXms(1000);
                           if(f==3)
                           {
                             for(i=0;i<8;i++)
                  {
                     d=LED[cc[i]];
                     if(i==2) c=c&0x7f;
                         outbyte(e,d);
                     e=(e<<1)|0x01;
                  }
                                }
                            }  ;
                }

}

电位器控制显示.rar

1.99 KB

相关帖子

沙发
hanfei08131106|  楼主 | 2010-6-15 16:26 | 只看该作者
急急、、、、

使用特权

评论回复
板凳
strang| | 2010-6-15 17:24 | 只看该作者
首先电位器要稳定,
其次,你弄个0~255个数,你试试、、、

使用特权

评论回复
地板
hanfei08131106|  楼主 | 2010-6-15 17:37 | 只看该作者
楼上兄弟是说循环弄255吗?还是?

使用特权

评论回复
5
zhang123| | 2010-6-15 18:45 | 只看该作者
楼主问题要分开分析  究竟是ad转换数据不稳还是模拟信号不稳等等

使用特权

评论回复
6
strang| | 2010-6-15 20:45 | 只看该作者
LZ,你现在0~5v的电压能取0~1024个模拟量吗?你弄成0~255个模拟量试试???先看看稳定不?

使用特权

评论回复
7
isoar| | 2010-6-16 09:07 | 只看该作者
调程序要有耐心,不稳定,就要一级一级的分析不稳定的源头。
你的问题估计十有巴酒(那两字敏感啊)是在电位器,电位器不是精密器件,你调整的时候,电阻值肯定不是理论上的由 0 到 Rmax 线性变化的。中间肯定会出现由接触不良或其他问题引起的异常值(突然变大,突然变小)。想稳定有很多方法,可以改用有平均值输出的AD,或提高AD采样率自己计算平均值,当然如果你有足够的CPU资源也可以用比平均值更优秀的卡尔曼滤波直接除去异常点。或者更换硬件,数字量调节应该用数字旋扭,用电位器做那就必须要在软件上做更多的工作。
我们干这工作,怕麻烦肯定不行。

使用特权

评论回复
8
hanfei08131106|  楼主 | 2010-6-16 16:35 | 只看该作者
听君一席话,胜读十年书啊!谢了

使用特权

评论回复
9
zhchyl| | 2010-6-16 17:38 | 只看该作者
看看电源稳定不

使用特权

评论回复
10
softerchang| | 2010-6-18 14:03 | 只看该作者
ulong n;
                 uchar i;
                 uchar code jie8[8]={12,14,16,17,19,21,23,24};//1234567'1 八个音符在频率表中的位置
                 TMOD=0x00;                   //使用定时器0的13位工作模式    0x00效果更好
                 TR0=1;
                 ET0=1;
                 EA=1;
这几句怎么放在主循环中呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:适应环境,不要让环境去适应你、、

5

主题

144

帖子

1

粉丝