微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于STC12C5A60S2的使用

关于STC12C5A60S2的使用

时间:10-02 整理:3721RD 点击:

光敏电阻随着光强变换,通过AD采样输出PWM供驱动LED芯片!


//程序
#include "STC12C5A60S2.h"
#include "intrins.h"
#include<stdio.h>
float sun=0.5;  //光敏下限,打开路灯
float  ad_result;//AD存放结果,最终采样电压的结果
unsigned char ad_result2;
unsigned char pwm;
/**********************ad转换********************************************/
/*定义ADC控制寄存器ADC_CONTR内的相应位*/
/*#define  ADC_POWER          0x80  //ADC 电源控制位,1:打开A/D转换器电源
#define  ADC_FLAG           0x10 //模数转换器转换结束标志位,当A/D转换完成后,ADC_FLAG=1,要由软件清0
#define  ADC_START          0x08  //模数转换器(ADC)转换启动控制位,设置为“1”时,开始转换,转换结束后为0  
#define  ADC_SPEEDLL        0x00  //540个时钟周期转换一次
#define  ADC_SPEEDL         0x20  //360个时钟周期转换一次
#define  ADC_SPEEDH         0x40  //180个时钟周期转换一次
#define  ADC_SPEEDHH        0x60  //90个时钟周期转换一次
unsigned char  CHS;    //CHS2/CHS1/CHS0:模拟输入通道选择*/
       //如  0   0    0    选择P1.0 作为A/D输入来用  
/*------------------------------
     stc12c5a60s2_ad初始化
-------------------------------*/
void InitADC()
{
P1ASF = 0x04; //当P1口中的相应位作为A/D使用时,要将P1ASF中的相应位置1
ADC_RES = 0;  //清除之前的结果
    AUXR1|=0X00;
//CHS=0x00;   //选择P1.0 作为A/D输入来用
}
/*-------------------------------------------
  取STC12C5A60S2  AD结果函数
  (采用查询方式)ADRJ=0
---------------------------------------------*/
void stc12c_ad_result(unsigned char ch)//取AD结果函数,它是十位AD转换
{
  
         ADC_CONTR =0x88|ch;
        //ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | CHS;
        _nop_();
  _nop_();
  _nop_();
  _nop_(); //要用4个空操作延时才可以正确读到ADC_CONTR寄存器的
  ADC_RES=0;     //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
  ADC_RESL=0;    //低两位清零
  ADC_CONTR|=0x08; //启动AD转换
  while((ADC_CONTR&0x10)!=0x10);//等待AD转换完成
  ADC_CONTR&=0xef;//清除模数转换器转换结束标志位
   
  ADC_CONTR&=0xf7; //关闭AD转换
        ad_result=ADC_RES; //取AD转换高8位
}
/*-------------------PWm----------------------*/
/*---------------------------------------------*/
void pwm_init()
{
   CCON=0;  //PCA控制寄存器清零
    CL=0; //计数器低8位
    CH=0;  //计数器高8位
CMOD=0X02; //pwm频率为fosc/2

CCAP0H=CCAP0L=0Xf9;//0x80为pwm占空比为50%
CCAPM0=0X42; //允许上升沿捕捉,将CEXn 设置为 PWM 输出。
pwm=0xf9;        
// CCAP1H=CCAP1L=0X00;
// CCAPM1=0X42;
CR=1;//允许计数
EA=1;//开中断
}
void delay(unsigned int time)  //延时函数1ms
{
   unsigned int i,j;
    for(i=time;i>0;i--)
    for(j=125;j>0;j--);
}
//*********************主程序***********************//
void main()
{  
    pwm_init();   //PWM初始化
    delay(1000);
    InitADC();    //AD转换初始化
while(1)
   {   
  TR1=0;
  stc12c_ad_result(2);
              
      if(ad_result<sun) //光线很暗时开灯
         {
             sun=1.2;      //开灯后提升上限,从而具有一定的缓冲
             CCAP0H=CCAP0L=0xd0;//0x80为pwm占空比为50%
          CR=1;//允许计数;
          }
               else
                {
                  sun=0.5;     //白天关灯
                 CCAP0H=CCAP0L=255;//0x80为pwm占空比为50%
       CR=1;//允许计数;
                }
  }
   stc12c_ad_result(1);//采样可调电阻电压,电压从0-2.5V变化
      ad_result2=ad_result*2; //*2变成0-5V变化
      if(ad_result2>245)ad_result2=255; //大于某个值后关灯
   else  ad_result2&=0xfe; //去掉最后一位,柔和光线,防止振荡
              
      CCAP0H=CCAP0L=ad_result2;//0x80为pwm占空比为50%
   CR=1;//允许计数;
}
烧入程序后灯不亮!没反应!

你好!你怎么会在protues中找到STC12C5A单片机!我找不到  能不能帮帮我!不胜感激!QQ1003768663!我好想使用STC125A的单片机

你好!你怎么会在protues中找到STC12C5A单片机!我找不到  能不能帮帮我!不胜感激!QQ1003768663!我好想使用STC125A的单片机

在吗   你好!你怎么会在protues中找到STC12C5A单片机!我找不到  能不能帮帮我!不胜感激!QQ1003768663!我好想使用STC125A的单片机

楼上 可以用8051后自己修改编辑啊!

你好!你怎么会在protues中找到STC12C5A单片机!我找不到  能不能帮帮我!不胜感激!QQ1003768663!我好想使用STC125A的单片机

这个我怎么感觉遇到水军了!

开始学习单片机,不知学习C语言好还是汇编好?

刚学了51系列单片机,现在还不会用STC12C5A系列单片机

看看哈 !

谢谢。。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top