在线时间1537 小时
UID258281
注册时间2014-12-6
NXP金币0
TA的每日心情 | 开心 2020-1-12 00:23 |
---|
签到天数: 745 天 连续签到: 1 天 [LV.9]以坛为家II
金牌会员
 
- 积分
- 6868
- 最后登录
- 2020-7-15
|
本次实验测试是在上次LCD基础上增加AM2302温、湿度而成,经处理的温、湿度数据通过LCD分时显示,AM2302故障时显示“Error”。
一、实验资源
1、LPC11U68(OM13058)开发板;
2、KEIL V5.25.2.0;
3、lpcopen_3_03_keil_iar_lpcxpresso_11u68;
4、6位段码LCD(HT1621)模块;
5、AM2302模块;
二、实验过程
1、硬件连接。LCD模块PCB上已引出VDD、GND、CS、WR、DATA,采用杜邦线与开发板相连接与LCD实验接法相同;AM2302的数据端口接在了PIO1_9;
2、实验程序。在AM2302数据采集过程中,数据端口要根据情况适时改变方向:
- static void AM2302_IPU_MODE(void)
- {
- Chip_GPIO_SetPinDIRInput(LPC_GPIO, 1, 9);//设置PIO0_12端口为输入
- }
复制代码- static void AM2302_OUT_MODE(void)
- {
- Chip_GPIO_SetPinDIROutput(LPC_GPIO, 1, 9);//设置PIO1_9端口为输出
- }
复制代码- void AM2302_Init(void)
- {
- Chip_Clock_EnablePeriphClock(SYSCTL_CLOCK_GPIO);//GPIO时钟使能
- Chip_IOCON_PinMuxSet(LPC_IOCON, 1, 9, (IOCON_FUNC0 | IOCON_MODE_INACT | IOCON_DIGMODE_EN));
- AM2302_OUT_MODE();
- AM2302_Port_HIGH(); //拉高AM2302端口
- }
复制代码
为方便操作,程序中定义了结构体并对AM2302端口进行了宏定义:
- /************************ AM2302 数据类型定义******************************/
- typedef struct
- {
- uint8_t humH8bit; //湿度高8位
- uint8_t humL8bit; //湿度低8位
- uint8_t temH8bit; //温度高8位
- uint8_t temL8bit; //温度高8位
- uint8_t check; //校验和
- float hum; //实际湿度
- float tem; //实际温度
- } AM2302_TypeDef;
- #define AM2302_Port_LOW() Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 0)//PIO1_9端口置低
- #define AM2302_Port_HIGH() Chip_GPIO_WritePortBit(LPC_GPIO, 1, 9, 1)//PIO1_9端口置高
- #define AM2302_Port_READ() Chip_GPIO_GetPinState(LPC_GPIO, 1, 9)//读PIO1_9端口
复制代码
显示程序写了三个,分别用于温、湿度和"-Error":
- /********************************************************
- 函数名称:void DispError(void)
- 功能描述: AM2302故障后显示“-Error”
- 参数说明:
- 说 明:
- ********************************************************/
- void DispError(void)
- {
- Ht1621WrOneData(0x0A,0x00);//-
- Ht1621WrOneData(0x0B,0x02);
- Ht1621WrOneData(0x08,0x01);//E
- Ht1621WrOneData(0x09,0x0f);
- Ht1621WrOneData(0x06,0x00);//r
- Ht1621WrOneData(0x07,0x06);
- Ht1621WrOneData(0x04,0x00);//r
- Ht1621WrOneData(0x05,0x06);
- Ht1621WrOneData(0x02,0x04);//o
- Ht1621WrOneData(0x03,0x0e);
- Ht1621WrOneData(0x00,0x00);//r
- Ht1621WrOneData(0x01,0x06);
- }
复制代码
在主程序中分时显示:
- /**
- * @brief main routine for blinky example
- * @return Function should not exit.
- */
- AM2302_TypeDef AM2302;
- int main(void)
- {
- // uint8_t i,j,t;//用于LCD测试
-
- SystemCoreClockUpdate();
- delay_init();
- AM2302_Init();
- Ht1621_Init();
- Ht1621WrAllData(0,Ht1621Tab,16);//清屏
-
- while(1)
- {
- if(ReadAM2302(&AM2302) == 1)
- {
- DispHum(AM2302.hum);//显示湿度
- delay_ms(500);
- delay_ms(500);
- delay_ms(500);
-
- DispTem(AM2302.tem);//显示温度
- delay_ms(500);
- delay_ms(500);
- delay_ms(500);
- }
- else
- {
- DispError();//error
- }
-
- /*LCD刷屏测试,显示所有笔段*/
- // Ht1621WrAllData(0,Ht1621Tab,16);//清屏
- // for(i=0; i<54; i++)
- // {
- // t = 0x01;
- // for(j=0; j<4; j++)
- // {
- // Ht1621WrOneData(i,t);
- // t <<= 1;
- // t++;
- // delay_ms(200);
- // }
- // }
- }
- }
复制代码
三、实验结果
1、温度
2、湿度
3、错误
四、实验总结
在实验中发现前期利用SysTick测试好的延时程序不好用了,表现为实际延时时间差距很大,delay_ms(time)引入的实参大于699就会出问题,下来还要对LPC11U68的时钟深入学习理解;显示函数写了三个,看看能不能优化为一个通用显示函数。
|
|