找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3490|回复: 8
收起左侧

关于STC8G1K08单片机ADC电压采集程序

[复制链接]
ID:383654 发表于 2023-8-8 16:32 | 显示全部楼层 |阅读模式
  1. #include<STC8G.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. uint ADC1_DATA;
  6. uchar ADC1_H;
  7. uchar ADC1_L;
  8. sbit fan=P1^4;
  9. void delayms(uint xms)                        
  10. {
  11.    uint a,b;
  12.    for(a=xms;a>0;a--)
  13.     for(b=700;b>0;b--);
  14. }
  15. void UartInit()    //
  16. {
  17. SCON = 0x50;
  18. T2L = 0xe8; //65536-11059200/115200/4=0FFE8H
  19. T2H = 0xff;
  20. AUXR = 0x15; //
  21. ES = 1; //
  22. EA = 1;

  23. }
  24. void send_byte(uint by)
  25. {
  26.         TI=0;
  27.         SBUF=by  ;
  28.         while(!TI);
  29.         TI=0;

  30. }
  31. void UART1_Isr() interrupt 4
  32. {
  33.   uint temp;
  34.         if(RI)
  35.         {
  36.           RI=0;
  37.                 temp=SBUF;
  38.         }
  39.         else
  40.         {
  41.           TI=0;             //Çå³ýTIλ
  42.         }
  43. }
  44. void main()
  45. {
  46. P0M0 = 0x00;
  47. P0M1 = 0x00;
  48. P1M0 = 0x10; //0001 0000
  49. P1M1 = 0x00; //0000 0000
  50. P2M0 = 0x00;
  51. P2M1 = 0x00;
  52. P3M0 = 0x00;
  53. P3M1 = 0x00;
  54. P4M0 = 0x00;
  55. P4M1 = 0x00;
  56. P5M0 = 0x00;
  57. P5M1 = 0x00;
  58.   
  59.         fan=0;
  60.         UartInit();
  61.         P0M0=0X00;
  62.         P0M1=0X08;
  63.         
  64.         P_SW2|=0X80;
  65.         ADCTIM=0X3F;
  66.         P_SW2&=0X7F;
  67.         
  68.         ADCCFG=0X2F;
  69.         ADC_CONTR=0X80;
  70.         
  71. while (1)
  72. {
  73.                ADC_CONTR|=0X43;
  74.                 delayms(1);
  75.                 while(!(ADC_CONTR&0X20));
  76.                 ADC_CONTR&=~0X20;
  77.                 ADC1_H=ADC_RES;
  78.                 ADC1_L=ADC_RESL;

  79.                     ADC1_DATA=ADC1_H*256+ADC1_L;
  80.          
  81.                    send_byte(ADC1_DATA/1000+0X30);
  82.                     send_byte(ADC1_DATA%1000/100+0X30);
  83.                     send_byte(ADC1_DATA%100/10+0X30);
  84.                     send_byte(ADC1_DATA%10+0X30);
  85.                                                          
  86.               send_byte(0X0A);
  87.               delayms(100);
  88. }
  89. }
复制代码
这个程序是在网上找的。通过串口可以收到数据,经过计算和采集的电压一致:
例如收到数据0100 通过计算:100*5.09(MCU电压)/1024≈0.5V
有几个问题不明白:
1.ADC1_H为什么要乘256?是因为8位吗?这个是10位的AD转换,为什么不直接取10位?
2.ADCCFG=0X2F;格式是右对齐,这8位是取的D9-D2还是D7-D0?
1691485692242.jpg

3.ADC1_DATA=ADC1_H*256+ADC1_L;这句程序怎么理解?得到的ADC1_DATA是几进制的数,大概格式是怎样的?
4.如果我想在采集到电压是2.5V的时候去启动风扇,程序该怎么写?


回复

使用道具 举报

ID:213173 发表于 2023-8-8 21:01 | 显示全部楼层
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;
回复

使用道具 举报

ID:123289 发表于 2023-8-9 09:09 | 显示全部楼层
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。
那么当你在读到此采样值时,就去启动风扇。

读书太少了,实在不想看书,改行罢。
回复

使用道具 举报

ID:401564 发表于 2023-8-9 22:14 | 显示全部楼层
单片机不是这么学的,除非你是天才
你得一步一步的来,先学会进制,寄存器,高电平低电平之类的,再去学一些比较深入的东西
你先思考100遍,哪怕你的思路全是错误,那对你来说,也是有用的
有些东西实在没办法,再来提问
比如,PID,FOC之类,这种东西,不借助他人,完全自己去撸代码,实在是太难了
像你这个问题,其实就是一个数据存放格式问题而已,并不存在什么难度可言
回复

使用道具 举报

ID:69038 发表于 2023-8-11 10:30 | 显示全部楼层
选择“左对齐”方式,直接取ADC_RES值就够用了,ADC_RESL的可以忽略——如你的应用不是高精尖的话。
回复

使用道具 举报

ID:586915 发表于 2023-11-23 19:10 | 显示全部楼层
复制了源码用不了
回复

使用道具 举报

ID:491577 发表于 2023-11-25 00:40 | 显示全部楼层
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;数据溢出是单片机初学者最容易犯的错误。
回复

使用道具 举报

ID:1034262 发表于 2023-11-25 21:37 | 显示全部楼层
楼主应该去STC官网找例子。
回复

使用道具 举报

ID:57657 发表于 2023-11-25 22:02 | 显示全部楼层
STC8G1K08 此型号有8,16,20脚的,你用的那一个?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表