全新论坛MCU智学网上线,欢迎访问新论坛!稀缺资源、技术干货、参考设计、原厂资料尽在MCU智学网
更新自动建库工具PCB Footprint Expert 2023.13 Pro / Library Expert 破解版

关于STC12C5A60S2的使用

[复制链接]
1594 0

本文包含原理图、PCB、源代码、封装库、中英文PDF等资源

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
P1.2口接采样电压进行AD转换,根据所采样的电压控制P1.3口输出PWM!!!但是我的烧程序进去后没有PWM输出啊!!!看了N遍程序又和类似的程序比较都发现不出问题!!大侠帮忙啊!!简单的事情~~~
#include "STC12C5A60S2.h"
#include "intrins.h"
#include<stdio.h>
float sun=0.5; //光敏下限,打开路灯
float ad_result;//AD存放结果,最终采样电压的结果

/**********************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; //AD结果高8位放进ADC_RES,低2位放进ADC_RES
//CHS=0x00; //选择P1.0 作为A/D输入来用
}
/*-------------------------------------------
取STC12C5A60S2 AD结果函数
(采用查询方式)ADRJ=0
---------------------------------------------*/
void stc12c_ad_result( )//取AD结果函数,它是十位AD转换
{

ADC_CONTR =0x82;//模拟输入通道选择和AD转换速度
_nop_();
_nop_();
_nop_();
_nop_(); //要用4个空操作延时才可以正确读到ADC_CONTR寄存器的
ADC_RES=0; //高八位数据清零,STC12C5A60S2 AD数据寄存名与STC12C54××系列不同
ADC_RESL=0; //低两位清零
ADC_CONTR = 0xca; //启动AD转换
//模拟转换控制位启动:ADC_START=1,即ADC_CONTR=0x08;启动电源:ADC_POWER=1,即ADC_CONTR =0x80;
while((ADC_CONTR&0x10)!=0x10);//等待AD转换完成

ADC_CONTR=0xc2; //关闭AD转换
//ADC_CONTR &= 0xe7;1111,0111 清 ADC_FLAG 位, 关闭A/D转换
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=0Xf9;
CCAP0L=0Xf9;//0x80为pwm占空比为50%
CCAPM0=0X42; //置允许上升沿捕捉,将CEXn 设为 PWM 输出。

// 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)
{
stc12c_ad_result();

if(ad_result<sun) //光线很暗时开灯
{
sun=1.2; //开灯后提升上限,从而具有一定的缓冲
CCAP0H=0xd0;
CCAP0L=0xd0;//0x80为pwm占空比为50%
CR=1;//允许计数;
}
else
{
sun=0.5; //白天关灯
CCAP0H=255;
CCAP0L=255;//0x80为pwm占空比为50%
CR=1;//允许计数;
}
}
}

举报

回复
*滑块验证:
您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

打开支付宝扫一扫,最高立得1212元红包
搜索

图文热点

更多

社区学堂

更多

客服中心

QQ:187196467 服务时间:周一至周日 8:30-20:30

关注我们

关于我们
关于我们
友情链接
联系我们
帮助中心
网友中心
购买须知
支付方式
服务支持
资源下载
售后服务
定制流程
关注我们
官方微博
官方空间
官方微信
快速回复 返回顶部 返回列表