|
发表于 2011-10-6 11:47:45
|
显示全部楼层
给楼主添个砖,这时就体会到32位的好处了。不是全部程序,需要的自己捡有用的吧。
#include "stm32f10x.h"
#include "STM32_Init.h"
#include "key.h"
#define SCK_0 GPIOB->BRR = SCK;delay();
#define SCK_1 GPIOB->BSRR = SCK;delay();
#define DATA_0 GPIOB->BRR = DATA;delay();
#define DATA_1 GPIOB->BSRR = DATA;delay();
u32 sys_time_10ms=0;
u32 sys_time_1s=0;
u32 sys_time_1min=0;
u32 sys_time_1hour=0;
u32 sys_time_1day=0;
u8 USART1_TX_Buf[20];
u8 USART1_RX_Buf[20];
u32 USART1_RX_index=0;
u32 USART1_RX_count=0;
u32 USART1_TX_index=0;
u32 USART1_TX_count=0;
u32 nokey_time=0;
u32 TM;//温度
u32 RH;//湿度
u8 number_g=0;
u8 number_s=0;
u8 number_b=0;
typedef union
{
unsigned int Bdata;
struct
{
unsigned char TBIT0 :1;
unsigned char TBIT1 :1;
unsigned char TBIT2 :1;
unsigned char TBIT3 :1;
unsigned char TBIT4 :1;
unsigned char TBIT5 :1;
unsigned char TBIT6 :1;
unsigned char TBIT7 :1;
unsigned char TBIT8 :1;
unsigned char TBIT9 :1;
unsigned char TBIT10 :1;
unsigned char TBIT11 :1;
unsigned char TBIT12 :1;
unsigned char TBIT13 :1;
unsigned char TBIT14 :1;
unsigned char TBIT15 :1;
} Bits;
} TEMP_BIT;
volatile TEMP_BIT _TEMP_FLAG;
#define TEMP_flag _TEMP_FLAG.Bdata
#define USART1_RXS_FLAG _TEMP_FLAG.Bits.TBIT0 // 用于串口接收到头标志
#define USART1_RXE_FLAG _TEMP_FLAG.Bits.TBIT1 // 接受完毕
#define USART1_TXS_FLAG _TEMP_FLAG.Bits.TBIT2 // 开始dma发送
#define USART1_TXE_FLAG _TEMP_FLAG.Bits.TBIT3 // 发送完毕
#define key_flag _TEMP_FLAG.Bits.TBIT4 //
#define SHT_read_flag _TEMP_FLAG.Bits.TBIT5 //
#define auto_send_flag _TEMP_FLAG.Bits.TBIT6 //
//------------------------------------------------------------------------------------
//函数名: void delay(void)
//功能描述:延时函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:固定延时几个周期
//------------------------------------------------------------------------------------
__asm void delay(void)
{
nop
nop
nop
nop
nop
nop
nop
nop
BX LR
}
//------------------------------------------------------------------------------------
//函数名: void KeyDo (void)
//功能描述:按键键值的处理函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明: 每10ms执行一次,根据按键程序输出的有效键值进行对应的处理
// 有按键处理,无按键够10秒灭背光
//------------------------------------------------------------------------------------
void KeyDo (void)
{
u32 key_vale;
if(key_flag==1)
{
key_flag=0;
GetKey(&key_vale);
if(key_vale==0)
{
nokey_time++;
LED1_0; //背光灭
if(nokey_time>1000) //10秒无操作
{
nokey_time=500;
LED1_0; //背光灭
}
}
else
{
nokey_time=0;
LED1_1; //背光亮
switch(key_vale)
{
case KEY_VALUE_1|KEY_UP: //按下抬起后才有效
SHT_read_flag=1; // 手动测量
LED2_1;
break;
case KEY_VALUE_2|KEY_UP:
auto_send_flag=1; // 自动测量发送
break;
default :
break ;
}
}
}
}
//------------------------------------------------------------------------------------
//函数名: u32 SHT_read (void)
//功能描述:传感器读取函数
//输入参数:u32 cmd 要读取的数据,3-温度 5-湿度
//输出参数:u32 *pr 返回读到的数据
//返回参数: u32 err 错误类型
//函数说明:按照标准顺序读取传感器的值,不做CRC
//------------------------------------------------------------------------------------
u32 SHT_read (u32 cmd,u32 *pr)
{
u32 i,err,TR;
GPIOB->CRL=0x51444444; //开漏输出
//启动传输
SCK_1;
DATA_0;
SCK_0;
SCK_1;
DATA_1;
SCK_0;
for(i=0;i<8;i++)
{
SCK_0;
if(cmd&0x80)
{ DATA_1;} //宏定义是2句,所以大括号要加
else
{ DATA_0;}
SCK_1;
cmd<<=1;
}
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==0) //传感器ACK
err=0;
else
{
SCK_0;
return 0x01;
}
SCK_0; //SCK下降沿,从机DATA释放
while(GPIO_ReadInputDataBit(GPIOB , DATA)==1) //等待完成测量
delay();
TR=0;
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
SCK_0;
GPIOB->CRL=0x51444444; //开漏输出
DATA_0; //主机ACK
SCK_1;
SCK_0;
DATA_1;
GPIOB->CRL=0x41444444; //浮空输入
for(i=0;i<8;i++)
{
SCK_1;
if(GPIO_ReadInputDataBit(GPIOB , DATA)==1)
TR|=1;
else
TR|=0;
TR<<=1;
SCK_0;
}
TR>>=1; //最后一次不用左移
GPIOB->CRL=0x51444444; //开漏输出
DATA_1; //主机ACK
SCK_1;
SCK_0;
GPIOB->CRL=0x41444444; //浮空输入
*pr=TR;
return err;
}
//------------------------------------------------------------------------------------
//函数名: void hextobcd(u32 temp)
//功能描述:hex转bcd
//输入参数:u32 temp 要转换的数,小于99
//输出参数:无
//返回参数: 无
//函数说明:将普通的HEX值转为4个BCD值
//------------------------------------------------------------------------------------
void hextobcd(u32 temp)
{
u32 i=0;
if (temp>=800) {i=8; temp-=800;}
if (temp>=400) {i+=4;temp-=400;}
if (temp>=200) {i+=2;temp-=200;}
if (temp>=100) {i++; temp-=100;}
number_b=i;
i=0;
if (temp>=80) {i=8; temp-=80;}
if (temp>=40) {i+=4;temp-=40;}
if (temp>=20) {i+=2;temp-=20;}
if (temp>=10) {i++; temp-=10;}
number_s=i;
number_g=temp;
}
//------------------------------------------------------------------------------------
//函数名: int main (void)
//功能描述:主函数
//输入参数:无
//输出参数:无
//返回参数: 无
//函数说明:程序的主函数。 11010010101000
//------------------------------------------------------------------------------------
int main(void)
{
u32 temp;
STM32_Init();
while (1)
{
KeyDo();
if(SHT_read_flag) //测量温湿度
{
SHT_read_flag=0;
SHT_read(3,&TM); //3-温度 5-湿度
TM-=3964;
TM/=10; //小数点以后只留1位
SHT_read(5,&RH); //3-温度 5-湿度
temp=RH;
RH=(405-temp*28/1000)*temp-40000;
RH/=1000; //小数点以后只留1位
USART1_TXS_FLAG=1;
}
if(USART1_TXS_FLAG)
{
USART1_TXS_FLAG=0;
hextobcd(TM);
USART1_TX_Buf[0]='T';
USART1_TX_Buf[1]='=';
USART1_TX_Buf[2]=number_b+'0';
USART1_TX_Buf[3]=number_s+'0';
USART1_TX_Buf[4]='.';
USART1_TX_Buf[5]=number_g+'0';
USART1_TX_Buf[6]=' ';
hextobcd(RH);
USART1_TX_Buf[7]='R';
USART1_TX_Buf[8]='=';
USART1_TX_Buf[9]=number_b+'0';
USART1_TX_Buf[10]=number_s+'0';
USART1_TX_Buf[11]='.';
USART1_TX_Buf[12]=number_g+'0';
USART1_TX_Buf[13]='%';
USART1_TX_Buf[14]='\n';
USART1_TX_index=14;
USART1_TX_count=0;
USART_ITConfig(USART1,USART_IT_TC,ENABLE); //启动
}
if(USART1_RXE_FLAG) //如果接收结束
{
USART1_RXE_FLAG=0;
}
}
} |
|