找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5196|回复: 13
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
#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位*/}
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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来检测电压?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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