tianzhiying 发表于 2012-1-1 23:23:03

关于STC12C5202的ADC,原帖问题已解决。一楼出现新问题,求解答。

今天试着用ADC做键盘扫描,用的是STC12C5202这个单片机
网上找到的都是其他54什么什么的资料
而且头文件也是54的
按键接的是单片机1.1脚,也就是ADC1,用电表测出按下不同按键1.1脚有明显电压变化,6个按键从0点几伏到4点多伏不等
但是程序读取的ADC数一直都是判断为KEY2,又不知道哪里出错了。
我是用串口看到,不管我按那个按键,一直都是那个KEY2;
请各位帮我看看
我是在Keil下编译的
会不会是头文件的一些寄存器有错误呢??
有没有谁有5202的头文件
麻烦发给我393494354@qq.com

程序如下
#include<stc12c5.h>
unsigned int ADdata;
char key;

void Delay(unsigned char x)
{
        unsigned char i,j;
        for(i=0;i<121;i++)
                for(j=0;j<x;j++);
}

void USART_Init(void)
{
//        AUXR=0x04;//这个AUXR一直不知道该怎么设定
        TMOD=0x20;
        SCON=0x50;
        PCON=0x00;
        TH1=0xfd;
        TL1=0xfd;
        TR1=1;
        EA=1;
        ES=1;
       
}

void Usend(unsigned char x)
{
        SBUF=x;
        while(!TI);
        TI=0;
}

void ADC_Getdata(void)
{       
        ADC_CONTR |= 0x61;                //选择通道1,设置最高转换s速度
        Delay(1);
        ADC_LOW2 &= 0x00;
        ADC_DATA &= 0x00;                //清空ADC数据
        Delay(1);
        ADC_CONTR |= 0x08;                //启动ADC_START
        while(!(ADC_CONTR&&0x10)) ;   //等待转换完成(ADC_FLAG=1表示完成)
        ADdata=ADC_DATA;
        ADdata=ADdata<<2;
        ADdata &= 0xffc;             //去掉最低两位
        ADdata |= ADC_LOW2;          //与最低两位相加
        ADC_CONTR &= 0xe7;                //清除ADC_FLAG,关闭ADC_START
}

void main()
{
        ADC_CONTR |= 0x80;      //启动ADC电源
        P1M0=1;
        P1M1=1;                  //P1口模式
        Delay(20);
        USART_Init();
        while(1)
        {
                ADC_Getdata();
                Delay(5);
                if(ADdata<230){ key=1; Usend(0x91);}
                else if(ADdata<360){ key=2;        Usend(0x93);}
                else if(ADdata<525){ key=3;        Usend(0x95);}
                else if(ADdata<625){ key=4;        Usend(0x97);}
                else if(ADdata<700){ key=5;        Usend(0x99);}
                else if(ADdata<800){ key=6;        Usend(0x9b);}
                else {key=7; Usend(0xaa);}
               
                Delay(10);       
        }
}

tianzhiying 发表于 2012-1-1 23:32:57

又有一个问题
每次发送的时候串口的最高位会出错
我测试的时候电脑发一个,单片机收到再回发给电脑
但是我发
电脑发:         0x01,0x02,0x03,0x04,0x05,0x11,0x12,0x43,0x73,0x82,0x99,0xaa,0xbb,0xcc
单片机收到回发: 0x81,0x82,0x83,0x84,0x85,0x91,0x92,0xb3,0xf3,0xf2,0x99,0xaa,0xbb,0xcc
不知道这是什么问题
有没有遇到过相似的,求解。。。。。

tianzhiying 发表于 2012-1-2 09:47:30

求回复求指点
不要沉下啊
各位大哥大姐

yk28981 发表于 2012-1-2 10:50:11

STC12C5202的AD是8位的!

yk28981 发表于 2012-1-2 10:51:46

它的头文件http://www.stcmcu.com/datasheet/stc/STC-AD-PDF/STC_NEW_8051.H

yk28981 发表于 2012-1-2 10:53:35

它的PDF手册http://www.stcmcu.com/datasheet/stc/STC-AD-PDF/STC12C5201AD.pdf

tianzhiying 发表于 2012-1-2 11:03:36

回复【5楼】yk28981
-----------------------------------------------------------------------

