设为首页 收藏本站
开启辅助访问 切换到宽版

  找回密码
  立即注册

QQ登录

只需一步,快速开始

快捷导航
  • 论坛
  • 问答区
  • 单片机教程
  • 单片机DIY
  • 电子DIY
  • 帮助

热门: 51单片机 | 24小时必答区 | 单片机教程 | 单片机DIY制作 | STM32 | Cortex M3 | 模数电子 | 电子DIY制作 | 音响/功放 | 拆机乐园 | Arduino | 嵌入式OS | 程序设计

搜索
» 论坛 嵌入式/单片机论坛 24小时必答区 stc8H3k32s2单片机中断方式ADC转换有问题,请大家指点一 ...
返回列表 发新帖
查看: 3471|回复: 8
收起左侧

stc8H3k32s2单片机中断方式ADC转换有问题,请大家指点一下

[复制链接]
ID:686513 发表于 2021-12-26 13:38 | 显示全部楼层 | 阅读模式
一直卡在ADC转换等待那里,屏没显示。把ADC_IN();注示掉就可以显示000.这个中断程序是抄stc规格书里的.应该不会错呀。下面是原理图

芯片和基准电压供电

芯片和基准电压供电

气压力传感器

气压力传感器


单片机源程序如下:
//ADC基本操作(中断方式)
#include "ADC.H"
unsigned int AD_Dat;


        
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口

         
        P_SW2|=0X80;    //打开特殊功能寄存器
        ADCTIM=0X3F;    //设置ADC内部时序
        P_SW2&=0X7F;    //关闭特殊功能寄存器
        ADCCFG=0X0F;    //设置ADC结果左对齐+ADC时钟为系统时钟/2/16
        
        ADC_CONTR=0X80; //使能ADC模块(ADC电源打开并选择ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中断 (ADC中断打开)
        EA=1;           //总开关打开
        ADC_CONTR|=0X40;        //启动AD转换

   while(1);
}

void ADC_ISR()interrupt 5
{
        
        ADC_CONTR&=~0X20;          //清中断标志
        AD_Dat=(ADC_RES<<8)|ADC_RESL;               //读取ADC结果
        ADC_CONTR|=0X40;          //继续AD转换
}
上面是.C文件 ,下面是.H文件
#ifndef __ADC_H__
#define __ADC_H__

#include  "stc8hxx.h"
sbit a2=P1^1;
sbit a3=P1^7;

void ADC_IN();
extern unsigned int AD_Dat;

#endif


main程序
//头文件
#include  "stc8hxx.h"       //包含此头文件后,里面声明的寄存器不需要再手动输入,避免重复定义
#include  "delay.h"
#include  "display.h"
#include  "key.h"
#include "ADC.H"

#define     MAIN_Fosc      12000000L   //定义主时钟

/*******************************************************************************
* 文件名: 重定义
* 描  述:   
* 功  能:
* 作  者:
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
//typedef unsigned char u8;
//typedef unsigned int u16;
//typedef     unsigned long   u32;


/*******************************************************************************
* 文件名:全局变量定义区域
* 描  述:
* 功  能:
* 作  者:
* 版本号:1.0.1(2015.03.03)
*******************************************************************************/


unsigned char wnd=0;     //窗口变量,初始为P1    0可以改变默认窗口
unsigned char parm1=0;   //窗口P1 对应的变量
unsigned char parm2=0;   //窗口P2 对应的变量
unsigned char parm3=0;   //窗口P3 对应的变量
unsigned char parm4=0;   //窗口P4 对应的变量

/*******************************************************************************
* 文件名:函数前置声明
* 描  述:   
* 功  能:
* 作  者:
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/
void dis_Service();  //显示的功能函数
void key_Service();  //按键的功能函数

/*******************************************************************************
* 文件名:主函数
* 描  述: 完成程序模块的调用
* 功  能:
* 参  数:无
* 版本号:1.0.1(2017.05.23)
*******************************************************************************/                                 
                                 
void main()
{         
    P0M1 = 0x00;   P0M0 = 0x00;   //设置为准双向口
    P2M1 = 0x00;   P2M0 = 0x00;   //设置为准双向口
    P3M1 = 0x00;   P3M0 = 0x00;   //设置为准双向口   
    P5M1 = 0x00;   P5M0 = 0x00;   //设置为准双向口
    //P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口
         
//          led1=0; md1=0; fmq=0;
           a2=0; a3=0;
         
         
         
                 while(1)
           {
                        
//开机界面
// unsigned int i;
//         
//    for(i=0;i<5000;i++)
//     {
//                        Display();
//                 }
                                      
                          ADC_IN();               
                          dis_Service();
              Display();
           }

}


void dis_Service()
{
        
                         LEDBuf[0]=AD_Dat/100;
                          LEDBuf[1]=AD_Dat%100/10;                          
                          LEDBuf[2]=AD_Dat%10;
                          LEDBuf[3]=wnd;
                        
                        
}

