?? main.c
字號:
#include <iom128.h>
#include <macros.h>
#include "sensor.h"
#pragma interrupt_handler USART_RX_interrupt:19 //串口0接收中斷
unsigned char MCU_receive_byte(void);
void Sent_command(unsigned char command);
void MCU_receive_word(void);
void Port_ini(void);
void SHT_ACK();
void SHT_end(void);
void SHT_ini(void);
void SHT_reset(void);
void SHT_start();
void SHT_measurement(unsigned char measure);
void USART_RX_interrupt(void);
void USART_TX(unsigned char data);
void USART_ini(void);
void WDT_ini(void);
//
//------------------------------
//
// 主函數
//
//------------------------------
//
void main(void)
{
unsigned int i;
//WDT_ini();
CLI();
Port_ini();
SHT_ini();
USART_ini();
SEI();
//---for test----
USART_TX(0xaa);
//---------------
for(;;)
{
//WDR(); //看門狗清零
SHT_measurement(TEMPERATURE);
for(i=0;i<65535;i++)
{
}
}
}
//
//------------------------------
//
// 串口0單字節(jié)發(fā)送
//
//------------------------------
//
void USART_TX(unsigned char data)
{
while(!(UCSR0A&(1<<UDRE0)))
{
}
UDR0 = data;
}
//
//------------------------------
//
// 串口初始化
//
//------------------------------
//
void USART_ini(void)
{
UBRR0H = 0x00;
UBRR0L = 0xCF; //波特率2400
UCSR0C = 0x06; //異步模式,無奇偶校驗,一個停止位,8位數據
UCSR0B = 0x80|(1<<RXEN0)|(1<<TXEN0); //發(fā)送、接收使能
}
//
//------------------------------
//
// SHT71啟動信號
//
//------------------------------
//
void SHT_start()
{
DDRD = DDRD|0x03; //?????
PORTD = CLK_L ;
PORTD = DATA_H;
NOP();
NOP();
PORTD = CLK_H;
NOP();
NOP();
PORTD = DATA_L;
NOP();
NOP();
PORTD = CLK_L;
NOP();
NOP();
PORTD = CLK_H;
NOP();
NOP();
PORTD = DATA_H;
NOP();
NOP();
PORTD = CLK_L;
}
//
//------------------------------
//
// SHT71 控制命令發(fā)送
// command = 0x03---溫度
// 0x05---濕度
//
//------------------------------
//
void Sent_command(unsigned char command)
{
unsigned char model = 0x80;
unsigned char i;
DDRD = DDRD|0x03; //輸出
//PORTD = CLK_L;
for(i=0;i<7;i++)
{
PORTD = CLK_L;
if((command & model) == 0)
{
PORTD = DATA_L;
}
else
{
PORTD = DATA_H;
}
PORTD = CLK_H;
//NOP();
model = model>>1;
//PORTD = CLK_L;
}
PORTD = CLK_L;
if((command & model) == 0)
{
PORTD = DATA_L;
}
else
{
PORTD = DATA_H;
}
//PORTD = DATA_L;
// NOP();
PORTD = CLK_H;
DDRD = DDRD&0xFD;
NOP();
PORTD = CLK_L;
while((PIND&0x02)==0x02)
{
}
//PORTD = 0x55;
PORTD = CLK_H;
NOP();
PORTD = CLK_L;
NOP();
}
//
//------------------------------
//
// SHT71 等待應答信號
//
//------------------------------
//
void SHT_ACK()
{
//PORTA = ~(0xFF);
while((PIND&0x02)==0x02)
{
}
//PORTA = 0x55;
}
//
//------------------------------
//
// SHT71 接收一個字節(jié)
//
//------------------------------
//
unsigned char MCU_receive_byte(void)
{
unsigned char i;
unsigned char model = 0x00;
unsigned char temp;
PORTD = CLK_L;
NOP();
for(i=0;i<8;i++)
{
PORTD = CLK_H;
//PORTD = CLK_L;
if((PIND & 0x02)==0)
{
temp = 0;
}
else
{
temp = 1;
}
model = model|(temp<<(7-i));
PORTD = CLK_L;
}
DDRD = DDRD|0x02; //單片機輸出ACK
//PORTD = CLK_L;
PORTD = DATA_L; //
NOP();
PORTD = CLK_H;
DDRD = DDRD&0xFD; //單片機輸入
PORTD = CLK_L;
return model;
}
//
//------------------------------
//
// SHT71 接收結果
//
//------------------------------
//
void MCU_receive_word(void)
{
unsigned char temp;
temp = MCU_receive_byte();
//PORTA = ~temp;
temp = MCU_receive_byte();
//PORTC = ~temp;
}
//
//------------------------------
//
// SHT71 啟動一次測量
//
//------------------------------
//
void SHT_measurement(unsigned char measure)
{
//DDRD = DDRD|0x03; //?????
SHT_start();
Sent_command(measure);
SHT_ACK();
MCU_receive_word();
SHT_end();
}
//
//------------------------------
//
// SHT71 結束一次測量
//
//------------------------------
//
void SHT_end(void)
{
PORTD = CLK_L;
PORTD = DATA_H;
}
//
//------------------------------
//
// SHT71 復位
//
//------------------------------
//
void SHT_reset(void)
{
unsigned char i;
//DDRD = DDRD|0x03;
PORTD = DATA_H;
PORTD = CLK_L;
for (i=0;i<20 ;i++ )
{
PORTD = CLK_H;
NOP();
PORTD = CLK_L;
}
}
//
//------------------------------
//
// 看門狗初始化
//
//------------------------------
//
void WDT_ini(void)
{
WDTCR = 0x0f;
}
//
//------------------------------
//
// SHT71初始化
//
//------------------------------
//
void SHT_ini(void)
{
unsigned int i;
SHT_reset();
for(i=0;i<65535;i++)
{
}
}
//
//------------------------------
//
// 端口初始化
//
//------------------------------
//
void Port_ini(void)
{
DDRA = 0xFF;
DDRC = 0xFF;
DDRD = DDRD|0x03; //?????
}
//
//------------------------------
//
// 串口接收中斷初始化
//
//------------------------------
//
void USART_RX_interrupt(void)
{
unsigned char i;
i= UDR0;
//USART_TX(i);
//PORTA = i;
/*if (i==0x08)
{
USART_TX(0x99);
}
*/
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -