📄 firmware.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 + -