还有个显示子程序
#include "display.h"

        
//共阳数码管编码表
unsigned char code leddata[]={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
                            0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e,0x91};
//共阴数码管编码表
//unsigned char code table[]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
//                           0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
                                                                                                               
//数据显示缓冲区
unsigned char LEDBuf[]= {16,13,2,8};        

//位选信号
unsigned char code PLACE_CODE[] ={0xfe,0xfd,0xfb,0xf7};
//单位段码
unsigned char code unit[] ={0xfe,0xfd,0xf7,0xfb};
void Display()
{
        unsigned char i;
        //1.送段码        
        //2.送位选
  //3.延时 1ms  全部数码管显示时间<10ms
  //4.消隐
        switch(i)
        {
                case 0:
                        duan=leddata[LEDBuf[0]];
                  wei=PLACE_CODE[0];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                  break;
          case 1:
                        duan=leddata[LEDBuf[1]];
                  wei=PLACE_CODE[1];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                break;
                 
                case 2:
                        duan=leddata[LEDBuf[2]];
                  wei=PLACE_CODE[2];
                  DelayXms(1);
                  duan=0xff;
                  i++;
                break;
               
                case 3:
                        duan=unit[LEDBuf[3]];
                  wei=PLACE_CODE[3];
                  DelayXms(1);
                  duan=0xff;
                  i=0;
                break;
               
               
                default:break;
               
        }
        
}

回复

使用道具 举报

ID:301191 发表于 2021-12-27 04:43 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:155507 发表于 2021-12-27 08:33 | 显示全部楼层
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口

         
        P_SW2|=0X80;    //打开特殊功能寄存器
        ADCTIM=0X3F;    //设置ADC内部时序
        P_SW2&=0X7F;    //关闭特殊功能寄存器
        ADCCFG=0X0F;    //设置ADC结果左对齐+ADC时钟为系统时钟/2/16
        
        ADC_CONTR=0X80; //使能ADC模块(ADC电源打开并选择ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中断 (ADC中断打开)
        EA=1;           //总开关打开
        ADC_CONTR|=0X40;        //启动AD转换

   //while(1); <-------- 这个不用加了
}
回复

使用道具 举报

ID:213173 发表于 2021-12-27 08:36 | 显示全部楼层
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口
       
        P_SW2|=0X80;    //打开特殊功能寄存器
        ADCTIM=0X3F;    //设置ADC内部时序
        P_SW2&=0X7F;    //关闭特殊功能寄存器
        ADCCFG=0X0F;    //设置ADC结果左对齐+ADC时钟为系统时钟/2/16
       
        ADC_CONTR=0X80; //使能ADC模块(ADC电源打开并选择ADC通道P1.0/ADC0)
        EADC=1;         //使能ADC中断 (ADC中断打开)
        EA=1;           //总开关打开
        ADC_CONTR|=0X40;//启动AD转换
       
        while(1);//不能这样生搬硬套
}
回复

使用道具 举报

ID:686513 发表于 2021-12-27 13:25 | 显示全部楼层
angmall 发表于 2021-12-27 08:33
void ADC_IN()
{         
          P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口

谢谢,我试试。
回复

使用道具 举报

ID:686513 发表于 2021-12-27 13:27 | 显示全部楼层
wulin 发表于 2021-12-27 08:36
void ADC_IN()
{         
        P1M1 = 0x01;   P1M0 = 0x00;   //设置 P1.0 为 ADC 输入口

明白了,谢谢了,我回去试试。不行再请教。
回复

使用道具 举报

ID:686513 发表于 2021-12-29 09:06 | 显示全部楼层
单端输入,可以了,传感器要是差分输入,程序该如何修改?
回复

使用道具 举报

ID:213173 发表于 2021-12-29 09:55 | 显示全部楼层
zhth1979 发表于 2021-12-29 09:06
单端输入,可以了,传感器要是差分输入,程序该如何修改?

ADC不能采集处理负电压信号。在量程范围内使差分放大器的输出电压限制在0~AVCC范围即可。
回复

使用道具 举报

ID:686513 发表于 2021-12-29 21:02 | 显示全部楼层
wulin 发表于 2021-12-29 09:55
ADC不能采集处理负电压信号。在量程范围内使差分放大器的输出电压限制在0~AVCC范围即可。

可能我描述的不清楚,这个压力传感器共4个脚,I+ I-为供电,有气压时O+和O-两个脚会有0-60mV的压差。问了一下单片机厂商,这种情况应该是用两路ADC口分别检测,结果相减,能不能在上面的中断程序里同时选两个通道,分时得结果,最好有例子。
回复

使用道具 举报

返回列表 发新帖
高级模式
B Color Image Link Quote Code Smilies
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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