查看: 1299|回复: 0
打印 上一主题 下一主题

STM8+DHT11+DS1302接合代码

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-28 18:15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近玩了个低成本的东西用stm8做了个好玩的东西,其中用到了DHT11和DS1302分享给大家
下面是DHT11的
  • #include "stm8s.h"
  • #include "stm8s_it.h"
  • typedef unsigned char  U8;       /* defined for unsigned 8-bits integer variable           无符号8位整型变量  */
  • U8    U8FLAG,U8temp,U8comdata,U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp,U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
  • unsigned char date[5] = {0};
  • //寄存器宏定义
  • #define COM_CLR  GPIO_WriteLow(GPIOC,GPIO_PIN_7);//DHT11_DATA LOW
  • #define COM_SET  GPIO_WriteHigh(GPIOC,GPIO_PIN_7);//DHT11_DATA HIGH
  • #define COM_IN   GPIO_Init(GPIOC,GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);        //DHT11_DATA
  • #define COM_OUT  GPIO_Init(GPIOC,GPIO_PIN_7, GPIO_MODE_OUT_PP_HIGH_FAST);//DHT11_DATA
  • /*
  • GPIO_WriteHigh(GPIOC,GPIO_PIN_3);//DHT11_DATA HIGH
  • GPIO_WriteLow(GPIOC,GPIO_PIN_3);//DHT11_DATA LOW
  • */
  • extern void Delay_10us(unsigned int xx);
  • extern void delay_ms(unsigned int xx);
  • void Read_DATE_DH11(void)
  • {
  •                 U8 i,j;
  •           //主机拉低18ms
  •                  COM_OUT;
  •                  COM_CLR;
  •            delay_ms(18);
  •            COM_SET;
  •          //总线由上拉电阻拉高 主机延时20us
  •            Delay_10us(1);
  •            Delay_10us(1);
  •            Delay_10us(1);
  •            COM_SET;
  •          //主机设为输入 判断从机响应信号
  •          //P2_0=1;
  •          //判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
  •           // if(!P2_0)                 //T !
  •            COM_IN;
  •            if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7))U8FLAG=1;
  •            while(!(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)))
  •            {
  •            U8FLAG=2;
  •          //判断从机是否发出 80us 的低电平响应信号是否结束
  •            //while((!P2_0)&&U8FLAG++);
  •            while((!(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)))&&U8FLAG++);
  •            if(U8FLAG==1)break;
  •            U8FLAG=2;
  •          //判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
  •          //while((P2_0)&&U8FLAG++);
  •            while((GPIO_ReadInputPin(GPIOC,GPIO_PIN_7))&&U8FLAG++);
  •            if(U8FLAG==1)break;
  •                  for(j = 0;j<5;j++)
  •        for(i=0;i<8;i++)
  •             {
  •                        U8FLAG=2;
  •                    while((!(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7)))&&U8FLAG++);
  •                  if(U8FLAG==1)break;
  •                         Delay_10us(1);
  •                         Delay_10us(1);
  •                         Delay_10us(1);
  •                         Delay_10us(1);
  •                           U8temp=0;
  •              if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_7))U8temp=1;
  •                     U8FLAG=2;
  •                    while((GPIO_ReadInputPin(GPIOC,GPIO_PIN_7))&&U8FLAG++);
  •                    //超时则跳出for循环
  •                     if(U8FLAG==1)break;
  •                    //判断数据位是0还是1
  •                 // 如果高电平高过预定0高电平值则数据位为 1
  •                    date[j]<<=1;
  •                       date[j]|=U8temp;        //0
  •              }//rof
  •                 }
  •                 if((date[0]+date[2]) != date[4])
  •                 {
  •                         date[0] = date[2] = date[4] = 0;
  •                 }
  •            COM_OUT;
  •            COM_SET;
  • }

[color=rgb(51, 102, 153) !important]复制代码

