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

[复制链接]
2471|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. /******************************************************/
  2. //程序功能:通过测量热敏电阻温度计的值,来控制继电器是否吸合
  3. //详细说明:1.PD4接继电器的信号引脚来控制继电器
  4. //          2.PD5也即AIN5进行AD转换,接收电阻R1的电压,并转换为AD值
  5. //          3.MCU不停地进行AD转换,实现24小时检测当前温度
  6. /******************************************************/


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

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

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

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

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

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

  35. void CheckAdc(void)
  36. {
  37.   if(AD_Value > Fix_ADC_Value)  //比较测量值和设定值
  38.   {
  39.      S1_ON();                   //超过一定的温度了,开启继电器
  40.   }
  41.   else
  42.   {
  43.     S1_OFF();                   //温度还未超过设定值,关闭继电器
  44.   }
  45. }
  46. int main(void)
  47. {
  48.   int AD_Value=0;               //记录ADC的值,便于与设定的值进行比较
  49.    
  50.   GPIO_Init();                  //准备好继电器引脚
  51.   ADC_Init();                   //准备好ADC
  52.   while(1)
  53.   {
  54.     GetAdcValue();                //获得ADC的值
  55.     CheckAdc();        
  56.   }
  57.   return 0;
  58. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

15

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部