求解答STC15 ADC不能用 小灯不能点亮 高分悬赏

baidu_39546344 2017-08-06 11:40:53
/*-------------------------------------------
基于STC15系列的单路8位ADC转换演示程序
(STC15W404AS有8路10位ADC转换)
--------------------------------------------*/
#include <STC15F2K60S2.H> //REG51中不包括相关特殊寄存器,需要另外声明
#include <intrins.H> //函数运算头文件
#define uint unsigned int //宏定义变量uint为无符号整型数据(0-65535)
#define uchar unsigned char //宏定义变量uchar为无符号字符型数据(0-255)
/*---------------------------------
Declare SFR associated with theADC
声明SFR与theADC相关特殊寄存器
(采用STC15系列头文件不需要此声明)
----------------------------------*/
//sfr P1M0 =0x92; //0000,0000 声明端口1模式寄存器0
//sfr P1M1 =0x91; //0000,0000 声明端口1模式寄存器1
//sfr ADC_CONTR =0xBC; //ADC control register (声明ADC控制寄存器)
//sfr ADC_RES =0xBD; //ADC 8-bit result register (声明8位ADC结果寄存器)
//sfr P1ASF =0x9D; //P1 secondary function control register (声明P1辅助功能控制寄存器)

/*--------------------------------------
Define ADC operation const for ADC_CONTR
(ADC操作常量定义ADC_CONTR)
---------------------------------------*/
#define ADC_POWER 0x80 //ADC power control dit (宏定义ADC电源控制位)1000 0000
#define ADC_FLAG 0x10 //ADC complete flag (宏定义ADC完成标志位) 0001 0000
#define ADC_START 0x08 //ADC start control dit (宏定义ADC启动控制位)0000 1000
#define ADC_SPEEDLL 0x00 //420 clocks (宏定义420时钟)速度控制 0000 0000
#define ADC_SPEEDL 0x20 //280 clocks (宏定义280时钟)速度控制 0001 0000
#define ADC_SPEEDH 0x40 //140 clocks (宏定义140时钟)速度控制 0010 0000
#define ADC_SPEEDHH 0x60 //070 clocks (宏定义70时钟)速度控制 0011 0000
sbit led=P2^5; //驱动继电器端口定义
void InitADC(); //初始化ADC子程序声明
uchar zhADC(); //ADC 转换子程序声明
void delayms(uint k); //1ms延时子程序声明
void SR();
uchar ch=0;
//执行AD转换结果子程序声明
/*--------------------------------------------------
主函数(无返回值,无参数)
---------------------------------------------------*/
void main()
{
P2M1 = 0x00; //P1.0高阻 P1.1强推挽:0000 0001 ADC输入高阻、继电器强上拉
P2M0 = 0x00; //P1.0高阻 P1.1强推挽:0000 0010 ADC输入高阻、继电器强上拉
led=0; //驱动继电器端口初始化0
InitADC(); //Init ADC sfr (初始化ADC SFR)

while(1)
{

SR(); //执行转换结果子程序

}
}
/*----------------------------
初始化ADC
-----------------------------*/
void InitADC()
{
P1ASF=0xff; //设置P1.0端口作为模拟输入

ADC_RES=0; //Clear previous result (清除以前的结果)
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch; //开启ACD电源、设置转换速度
delayms(1); //上电延时
}

/*----------------------------
Get ADC Result(获取ADC结果)
-----------------------------*/
uchar zhADC() //zhADC(获取ADC结果)
{
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START; //启动转换
_nop_(); //4个时钟延时
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //wait complete flag(等待完成标志)
ADC_CONTR &=~ADC_FLAG; //Close ADC(关闭ADC)
return ADC_RES; //Return ADC result(返回ADC结果)
}

/*----------------------------
1ms延时子程序(12M晶振)
-----------------------------*/
void delayms(uint k)

{
uint i,j;
for(i=k;i>0;i--)

for(j=747;j>0;j--);

}
/*----------------------------
执行ADC转换结果子程序
-----------------------------*/
void SR()
{
// uchar H,M,L;
uchar M; //温度 中温
// H=0x44; //0x44
M=100; //0x84
// L=0XB7; //0xB7

if (zhADC()==M) //如果ADC_1通道检测值大于等于M
led=1; //继电器1吸合加温
if (zhADC()>M)
led=0; //否则继电器1释放停止加温
}
...全文
385 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
大浪淘沙、 2017-09-09
  • 打赏
  • 举报
回复
换用模拟输入口呢,还有就是照写源码。
李伯特 2017-08-20
  • 打赏
  • 举报
回复
51的IO口的电流是不能直接驱动继电器的,要接三极管放大

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