⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 firmware.c

📁 SHT11温度湿度传感器的详细资料包获C代码和使用方法
💻 C
字号:
#include <avr/io.h>#define CLOCK 4000000#define BAUD 9600#define UBRRVAL CLOCK/(BAUD*16L)-1#define noACK 0#define ACK 1#define STATUS_REG_W  0x06#define STATUS_REG_R  0x07#define MEASURE_TEMP  0x03#define MEASURE_HUMI  0x05#define RESET         0x1e#define setREAD       outb(DDRB, 0x01); sbi(PORTB, 1)#define setWRITE      outb(DDRB, 0x03)#define SCK(i)        if (i) sbi(PORTB, 0); else cbi(PORTB, 0)#define DATA(i)       if (i) sbi(PORTB, 1); else cbi(PORTB, 1)enum {TEMP, HUMI};void UART_Init() {  outb(UBRR, UBRRVAL);  // Baudrate einstellen  sbi(UCR,TXEN);        // TX aktivieren}void UART_SendChar(char s) {  loop_until_bit_is_set(USR, UDRE);  outb (UDR, s);}void UART_SendStr(char *s) {  while (*s) {    loop_until_bit_is_set(USR, UDRE);    outb (UDR, *s++);  }}void delay_us(unsigned int us) {  while (us) us--;}void delay_ms(unsigned int ms) {  unsigned int outer1, outer2;  outer1 = 200;   while (outer1) {    outer2 = 1000;    while (outer2) {      while ( ms ) ms--;      outer2--;    }    outer1--;  }}void transStart() {  DATA(1);  SCK(0);  delay_us(1);  SCK(1);  delay_us(1);  DATA(0);  delay_us(1);  SCK(0);  delay_us(5);  SCK(1);  delay_us(1);  DATA(1);  delay_us(1);  SCK(0);}void connReset() {  unsigned int i;  setWRITE;  DATA(1); SCK(0);  for(i=0; i<9; i++) {    SCK(1);    SCK(0);  }  transStart();}unsigned int getDATA() {  return bit_is_set(PINB, 1);}unsigned char writeByte(unsigned char value) {  unsigned char i, error=0;  setWRITE;  for(i=0x80;i>0;i/=2) {    if (i & value) DATA(1);    else DATA(0);    SCK(1);    delay_us(5);    SCK(0);  }  setREAD;   SCK(1);  delay_us(1);  error=getDATA();  SCK(0);  return error;}unsigned char readByte(unsigned char ack) {  unsigned char i,val=0;  setREAD;  for(i=0x80;i>0;i/=2) {    SCK(1);    if (getDATA()) val=(val | i);    SCK(0);  }  setWRITE;  DATA(!ack);  SCK(1);  delay_us(5);  SCK(0);  return val;}void conv_byte(unsigned char in, unsigned char *out){  unsigned char a;  a=in&0xf0;  a=a>>4;  if(a>9) {    out[0]=a-10+0x41;  } else {    out[0]=a+0x30;  }  a=in&0x0f;  if(a>9) {    out[1]=a-10+0x41;  } else {    out[1]=a+0x30;  }}void conv_int(int in, unsigned char * out) {  unsigned int temp;  unsigned char a;  if(in>=0) {    temp=in&0xff00;    a=(unsigned char)(temp>>8);    conv_byte(a,out);    a=(in&0x00ff);    conv_byte(a,out+2);  } else {    *out='-';    out++;    in*=-1;    temp=in&0xff00;    a=(unsigned char)(temp>>8);    conv_byte(a,out);    a=(in&0x00ff);    conv_byte(a,out+2);  }}unsigned char measure(unsigned int *p_value, unsigned char *p_checksum, unsigned char mode) {  unsigned char lsb,msb,check;  unsigned char error=0;  unsigned int i;  transStart();  switch(mode) {    case TEMP : error+=writeByte(MEASURE_TEMP); break;    case HUMI : error+=writeByte(MEASURE_HUMI); break;    default   : break;  }  setREAD;  for(i=0;i<65535;i++) if (getDATA()==0) break;  if (getDATA()) error+=1;  *p_value = readByte(ACK);  *p_value<<=8;  *p_value+= readByte(ACK);  *p_checksum = readByte(noACK);  return error;}  int main() {  unsigned char check,error;  unsigned char c[5];  unsigned int i,temp,humi;    UART_Init();  connReset();    while(1) {    error=0;    error+=measure(&temp, &check, TEMP);    error+=measure(&humi, &check, HUMI);        if (error) connReset();    else {            for(i=0;i<5;i++) c[i]='\0';      conv_int(temp, c);      UART_SendStr(c);      UART_SendStr(" ");            for(i=0;i<5;i++) c[i]='\0';      conv_int(humi, c);      UART_SendStr(c);      UART_SendStr("\n");    }    delay_ms(10000);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -