中颖 SH79F166A 单片机 AD 和定时器问题

2020-01-24 11:59发布

有没有哪位大侠,用过中颖 SH79F166A 单片机 的!我是个新手,刚用这款单片机,用它的AD,AD值总是在乱跳,定时器的时间也不对!
请各位大侠,给个例程,学习下,谢谢!!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
wallelectronics
1楼-- · 2020-01-24 13:32
内部晶振还是外部晶振、是否分频?
看门狗是否开启??
AD乱跳是什么概念?跳了多少数,模拟信号接的什么信号?可以接一个恒定的信号,再看看还跳不跳。
hengjng_t
2楼-- · 2020-01-24 13:50
wallelectronics 发表于 2012-8-17 08:18
内部晶振还是外部晶振、是否分频?
看门狗是否开启??
AD乱跳是什么概念?跳了多少数,模拟信号接的什么信 ...

用的是 内部晶振,没分频!
看门狗 没开!
AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分压来做的,信号应该是很稳的,以前用STC的单片机这种方法没有问题!
我想应该是 单片机不熟悉,哪里设置不清楚,所以会有这样的结果!我把相关代码 贴上去,望大侠指教,谢谢!
AD相关代码
//-------AD define--------
#define AN0 0x00
#define AN1 0x02
#define AN2 0x04
#define AN3 0x06
#define AN4 0x08
#define AN5 0x0a
#define AN6 0x0c
#define AN7 0x0e

//*****************系统初始化**********************//
void        system_int()
{       
        P1CR=0xff;
        P1PCR=0xff;
        P1=0X00;
       
        P2CR=0xff;
        P2PCR=0xff;
        P2=0X00;
       
        P3CR=0xff;
        P3PCR=0xff;
        P3=0X00;
       
        P4CR=0x0f;          //设置p4.0为输入
        P4PCR=0x0f;          //关上拉电阻
        P4=0X00;
       
        P5CR=0xff;
        P5PCR=0xff;       
        P5=0X00;
       
}
//***************AD 采集****************//

uint get_adc(uchar ch)
{
//        int i,adc;
        ADCON        =        0x80;        //允许ADC模块
        ADT                =        0x20;        //DC时钟为系统时钟的32分频
        ADCH         =   0x01;           //选择AD输入通道       
        ADCON        |=  ch;           //选择CH1通道
        for(i=0;i<250;i++);
        ADCON        |=  0x01;        //开始ADC转换
        while(ADCON&0x01);
        adc = ADDH;
        adc<<=2;
        adc = adc + ADDL;

        return adc;
       
}
//********************AD 求平均******************//
void AD_COUNT()
{
        AD1=get_adc(AN0);//ADchange(AN0);//
        AD_zhong=AD_zhong+AD1;
        c++;
        if(c==50)
        {
                AD_jun=AD_zhong/50        ;
                AD_zhong=0;
                c=0;
        }
}


定时器相关代码
//*****************系统初始化**********************//
void        system_int()
{       
       
        P1CR=0xff;
        P1PCR=0xff;
        P1=0X00;
       
        P2CR=0xff;
        P2PCR=0xff;
        P2=0X00;
       
        P3CR=0xff;
        P3PCR=0xff;
        P3=0X00;
       
        P4CR=0x0f;          //设置p4.0为输入
        P4PCR=0x0f;          //关上拉电阻
        P4=0X00;
       
        P5CR=0xff;
        P5PCR=0xff;       
        P5=0X00;
       
}
//*****************定时器 初始化********************//
void time_int()
{

        CLKCON = 0x00;
        T2CON=0X00;        //定时器2 控制寄存器 16位自动重载方式
        T2MOD=0x00;//
        RCAP2H = 0xff;
        RCAP2L = 0xad;
        TH2    = 0xff;
        TL2    = 0xad;
        IEN0 = 0xa0;
        TR2=1;
        TF2=0;                       
        ET2=1;//使能T2中断
        EA=1;//开总中断                   
}
void Time2(void) interrupt 5
{  
    TF2=0;
    aa++;
}       
wallelectronics
3楼-- · 2020-01-24 17:44
hengjng_t 发表于 2012-8-17 09:51
用的是 内部晶振,没分频!
看门狗 没开!
AD 跳的范围很大,有几十的误差, 我是直接用精密滑动电阻器分 ...

我没用过这个片子,用的是165,有几个小建议:
1.不用每次读数据都配置AD吧,初始化一次就够了……,配置AD后有个建立时间;
2.adc = adc + ADDL;    ADDL只有低两位有效,把高六位清零后再和adc相加吧;
3.先别平均,光看看读出来的数据,虽然平均很简单,但也有可能出错,不要引入那么多不确定的因素。
hengjng_t
4楼-- · 2020-01-24 22:45
 精彩回答 2  元偷偷看……
oopuuo
5楼-- · 2020-01-25 00:13
想问一下  解决问题了吗
muyejingfeng
6楼-- · 2020-01-25 00:38
也是马上要开始用中颖的芯片了。

一周热门 更多>