基于stm8的温湿度测量仪 - 图文(4)

2019-04-22 18:57

电 气 学 院 创 新 设 计 说 明 书

}

#pragma vector=15

__interrupt void TIM2_UPD_OVF_BRK_IRQHandler(void)//定时中断更新数据服务函数 {

TIM2_ClearITPendingBit(TIM2_IT_UPDATE); start_DHT11();

DHT11_Get_Data();//更新温湿度数据 }

(3)DHT11温湿度传感器模块代码: DHT11.c文件: #include\

#include\#include\#include\int count_1,count_2; unsigned char sbuf;

unsigned char Table_Data[4];

/**********************唤起DHT11**************************************/ int start_DHT11(void) {

GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteLow(GPIOE, GPIO_PIN_6);//拉低18ms以上 Delay_ms(10000);//Delay_ms(18); GPIO_WriteHigh(GPIOE, GPIO_PIN_6); Delay_us(30); //拉高20~40us

GPIO_Init(GPIOE, GPIO_PIN_6, GPIO_MODE_IN_PU_NO_IT); ceshi_on(); while(!DHT11_DQ_IN);//等待80us低电平结束

while(DHT11_DQ_IN); ceshi_off();//等待80us高电平结束 return(1); //应答成功返回1 }

/************************读取8位字节***********************************/ void com(void) {

u8 i;

sbuf=0;

for(i=8;i>0;i--) {

16 / 22

电 气 学 院 创 新 设 计 说 明 书

count_1=2;

while((!DHT11_DQ_IN)&&count_1++); //等待传送数据开始50us低电平结束并记录所用时间count_1 count_2=2;

while((DHT11_DQ_IN)&&count_2++) ;//等待\或\高电平结束并记录所用

时间count_2

if(count_2>(count_1)) //比较count_2与count_1来判断输入是\还是\ { sbuf<<=1; sbuf|=0x01; } else

{ sbuf<<=1; sbuf|=0x00; } } }

/**********************读取数据**************************************/ unsigned char DHT11_Get_Data() { u32 check,sum; com();

Table_Data[0]=sbuf;//湿度8位整数 com();

Table_Data[1]=sbuf;//湿度小数部分 com();

Table_Data[2]=sbuf;//温度整数部分 com();

Table_Data[3]=sbuf;//温度小数部分 com();

check = sbuf;//校验部分

sum =(Table_Data[0]+Table_Data[1]+Table_Data[2]+Table_Data[3]); if(check == sum)//校验正确则返回1 return(1);

else return (0); }

(4)MAX7219显示模块程序代码: 7219.c文件:

#include\

#include\#include\

17 / 22

电 气 学 院 创 新 设 计 说 明 书

#include\

/************************************************************/ unsigned int temp_1,temp_2,temp_4,temp_5; unsigned int humi_1, humi_2, humi_4, humi_5;

u8 LEDcode[10]={0x7e,0x30,0x6d,0x79,0x33,0x5b,0x5f,0x70,0x7f,0x7b}; /**********************IO口配置************************************/ void Dispaly_GPIO_LoadOn() {

GPIO_Init(GPIO_PORT, GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_1); }

void Dispaly_GPIO_LoadOff() {

GPIO_Init(GPIO_PORT,GPIO_PIN_1, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteLow(GPIO_PORT,GPIO_PIN_1); }

void Dispaly_GPIO_ClkOn() {

GPIO_Init(GPIO_PORT,GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_2); }

void Dispaly_GPIO_ClkOff() {

GPIO_Init(GPIO_PORT,GPIO_PIN_2, GPIO_MODE_OUT_PP_LOW_FAST); GPIO_WriteLow(GPIO_PORT,GPIO_PIN_2); }

void Dispaly_GPIO_INPUT()//载入数据 {

GPIO_Init(GPIO_PORT,GPIO_PIN_0,GPIO_MODE_OUT_PP_LOW_FAST); }

/*******************向Max7219写入8位数据************************/ void Write_Max7219_byte(unsigned char temp) {

unsigned char i,x; for (i=0;i<8;i++) {

Dispaly_GPIO_ClkOff();//GPIOD_PIN_2推挽输出,写低电平 x=temp&MSB; if(x==0)

18 / 22

电 气 学 院 创 新 设 计 说 明 书

{

Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出

GPIO_WriteLow(GPIO_PORT,GPIO_PIN_0);//输入数据为\ } else {

Dispaly_GPIO_INPUT();//GPIOD_PIN_0推挽输出

GPIO_WriteHigh(GPIO_PORT,GPIO_PIN_0);//输入数据为\ }

temp<<=1;

Dispaly_GPIO_ClkOn();//GPIOD_PIN_2推挽输出,写高电平,数据载入16位移

位寄存器 } }

/***********************向7219写入16位数据*************************/ void Write_Max7219(unsigned char address,unsigned char dat) {

Dispaly_GPIO_LoadOff();//GPIOD_PIN_1推挽输出,写低电平 Write_Max7219_byte(address); Write_Max7219_byte(dat);

Dispaly_GPIO_LoadOn(); //GPIOD_PIN_1推挽输出,写高电平,锁存16位数据 }

/***********************初始化Max7219***************************/ void Init_Max7219(void) {

Write_Max7219(SHUT_DOWN, 0x01); //正常操作模式 Write_Max7219(DISPLAY_TEST, 0x00); //正常显示

Write_Max7219(DECODE_MODE, 0x00); //不采用B译码模式 Write_Max7219(SCAN_LIMIT, 0x07); //设置显示的数据位数 Write_Max7219(INTENSITY, 0x0A); //设置显示的亮度 }

/**************************清除显示******************************/ void clear_7219(void) {

unsigned char i; //变量i,用来选择数码管位选 for(i=8;i>0;i--) //i自减,选择完所有的8位

{ Write_Max7219(i,0x00); //对应位选的段全部清除显示 } }

19 / 22

电 气 学 院 创 新 设 计 说 明 书

/*********************温度显示***************************************/ void Display_Temp(void) {

Init_Max7219();//MAX7219初始化

clear_7219(); //MAX7219清除显示,免去干扰

Write_Max7219(0x01,0x4e);//显示摄氏度符号℃ Write_Max7219(0x02,0x63);

Write_Max7219(0x03,LEDcode[temp_5]); Write_Max7219(0x04,LEDcode[temp_4]);

Write_Max7219(0x05,LEDcode[temp_2]|0x80); Write_Max7219(0x06,LEDcode[temp_1]); }

/************************湿度显示************************************/ void Display_Humi(void) {

Write_Max7219(0x01,0x37);//显示湿度符号RH Write_Max7219(0x02,0x77);

Write_Max7219(0x03,LEDcode[humi_5]); Write_Max7219(0x04,LEDcode[humi_4]);

Write_Max7219(0x05,LEDcode[humi_2]|0x80); Write_Max7219(0x06,LEDcode[humi_1]); }

(5)延时函数程序代码: #include\#include\

void Delay_ms(u32 nCount) {

for(char i=0;i<10;i++) { while (nCount != 0) { nCount--; } } }

/*微秒延时函数*/

void Delay_us(u32 nCount)

20 / 22


基于stm8的温湿度测量仪 - 图文(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:概率论与数理统计作业及解答

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: