单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:6208|回复:14
打印上一主题下一主题

STC8G1K08A--SOP8查询ADC串口发送10位ADC值

 [复制链接]
跳转到指定楼层
楼主
ID:796012发表于 2022-6-4 11:26|只看该作者|只看大图回帖奖励
#include "STC8G.h"  //6路10位高速ADC(8路PWM可当8路D/A使用)  00 0000 0000
#include "intrins.h"
unsigned  int dy;unsigned  char tempData[9];/*MCU发送到串行口的数据*/unsigned  char shuzi[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*数组串行口显示数值用*/
void UartInit() //9600bps@11.0592MHz
{
   SCON=0x50;/*8位数据,可变波特率*/AUXR|=0x40;/*定时器时钟1T模式*/AUXR& = 0xFE;/*串口1选择定时器1为波特率发生器*/TMOD&=0x0F;/*设置定时器模式*/
     TL1=0xE0;/*设置定时初始值*/TH1=0xFE;/*设置定时初始值*/ET1= 0;/*禁止定时器%d中断*/TR1 = 1;/*定时器1开始计时*/
}
void LED1()
{
     P5M1=0;P5M0=0x20;//推挽输出
}
void SendData(unsigned char dat)/* 串口发送字节数据函数 参数是你要发送的字节 */
{
     SBUF = dat;/*把要发送的数据给了SBUF寄存器*/while(!TI);/*等待数据发送完成*/TI = 0;/*清除发送完成标志位*/
}
void SendString(unsigned char *puf)   //发送一个字符串  
{
     while(*puf!='\0')/*遇到空格跳出循环*/{SendData(*puf);puf++;}SendData('\r');/*回车*/SendData('\n');/*换行*/    
}
void adccx()  //?只有8位数据 255
{
   ADC_CONTR |= 0x40;       //启动AD转换
   _nop_();
   _nop_();
   while (!(ADC_CONTR& 0x20));//查询ADC完成标志
   ADC_CONTR& = ~0x20;       //清完成标志
       //dy = ADC_RES+ADC_RESL;   //只读取8位ADC结果
       ADC_RESL=ADC_RESL&0XC0;     //读取10位的低字节2位
       dy = (ADC_RES<< 2)|ADC_RESL>>6;//读取10位ADC结果
}
void adczh()
{
     adccx();tempData[0]=shuzi[dy/1000]; tempData[1]=shuzi[dy%1000/100];tempData[2]=shuzi[dy%100/10];  tempData[3]=shuzi[dy%10];  
     SendString(tempData);//由0-9发送串口数值
}
void main()
{
       unsigned char x =0; /* 定义一个8位变量 用于接收串口接收的字节 */
   P5M0 = 0x00;P5M1 = 0x10; /*设置ADC4(P5.4)为ADC口*/LED1(); /* IO设置*/ UartInit(); // 串口初始化
   P_SW2 |= 0x80;ADCTIM = 0x3f;/*设置ADC内部时序*/P_SW2& = 0x7f;ADCCFG = 0x0f;/*设置ADC时钟为系统时钟/2/16*/ADC_CONTR = 0x80;/*使能ADC模块*/
   while (1)
   {
     adczh();  
     if (RI)// 如果串口接收到数据
     {
     RI = 0;     //清中断标志              
     x =SBUF;
           SendData(SBUF);     // 把接收的数据再发送出去
     if (x == 0x02)
     {
     P55 = !P55;  //翻转led状态
     }
     }
   }
}
void Uart() interrupt 4
{    
     if (RI)/*接收中断标志位*/{RI = 0;/*清除RI位*/}if (TI)/*发送中断标志位*/{TI = 0;/*清除TI位*/}
}

评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
ID:796012发表于 2022-6-4 11:28|只看该作者
程序是拼凑修改的,供黑友一起学习琢磨
板凳
ID:796012发表于 2022-6-4 14:04|只看该作者
把主函数那ADC_ADC_CONTR = 0x80;/*使能ADC模块*/   修改成 = 0x84;/*使能ADC模块 打开ADC模块 将ADC引脚设置到P5.4*/  
以下是ADC5-0通道选择:0x85 0x84  0x83 0x82 0x81 0x80
/*低位权值:8421。  P3.0/ADC0:0000  P3.1/ADC1:0001  P3.2/ADC2:0010  P3.3/ADC3:0011  P5.4/ADC4:0100  P5.5/ADC5:0101*/
地板
ID:546224发表于 2022-7-12 19:22|只看该作者
“dy = (ADC_RES<< 2)|ADC_RESL>>6;//读取10位ADC结果”
这句确定可以正常运行吗?ADC_RES是8位的值,左移两位就会把高两位结果丢掉
应该先把ADC_RES的值赋值给一个16位变量后再左移
5#
ID:796012发表于 2022-7-16 14:23|只看该作者
kiki900330 发表于 2022-7-12 19:22
“dy = (ADC_RES >6;//读取10位ADC结果”
这句确定可以正常运行吗?ADC_RES是8位的值,左移两位就会把高两 ...

没仔细研究过,我这精度要求不是很高,就很久没琢磨了。放在太阳能电路上,够12伏就升压供小爱音箱,低于11伏就关停。运行了半个月吧,还行
6#
ID:229641发表于 2022-7-16 16:20来自手机|只看该作者
玉萌业余发展 发表于 2022-7-16 14:23
没仔细研究过,我这精度要求不是很高,就很久没琢磨了。放在太阳能电路上,够12伏就升压供小爱音箱,低于 ...

这个片子的例程大佬有吗?能不能分享一下?
7#
ID:188720发表于 2022-7-21 09:34|只看该作者
触景情伤 发表于 2022-7-16 16:20
这个片子的例程大佬有吗?能不能分享一下?

去看STC官方提供的技术手册,例程非常丰富。
8#
ID:639666发表于 2023-2-7 16:03|只看该作者
玉萌业余发展 发表于 2022-6-4 14:04
把主函数那ADC_ADC_CONTR = 0x80;/*使能ADC模块*/   修改成 = 0x84;/*使能ADC模块 打开ADC模块 将ADC引脚设 ...

能给个完整电路图吗?电压检测端子是芯片的第1脚吗?
9#
ID:1042619发表于 2023-2-9 16:57|只看该作者
   感谢楼主精彩分享! 如有需要也可参考STC-ISP 6.91J一体化软件范例程序:下载STC8G系列ADC-基本操作(查询方式)范例代码
  

#include "reg51.h"
#include "intrins.h"

sfr     ADC_CONTR   =   0xbc;
sfr     ADC_RES     =   0xbd;
sfr     ADC_RESL   =   0xbe;
sfr     ADCCFG     =   0xde;

sfr     P_SW2   =   0xba;
#define ADCTIM  (*(unsigned char volatile xdata *)0xfea8)

sfr     P0M1   =   0x93;
sfr     P0M0   =   0x94;
sfr     P1M1   =   0x91;
sfr     P1M0   =   0x92;
sfr     P2M1   =   0x95;
sfr     P2M0   =   0x96;
sfr     P3M1   =   0xb1;
sfr     P3M0   =   0xb2;
sfr     P4M1   =   0xb3;
sfr     P4M0   =   0xb4;
sfr     P5M1   =   0xc9;
sfr     P5M0   =   0xca;

void main()
{
   P0M0 = 0x00;
   P0M1 = 0x00;
   P1M0 = 0x00;
   P1M1 = 0x00;
   P2M0 = 0x00;
   P2M1 = 0x00;
   P3M0 = 0x00;
   P3M1 = 0x00;
   P4M0 = 0x00;
   P4M1 = 0x00;
   P5M0 = 0x00;
   P5M1 = 0x00;

   P1M0 = 0x00;                       //设置P1.0为ADC口
   P1M1 = 0x01;
   P_SW2 |= 0x80;
   ADCTIM = 0x3f;                     //设置ADC内部时序
   P_SW2& = 0x7f;
   ADCCFG = 0x0f;                     //设置ADC时钟为系统时钟/2/16
   ADC_CONTR = 0x80;                   //使能ADC模块

   while (1)
   {
       ADC_CONTR |= 0x40;               //启动AD转换
       _nop_();
       _nop_();
       while (!(ADC_CONTR& 0x20));         //查询ADC完成标志
       ADC_CONTR& = ~0x20;               //清完成标志
       P2 = ADC_RES;                   //读取ADC结果
   }
}


10#
ID:796012发表于 2023-3-20 14:37|只看该作者
大漠孤烟001 发表于 2023-2-9 16:57
感谢楼主精彩分享! 如有需要也可参考STC-ISP 6.91J一体化软件范例程序:下载STC8G系列ADC-基本操作(查 ...

11#
ID:1060517发表于 2023-3-21 13:18|只看该作者
请问STC8G1K08A误触发是什么原因
12#
ID:796012发表于 2023-5-17 09:02|只看该作者
unsigned int dy;  dy=ADC_RES<<2|ADC_RESL;/*10位ADC*/    
13#
ID:796012发表于 2023-5-17 09:05|只看该作者
unsigned int dy;  /*先声明16位变量*/
dy=ADC_RES<<2|ADC_RESL;/*低2位和高8位拼成10位ADC*/    
14#
ID:9486发表于 2023-6-20 09:51|只看该作者
电路图有吗,P5.4来检测电压?
15#
ID:232366发表于 2024-7-8 21:04|只看该作者
玉萌业余发展 发表于 2023-5-17 09:05
unsigned int dy;  /*先声明16位变量*/
dy=ADC_RES

此改动后不知道为什么采样口直接对地AD值还有2  变成2-1023了

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

Powered by 单片机教程网