太感谢了,我看看。谢谢哈

tianzhiying 发表于 2012-1-2 11:07:21

回复【3楼】yk28981
-----------------------------------------------------------------------

sfr ADC_CONTR = 0xBC; //A/D 转换控制寄存器 ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 0000,0000
sfr ADC_RES= 0xBD;//A/D 转换结果高8位 ADCV.9 ADCV.8 ADCV.7 ADCV.6 ADCV.5 ADCV.4 ADCV.3 ADCV.2       0000,0000
sfr ADC_RESL = 0xBE;//A/D 转换结果低2位

这里是10位???

yk28981 发表于 2012-1-2 11:28:23

它AD是没有低2位的!最大就0xff,因此<360,key=2;

rifjft 发表于 2012-1-2 11:30:43

54系列是10位的。

单独测试一下AD部分,看看是否正常

官网上还有相应例程

bg8wj 发表于 2012-1-2 22:46:50

回复【1楼】tianzhiying
-----------------------------------------------------------------------

这个问题估计是max232电路上的问题,数据传输时候的“干扰”如果有示波器,你可以看一下,rx和tx的数据波形,如果传输时候同时出现
两个波形在两只信号引脚上,就基本可以确定是“干扰”。解决办法1、不要选择廉价的232芯片,估计你买到的是崴货。2、max232xxx xxx是芯片型号后缀,不同的后缀对电容容量要求不一样。严格按照datasheet上选用正确的电容,特别是datasheet提到的“电荷泵”电容。如果容量不足也会出现这样的问题。一般推荐使用10uF的铛电容,电解的话可以用到22uF。
判断方法也简单,用两片板子先tx rx互联,用电脑com1,2连接,先调试以下rs232部分电路。基本可以排除。我一直在用stc的mcu,基本上datasheet中提到5v的芯片不会出现串口电平信号识别错误的问题。
顺便说一下3.3v的le系列stc芯片,不能用普通的max232芯片。要用max3.3v系列信号调理芯片。具体你可以看看5V ttl 3.3Vttl信号电平逻辑就知道。

wandy2010 发表于 2012-1-2 23:37:46

回复【8楼】yk28981
它ad是没有低2位的!最大就0xff,因此&lt;360,key=2;
-----------------------------------------------------------------------

厉害,呵呵

tianzhiying 发表于 2012-1-3 10:10:06

回复【10楼】bg8wj
-----------------------------------------------------------------------

非常感谢。我用的是STC12C5202AD,是5V的。232使用MAX232EPE.
在测试过程中发现误码很严重
如果是因为芯片引起的干扰的话
那么我下载程序时应该也会受到干扰导致程序错乱
但是程序下进去了,于是我想应该可以排除硬件问题
我把这段程序移植到STC89C52RC上发现也有这种错误
我想应该是程序问题
但是就是没发现程序哪里出错了
感觉这些寄存器该设定的都设定了

rclong 发表于 2012-1-3 10:11:22

楼主你用的是多少晶振?

tianzhiying 发表于 2012-1-3 11:33:27

回复【13楼】rclong
-----------------------------------------------------------------------

11.0592
波特率是9600

zhousf85 发表于 2012-1-4 13:10:47

回复【12楼】tianzhiying
-----------------------------------------------------------------------
硬件没问题的话还是再仔细看看datesheet吧!

bigrog 发表于 2012-1-10 14:24:32

你先把你的端口类型改了吧,改成高阻输入,M1:1,M0:0;

szzyq 发表于 2012-1-10 14:38:05

为了排除串口问题,建议不要用串口输出看结果,你就改成KEY=多少就让哪个口输出高电平,另外再来调通串口。

szzyq 发表于 2012-1-10 15:20:12

刚看了下你的程序,少了最关键的一条P1ASF = 0x01;(设置P1~0为模拟输入),另你这种应该是只有8位的直接取结果就行,但看资料结果是放在ADC_RES上面。

tianzhiying 发表于 2012-1-10 16:02:07

回复【18楼】szzyq
-----------------------------------------------------------------------

谢谢。现在问题都解决了。呵呵
页: [1]
查看完整版本: 关于STC12C5202的ADC,原帖问题已解决。一楼出现新问题,求解答。