关于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);
}
} 又有一个问题
每次发送的时候串口的最高位会出错
我测试的时候电脑发一个,单片机收到再回发给电脑
但是我发
电脑发: 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
不知道这是什么问题
有没有遇到过相似的,求解。。。。。 求回复求指点
不要沉下啊
各位大哥大姐 STC12C5202的AD是8位的! 它的头文件http://www.stcmcu.com/datasheet/stc/STC-AD-PDF/STC_NEW_8051.H 它的PDF手册http://www.stcmcu.com/datasheet/stc/STC-AD-PDF/STC12C5201AD.pdf 回复【5楼】yk28981
-----------------------------------------------------------------------
太感谢了,我看看。谢谢哈 回复【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位??? 它AD是没有低2位的!最大就0xff,因此<360,key=2; 54系列是10位的。
单独测试一下AD部分,看看是否正常
官网上还有相应例程 回复【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信号电平逻辑就知道。 回复【8楼】yk28981
它ad是没有低2位的!最大就0xff,因此<360,key=2;
-----------------------------------------------------------------------
厉害,呵呵 回复【10楼】bg8wj
-----------------------------------------------------------------------
非常感谢。我用的是STC12C5202AD,是5V的。232使用MAX232EPE.
在测试过程中发现误码很严重
如果是因为芯片引起的干扰的话
那么我下载程序时应该也会受到干扰导致程序错乱
但是程序下进去了,于是我想应该可以排除硬件问题
我把这段程序移植到STC89C52RC上发现也有这种错误
我想应该是程序问题
但是就是没发现程序哪里出错了
感觉这些寄存器该设定的都设定了 楼主你用的是多少晶振? 回复【13楼】rclong
-----------------------------------------------------------------------
11.0592
波特率是9600 回复【12楼】tianzhiying
-----------------------------------------------------------------------
硬件没问题的话还是再仔细看看datesheet吧! 你先把你的端口类型改了吧,改成高阻输入,M1:1,M0:0; 为了排除串口问题,建议不要用串口输出看结果,你就改成KEY=多少就让哪个口输出高电平,另外再来调通串口。 刚看了下你的程序,少了最关键的一条P1ASF = 0x01;(设置P1~0为模拟输入),另你这种应该是只有8位的直接取结果就行,但看资料结果是放在ADC_RES上面。 回复【18楼】szzyq
-----------------------------------------------------------------------
谢谢。现在问题都解决了。呵呵
页:
[1]