关于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系列单片机
看看哈 !
谢谢。。
