打印
[STM8]

STM8S003F3 为什么PD4不能输出高电平啊

[复制链接]
2129|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tobyran117|  楼主 | 2017-4-12 18:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

本帖最后由 tony001 于 2017-4-12 15:49 编辑


  

void main()
{
  PD_DDR=0x92;//D2,D3配置成模拟输出
  PD_CR1=0x92;//配置PDI0端口为推挽输出模式
  PD_CR2=0x92;//配置PDI0端口高斜率输出

  UART1_CR1=0x00;
  UART1_CR3=0x00;
  UART1_BRR2=0x03;
  UART1_BRR1=0x68;   //16000000/9600=0x683
  UART1_CR2=0x0C;
  UART1_CR2_RIEN=1;



while(1)PD_ODR_ODR4=1;
}
沙发
598330983| | 2017-4-13 08:59 | 只看该作者
小伙子,一会儿我给你找个例程,你一看就明白哪儿的问题。

使用特权

评论回复
板凳
598330983| | 2017-4-13 08:59 | 只看该作者
/******************************************************/
//程序功能:通过测量热敏电阻温度计的值,来控制继电器是否吸合
//详细说明:1.PD4接继电器的信号引脚来控制继电器
//          2.PD5也即AIN5进行AD转换,接收电阻R1的电压,并转换为AD值
//          3.MCU不停地进行AD转换,实现24小时检测当前温度
/******************************************************/


#include <iostm8s003f3.h>               //开发板MCU为STM8S003

#define Fix_ADC_Value 300               //假定这个值就是温度达到40度时ADC的值
#define S1 4

#define S1_ON() PD_ODR |= (1<<(S1))     //控制继电器开
#define S1_OFF() PD_ODR &= ~ (1<<(S1))  //控制继电器关,默认是关的

void GPIO_Init(void)
{
  PD_DDR = 0xFF;    //PD所有引脚为输出引脚
  PD_CR1 = 0xFF;    //PD所有引脚为推挽输出
  PD_CR2 = 0x0;     //PD所有引脚输出速度最大为2MHZ
}

void ADC_Init(void)
{
  ADC_CR1  = 0x00;//FADC=FMASTER/2、单次转换、ADC转换开关关
  ADC_CR2  = 0x00;//禁止外部触发转换(选择软件启动)、数据左对齐
  ADC_TDRL = 0x20;//关闭 (AIN5)施密特触发器
}

void GetAdcValue(void)
{
  ADC_CSR  = 0x05;              //选择通道AIN5
  ADC_CR1 |= 0x01;              //使能ADC   
  i = 12;                       //等待7us以上的时间确保ADC上电完成
  while(i--);
  ADC_CR1 |= 0x01;              //再次置位ADON来启动ADC转换
  while(!(ADC_CSR & 0x80));     //等待转换完成
  AD_Value=ADC_DRH;             //读取转换的高八位数据
  ADC_CSR  &= 0x7F;             //第8位EOC置0,本次转换结束
}

void CheckAdc(void)
{
  if(AD_Value > Fix_ADC_Value)  //比较测量值和设定值
  {
     S1_ON();                   //超过一定的温度了,开启继电器
  }
  else
  {
    S1_OFF();                   //温度还未超过设定值,关闭继电器
  }
}
int main(void)
{
  int AD_Value=0;               //记录ADC的值,便于与设定的值进行比较
   
  GPIO_Init();                  //准备好继电器引脚
  ADC_Init();                   //准备好ADC
  while(1)
  {
    GetAdcValue();                //获得ADC的值
    CheckAdc();        
  }
  return 0;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

25

帖子

1

粉丝