最近玩了个低成本的东西用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
|
|
|