找回密码
 立即注册

QQ登录

只需一步,快速开始

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

关于STC8单片机的AD电压数码管显示转换不出来

[复制链接]
跳转到指定楼层
楼主
ID:265485 发表于 2021-3-31 23:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
求助哪位大哥解释一下
#include "STC15F2Kxx.h"
#include "Delay.h"
#include "intrins.h"

#define uchar unsigned char       
#define uint unsigned int
       
#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
#define ADC_SPEEDL  0x20            //360个时钟
#define ADC_SPEEDH  0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟

void InitADC();
void Init();

uchar ADC_Value=0,Set,seconds=0,Minutes=10,tt;

uchar code  Tab0[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的显示码
uchar code Tab1[]=                //定义数码管数组,小数点
{0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0x87,0xFF,0xEF};

sbit KS1 = P1^0;               //数码管1位选
sbit KS2 = P1^1;                //数码管2位选
sbit KS3 = P1^2;                //数码管3位选
sbit KS4 = P1^3;                //数码管4位选

sbit LED = P5^5;               //LED指示灯
/*------------------------------------------------
mS延时函数,含有输入参数 unsigned char t,无返回值
unsigned char 是定义无符号字符变量,其值的范围是
0~255 这里使用晶振12M,精确延时请使用汇编
------------------------------------------------*///
void Delay(unsigned int x)                 ///////1ms延时
{
        unsigned char i,j;
        for(;x>0;x--)
  {
          for(i=10;i>0;i--)
                for(j=10;j>0;j--);
   }
}

void Display0()                        //显示时钟
{
if(Set==0)
                        {
                                P3=Tab0[ADC_RES/10];                //显示秒的个位       
                                KS1=0;                                        //段选
                                Delay(10);                                        //延时
                                KS1=1;                                        //消隐

                                P3=Tab0[ADC_RES%10];                //显示秒的十位
                                KS2=0;                                        //段选
                                Delay(10);                                        //延时
                                KS2=1;                                        //消隐

                                P3=Tab0[Minutes/10];                //显示分的个位,需要加上小数点做分隔符
                                KS3=0;                                        //段选
                                Delay(10);                                        //延时
                                KS3=1;                                        //消隐

                                P3=Tab0[Minutes%10];                //显示分的十位
                                KS4=0;                                        //段选
                                Delay(10);                                        //延时
                                KS4=1;                                        //消隐       
                        }
        else
          {
                    P3=Tab1[seconds/10];                //显示秒的个位       
                                KS1=0;                                        //段选
                                Delay(10);                                        //延时
                                KS1=1;                                        //消隐

                                P3=Tab1[seconds%10];                //显示秒的十位
                                KS2=0;                                        //段选
                                Delay(10);                                        //延时
                                KS2=1;                                        //消隐

                                P3=Tab1[Minutes/10];                //显示分的个位,需要加上小数点做分隔符
                                KS3=0;                                        //段选
                                Delay(10);                                        //延时
                                KS3=1;                                        //消隐

                                P3=Tab1[Minutes%10];                //显示分的十位
                                KS4=0;                                        //段选
                                Delay(10);                                        //延时
                                KS4=1;                                        //消隐       
               
                  }
}
/*******************************************************************************
* 函数名  : main
* 描述    : 主函数,用户程序从main函数开始运行
* 输入    : 无
* 输出    : 无
* 返回值  : 无
* 说明    : 无
*******************************************************************************/
void main(void)
{
         
    P3M1 &= 0x00;
    P3M0 |= 0x00;
    P1M1 &= 0x00;
    P1M0 |= 0x00;
          P5M1 &= 0x00;
    P5M0 |= 0xFF;
    Init();
    Timer0_Init_Config();        //定时器0 16位自动重载模式初始配置
    InitADC();        //初始化ADC
//    Display0();       
    while(1)
    {
//                        LED=!LED;
                        Delay_Nms(200);
    }
}


/*******************************************************************************
* 函数名  : InitADC
* 描述    : 初始化ADC
* 输入    : 无
* 输出    : 无
* 返回值  : 无
* 说明    : 无
*******************************************************************************/
void InitADC()
{
    unsigned char ch;

    ch=0;
    P1ASF = 0x10;        //设置P1.0口为AD口
    ADC_RES = 0;        //清除结果寄存器
    ADC_CONTR = 0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    Delay_Nms(5);//延时500ms//ADC上电并延时
    EADC = 1;//使能ADC中断
    EA=1;//使能总中断
}

/*******************************************************************************
* 函数名  : ADC_ISR
* 描述    : ADC中断服务函数
* 输入    : 无
* 输出    : 无
* 返回值  : 无
* 说明    : 无
*******************************************************************************/
void ADC_ISR() interrupt 5
{
    unsigned char ch;

    ADC_CONTR &= !ADC_FLAG;         //清除ADC中断标志

    if(ADC_RES > 100)//A/D转换结果高8位
    {
        //LED=1;        //点亮LED.P21
    }
    else
    {
        //LED=0;        //关闭LED.P21
    }

    ch=0;
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
}
/*************************************************************************
**************************************************************************
******************************* 中断初始化函数*****************************
**************************************************************************
***********************************************************************////
void Init()                                                         //中断初始化函数
{
    EA=1;                                                         //开总中断
    TMOD=0X11;                                                  //定时器工作方式选择,定时器0和定时器1都选择第1种工作方式
    TH0=(65536-10000)/256;                        //定时器0装初值,定时50ms
    TL0=(65536-10000)%256;
    ET0=1;                                                        //开定时器0开关
    TR0=1;                                                           //开定时器0小开关

    TH1=(65536-10000)/256;                        //定时器1装初值,定时50ms
    TL1=(65536-10000)%256;
    ET1=1;                                                          //开定时器1开关
    TR1=1;                                                        //关定时器1小开关
}

/*************************************************************************
******************************* 定时器1***********************************
***********************************************************************////
void Time1() interrupt 3                          //定时器1函数
{
        TH1=(65536-10000)/256;                        //重装初值
        TL1=(65536-10000)%256;       
  Display0();                                //数码管在定时器1里时时显示时间                   
        tt++;
  if(tt>50)                                        //每溢出10次Time0_bit取反一次
          {          
      Set=1;                       
                        LED=1;                                          //0.5秒闪烁一次指示
     }
  if(tt>100)                                        //每溢出10次Time0_bit取反一次
          {
      tt=0;       
      Set=0;                       
                        LED=0;                                          //0.5秒闪烁一次指示
     }       
}

/*************************************************************************
******************************* 定时器0***********************************
***********************************************************************////
void Time0() interrupt 1                                         //定时器0函数
{       
        TH0=(65536-1000)/256;                                           //重装初值
        TL0=(65536-1000)%256;
//        tt++;
//  if(tt>20)                                        //每溢出10次Time0_bit取反一次
//          {          
//      Set=1;                       
//                        LED=1;                                          //0.5秒闪烁一次指示
//     }
//  if(tt>40)                                        //每溢出10次Time0_bit取反一次
//          {
//      tt=0;       
//      Set=0;                       
//                        LED=0;                                          //0.5秒闪烁一次指示
//     }               
       
}

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

使用道具 举报

沙发
ID:328014 发表于 2021-4-1 00:41 | 只看该作者
有可能是电路的问题,或者是短路 短路等,拍张板子运行的照片看看 什么情况
回复

使用道具 举报

板凳
ID:65956 发表于 2021-4-1 08:19 | 只看该作者
你用的是STC15W及以前产品的ADC采集函数,这次的STC8是和以前任何一款不能兼容采集方式,所以你只要对照手册,稍改一下就可以了,我也是这么处理的
回复

使用道具 举报

地板
ID:213173 发表于 2021-4-1 12:01 | 只看该作者
STC8系列与15W系列的ADC相关寄存器有区别,不能直接套用15W系列的程序。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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