找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC12系列单片机ADC中断使用

[复制链接]
跳转到指定楼层
楼主
ID:336427 发表于 2021-3-11 17:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下程序为使用STC12C5A60S2单片机,采用ADC中断扫描模式,并且初始化定时器P进行WM输出,用串口输出温度数值:
难点:ADC中断与PWM输出靠定时器0发生并且串口通讯波特率靠定时器1发生,这几个中断在代码编写与调试过程中,发现这几个程序独立应用的代码直接移植过来,并不能正常使用,这几个中断的优先级顺序和初始化顺序会产生相互干扰,因此经过查找相关资料,最终解决了这个问题,下面为详细代码(注释是手打上去的,不知道为啥从keil往这里粘贴会出现问题)


void PWM_init() //PWM初始化函数,初始化占空比为0
{
        CMOD=0x02;        //0000 0010 空闲时不计数,不产生中断,时钟源fosc/2,因此输出占用率fosc/512
        CL=0x00;
        CH=0x00;
        CCAPM0=0x42; //0100 001,8位PWM
        CCAP0L=0x00;
        CCAP0H=0x00; //PWM实现方法,因为是8位,CL基础计算器从0xFF递减到0x00,溢出后将CCAPOH的值加载到CCAPOL,若CL递减过程中,若大于CCAPOL,则输出高电平,否则为低电平
        CCAPM1=0x42;
        CCAP1H=0x00;
        CCAP1L=0x00;
        CR = 1;          //开启PCA计数器
}
void PWM_set(uchar x,uchar y) //占空比设置函数     引脚为P1.3和P1.4
{
                CCAP0H=x*2.55;    /占空比公式D=(256-CCAPnH)/256(8位PWM模式)
                CCAP0L=x*2.55;                //乘2.55转换为0--100%
                CCAP1H=y*2.55;
                CCAP1L=y*2.55;
}
void Timer0_Init(void)
{
        TH0=(65536-TIME)/256;           //开定时器0
    TL0=(65536-TIME)%256;
    EA=1;                             //开全局中断
    ET0=1;                             //允许定时器0中断
        TR0=1;
               
                IE = 0xa0;
}
void timer0() interrupt 1     //interrupt 1: ¶¨ê±Æ÷0£¬interrupt3£o¶¨ê±Æ÷3
{
    TH0=(65536-TIME)/256;       //高八位,(需要表示Xms的定时,计数器由65536-X数到65536,由于16位,只能分高低位)
    TL0=(65536-TIME)%256;     /低八位
        num++;
        if(num==500)
        {
                flagTime ++;
                num = 0;
        }
        Init_ADC();
}
/*------------------------------------------------
                    串口初始化
------------------------------------------------*/
void Init_UART  (void)
{
        SCON = 0x50;                //8位数据,可变波特率
        TMOD |= 0x20;                //设定定时器1为16位自动重装方式
        TL1 = 0xC0;                //设定定时器高8位初值
        TH1 = 0xFA;                //设定定时器低8位初值
        TR1 = 1;                //启动定时器
        EA = 1;
}                           
/*------------------------------------------------
                 发送一个字节
------------------------------------------------*/
void SendByte(unsigned char dat)
{
SBUF = dat;
while(!TI);
      TI = 0;
}
/*------------------------------------------------
              发送一个字符串
------------------------------------------------*/
void SendStr(unsigned char *s)
{
while(*s!='\0')// \0表示字符串结束标志
                /通过检测是否是字符串末尾
  {
  SendByte(*s);
  s++;
  }

}
/*----------------------------
ADC interrupt service routine
----------------------------*/
void adc_isr() interrupt 5 using 1
{
   //V_5REF=V_1REF*256/da_ref;
   if(ADC_Chanul_Turn%2==0)                     //外部基准电压
   {   
       temp1=ADC_RES;                                   //获取转换结果
       ADC_1Data=((double)temp1/256)*5;     //取八位计算基准电压Data
           adc1 = ADC_1Data;
       }
   if(ADC_Chanul_Turn%2==1)
   {
       temp0=ADC_RES;                                  //获取转换结果
       ADC_0Data=((double)temp0/256)*5;     //取八位计算实际值Data
       adc0 =ADC_0Data;
       }


   ADC_CONTR = ADC_POWER | ADC_SPEEDH | ADC_START | ADC_Chanul_Turn;
   ADC_Chanul_Turn++;
   if(ADC_Chanul_Turn==2)
      ADC_Chanul_Turn=0;
}


/*----------------------------
Initial ADC sfr
----------------------------*/
void Init_ADC()
{
    P1ASF = 0x03;                   //Set all P1 as analog input port
    ADC_RES = 0;                    //Clear previous result
//    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
    if(ADC_Chanul_Turn%2==0)//外部基准电压
    {
        ADC_CONTR=0xF0; //AD转换控制器,1111,0000 P10口
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_CONTR=0xE8;    //1110,1000 (清0flag,置位start)
     }
    if(ADC_Chanul_Turn%2==1)
    {
        ADC_CONTR=0xF1; // 1111,0001  P11口
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        ADC_CONTR=0xE9;    //1110,1001
    }
    delay_1ms(20);                     //ADC power-on delay and Start A/D conversion
}

over(有15分钟定时关机).zip

99.28 KB, 下载次数: 10, 下载积分: 黑币 -5

anjianliliaoyi.pdf

355.66 KB, 下载次数: 6, 下载积分: 黑币 -5

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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