下面是DS1302的
  • #include "stm8s.h"
  • #include "stm8s_it.h"
  • //寄存器宏定义
  • /*
  • GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//CLK HIGH
  • GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  • GPIO_WriteHigh(GPIOD,GPIO_PIN_4);//CE HIGH
  • GPIO_WriteLow(GPIOD,GPIO_PIN_4);//CE LOW
  • GPIO_WriteHigh(GPIOC,GPIO_PIN_4);//DATA HIGH
  • GPIO_WriteLow(GPIOC,GPIO_PIN_4);//DATA LOW
  • */
  • /*
  •         初始化DS1302_GPIO
  • */
  • void init_DS1302_GPIO(void){
  •         GPIO_Init(GPIOC,GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST);//RTC_CLK
  •         GPIO_Init(GPIOD,GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);//RTC_CE
  •         GPIO_Init(GPIOC,GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);                        //RTC_DATA
  • }
  • /*
  • */
  • void read_IO(void){
  •         GPIO_Init(GPIOC,GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT);                        //RTC_DATA
  • }
  • void write_IO(void){
  •         GPIO_Init(GPIOC,GPIO_PIN_4, GPIO_MODE_OUT_PP_HIGH_FAST);//RTC_DATA
  • }
  • void write_data(unsigned char cmd,unsigned char data){
  •         unsigned char num;
  •         GPIO_WriteLow(GPIOD,GPIO_PIN_4);//CE LOW
  •         GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         GPIO_WriteHigh(GPIOD,GPIO_PIN_4);//CE HIGH
  •         write_IO();
  •         //发地址
  •         for(num = 0;num <8;num++){
  •                 GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         if(cmd&0x1){
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_4);//DATA HIGH
  •                 }else if((cmd&0x1) == 0){
  •                         GPIO_WriteLow(GPIOC,GPIO_PIN_4);//DATA LOW
  •                 }
  •                 cmd>>=1;
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//CLK HIGH
  •         }
  •         //发数据
  •                 for(num = 0;num <8;num++){
  •                 GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         if(data&0x1){
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_4);//DATA HIGH
  •                 }else if((data&0x1) == 0){
  •                         GPIO_WriteLow(GPIOC,GPIO_PIN_4);//DATA LOW
  •                 }
  •                 data>>=1;
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//CLK HIGH
  •         }
  •         GPIO_WriteLow(GPIOD,GPIO_PIN_4);//CE LOW
  • }
  • unsigned char read_data(unsigned char cmd){
  •         unsigned char num,data1,data2,data3;
  •         GPIO_WriteLow(GPIOD,GPIO_PIN_4);//CE LOW
  •         GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         GPIO_WriteHigh(GPIOD,GPIO_PIN_4);//CE HIGH
  •         write_IO();
  •         //发地址
  •         for(num = 0;num <8;num++){
  •                 GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         if(cmd&0x1){
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_4);//DATA HIGH
  •                 }else if((cmd&0x1) == 0){
  •                         GPIO_WriteLow(GPIOC,GPIO_PIN_4);//DATA LOW
  •                 }
  •                 cmd>>=1;
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//CLK HIGH
  •         }
  •                 //读数据
  •                 read_IO();
  •                 data1 = 0;
  •                 for(num = 0;num <8;num++){
  •                 GPIO_WriteHigh(GPIOC,GPIO_PIN_5);//CLK HIGH
  •                 if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_4)){
  •                                 data1 |= 0x80;
  •         }
  •                 data1>>=1;
  •                 GPIO_WriteLow(GPIOC,GPIO_PIN_5);//CLK LOW
  •         }
  •         GPIO_WriteLow(GPIOD,GPIO_PIN_4);//CE LOW
  •                 return (data1);
  • }
  • void initDS1302(void){
  •         init_DS1302_GPIO();
  •         write_data(WRITE_PROTECT,0x00);//写保护关
  • //                if(GPIO_ReadInputPin(GPIOC,GPIO_PIN_3) == 0)
  • //{
  •         write_data(WRITE_SECOND,0x00); //初始秒值为0
  •         write_data(WRITE_MINUTE,0x51);//初始分钟值为0
  •         write_data(WRITE_HOUR,0x10);//2012年12月14日22点11分
  •         write_data(WRITE_DAY,0x15); //
  •         write_data(WRITE_MONTH,0x12);
  •         write_data(WRITE_YEAR,0x12);
  •         write_data(WRITE_WEEK,0x06);
  • //}
  •         write_data(0xc0,0xf0); //初始化一次标示
  •         write_data(0x8e,0x80);
  • }


[color=rgb(51, 102, 153) !important]复制代码



x







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表