STC8G1K08 此型号有8,16,20脚的,你用的那一个? |
楼主应该去STC官网找例子。 |
STC单片机的源码有问题,楼主的代码是有问题的,ADC1_DATA=ADC1_H*256+ADC1_L;这一句有问题,ADC1_H是8位的,ADC1_H*256会数据溢出,ADC1_H*256永远=0,应该改成:ADC1_DATA=(uint)ADC1_H*256+ADC1_L;数据溢出是单片机初学者最容易犯的错误。 |
复制了源码用不了 |
选择“左对齐”方式,直接取ADC_RES值就够用了,ADC_RESL的可以忽略——如你的应用不是高精尖的话。 |
单片机不是这么学的,除非你是天才 你得一步一步的来,先学会进制,寄存器,高电平低电平之类的,再去学一些比较深入的东西 你先思考100遍,哪怕你的思路全是错误,那对你来说,也是有用的 有些东西实在没办法,再来提问 比如,PID,FOC之类,这种东西,不借助他人,完全自己去撸代码,实在是太难了 像你这个问题,其实就是一个数据存放格式问题而已,并不存在什么难度可言 |
1.ADC1_H为什么要乘256?是因为8位吗?这个是10位的AD转换,为什么不直接取10位? 计算机是按字节读、存储数据的,一个字节8位。尤如每个抽屉放8颗豆子,你要取9,10,11……16。都必须开两个抽屉,而且取豆的是匙子也只装8个,不装其它数。 2.ADCCFG=0X2F;格式是右对齐,这8位是取的D9-D2还是D7-D0? ADC是10位数,可是必须用16位去存放,存放的方式有N种,其中: 最容易被接受的是前面作0:000000XX,XXXXXXXX。 次容易被接受的是后面作0:XXXXXXXX,XX000000。 不容易被接受的是:胡乱放。如果这样做,又要被你不解和笑话了。 ADCCFG是变量?还是特殊寄存器? 变量=2F,则与ADC无关。 特殊寄存器=2F,你要去查ADCCFG的含义。 3.ADC1_DATA=ADC1_H*256+ADC1_L;这句程序怎么理解? 现在这样放了:000000XX,XXXXXXXX。这是两个字节拼成的数。 你将它俩拼成ADC1_DATA,希望得到一个0-65535之间的数,不这样做你有何高见呢? ADC1_DATA是编译平台的认知(为了符合你的习惯认知),它是几进制的数,由你定义。 在CPU内部,它是由两个字节组成。在编译平台,它由你决定。 4.如果我想在采集到电压是2.5V的时候去启动风扇,程序该怎么写? 事先计算一下,2.5V对应的ADC采样值是多少,假设是:ADC1_H=A,ADC1_L=B。 那么当你在读到此采样值时,就去启动风扇。 读书太少了,实在不想看书,改行罢。 |
1.8位芯片的寄存器都是8位,10位数据需要用两个寄存器储存 2.两个寄存器储存10位数据可以右对齐也可以左对齐 3.ADC1_H*256就是<<8。可以写ADC1_DATA = ADC1_H<<8 | ADC1_L;。MCU只能处理2进制数据,C语言代码可以用10进制或16进制表述。经编辑器编辑后的机器语言都是2进制。 4.如果不需要显示电压值,2.5V电压(VCC=5V)经10位ADC采集ADC1_DATA=512。if(ADC1_DATA>=512) fan=1;else fan=0; |