📄 display_dhtxx.c
字号:
//ICC-AVR application builder : 2008-4-28 9:22:37
// Target : M8
// Crystal: 8.0000Mhz
/*************************************************************************
程序:6_LED
功能:湿度传感器显示板(六个数码管显示)
公司:奥松电子
芯片:M8
晶振:内部 2.0000Mhz
创建人:木工
创建时间:08.05.05
修改人:
修改时间:
修改原因:
**************************************************************************/
#include <iom8v.h>
#include <macros.h>
#include <eeprom.h>
#include "mu_io.h"
typedef unsigned char U8; /* defined for unsigned 8-bits integer variable 无符号8位整型变量 */
typedef signed char S8; /* defined for signed 8-bits integer variable 有符号8位整型变量 */
typedef unsigned int U16; /* defined for unsigned 16-bits integer variable 无符号16位整型变量 */
typedef signed int S16; /* defined for signed 16-bits integer variable 有符号16位整型变量 */
typedef unsigned long U32; /* defined for unsigned 32-bits integer variable 无符号32位整型变量 */
typedef signed long S32; /* defined for signed 32-bits integer variable 有符号32位整型变量 */
typedef float F32; /* single precision floating point variable (32bits) 单精度浮点数(32位长度) */
typedef double F64; /* double precision floating point variable (64bits) 双精度浮点数(64位长度) */
/**************************************************************************
数码管显示赋值区
***************************************************************************/
#define _a 0x01
#define _b 0x02
#define _c 0x04
#define _d 0x08
#define _e 0x10
#define _f 0x20
#define _g 0x40
#define _dp 0x80
#define num0 _g //灭的数码管
#define num1 _a|_d|_e|_f|_g
#define num2 _c|_f
#define num3 _e|_f
#define num4 _a|_d|_e
#define num5 _b|_e
#define num6 _b
#define num7 _d|_e|_f|_g
#define num8 0x00
#define num9 _e
#define num_ _a|_b|_c|_d|_e|_f|_dp
#define num_11 _a|_d|_e|_f
#define num_E _b|_c|_dp //13
#define num_r _a|_b|_c|_d|_f|_dp //14
#define num_N _a|_b|_c|_d|_e|_f|_g|_dp //15
#define dc2 0x04
#define dc3 0x08
#define dd 0x03 //数码管控制端口
#define dd4 0x10
#define dd5 0x20
#define dd6 0x40
#define dd7 0x80
#define dd2 0x04
#define dd3 0x08
#define led1 dc3 //使用时要先将数码管全熄灭掉
#define led2 dd5
#define led3 dd4
#define led4 dd7
#define led5 dd6
#define led6 dd2
/**************************************************************************
I/O空间定义
***************************************************************************/
// B0_IN DDRB &= ~(1 << PB0) /*设置输入*/
// B0_OUT DDRB |= (1 << PB0) /*设置输出*/
// B0_CLR PORTB &= ~(1 << PB0) /*置低电平*/
// B0_SET PORTB |= (1 << PB0) /*置高电平*/
// B0_R PINB & (1 <<PB0) /*读了电平*/
/**************************************************************************
通讯I/O空间定义
***************************************************************************/
#define COM_IN C5_IN
#define COM_OUT C5_OUT
#define COM_CLR C5_CLR
#define COM_SET C5_SET
#define COM_R C5_R
/**************************************************************************
全局变量定义区
***************************************************************************/
U8 i;
//U16
//RM 为临时变量 在RC测电阻中使用
const U8 LED[ ]={num0,num1,num2,num3,num4,num5,num6,num7,num8,num9,num_,num_11,num_E,num_r,num_N }; //数码管笔形码数组
U8 PLAY[6]={0,0,0,0,0,0}; //这个数组放在SARM里
U8 U8FLAG,k;
U8 U8count,U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;
U8 U8comdata;
U16 ReceiveHighByte;
U16 ReceiveLowByte;
/**************************************************************************
***************************************************************************/
void port_init(void)
{
PORTB = 0x00;
DDRB = 0xFF;
PORTC = 0x03; //m103 output only
DDRC = 0x0C;
PORTD = 0x00;
DDRD = 0xF0;
}
void watchdog_init(void)
{
//WDR(); //this prevents a timout on enabling
//WDTCR = 0x0F; //WATCHDOG ENABLED - dont forget to issue WDRs
}
void init_devices(void)
{
unsigned char i;
CLI(); //disable all interrupts
port_init();
watchdog_init();
MCUCR = 0x03;
GICR = 0x00; //关外部中断0
TIMSK = 0x00; //关定时器1中断
SEI(); //re-enable interrupts
}
void Delay(unsigned int i)
{
while(i--);
}
void DelayNS (U16 dly) //延时子程序 1.010ms
{
U16 i;
for ( ; dly>0; dly--)WDR();
for (i=0; i<1131; i++); //1131
}
void DelaymS (U16 dly) //延时子程序 1.010ms
{
U16 i;
for ( ; dly>0; dly--)
{
WDR();
for (i=0; i<280; i++); //1131
}
}
void Display (void)
{
for(i=0;i<=5;i++)
{
DDRD |= 0XFC;
PORTD&=0x03;
DDRC |= 0X0C;
PORTC&=0xF3;
Delay(1);
switch(i)
{
case 0: PORTC|=led1;break;
case 1: PORTD|=led2;break;
case 2: PORTD|=led3;break;
case 3: PORTD|=led4;break;
case 4: PORTD|=led5;break;
case 5: PORTD|=led6;break;
default :break;
}
PORTB=LED[PLAY[i]] ; //送数据
if((i==0)|(i==2)|(i==3)|(i==5))
{
PORTB|=0x80;
}
DelaymS(1);
}
PORTD&=0x03;
PORTC&=0xF3;
}
void delay1N(unsigned int Dcount) //(1u*Dcount)
{
while(Dcount--)
{
NOP();
NOP();
NOP();
}
}
void Delay_10us(void)
{
U8 i; //2M时延时为 10us
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
i--;
}
void COM(void)
{
U8 i;
for(i=0;i<8;i++)
{
U8FLAG=2;
//while((!P2_0)&&U8FLAG++);
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
Delay_10us();
Delay_10us();
Delay_10us();
U8temp=0;
//if(P2_0)U8temp=1;
if(COM_R)U8temp=1;
U8FLAG=2;
//while((P2_0)&&U8FLAG++);
while((COM_R)&&U8FLAG++);
//超时则跳出for循环
if(U8FLAG==1)break;
//判断数据位是0还是1
// 如果高电平高过预定0高电平值则数据位为 1
U8comdata<<=1;
U8comdata|=U8temp; //0
}//rof
}
//--------------------------------
//-----湿度读取子程序 ------------
//--------------------------------
//----以下变量均为全局变量--------
//----温度高8位== U8T_data_H------
//----温度低8位== U8T_data_L------
//----湿度高8位== U8RH_data_H-----
//----湿度低8位== U8RH_data_L-----
//----校验 8位 == U8checkdata-----
//----调用相关子程序如下----------
//---- Delay();, Delay_10us();,COM();
//--------------------------------
void RH(void)
{
//主机拉低18ms
//P2_0=0;
COM_OUT;
COM_CLR;
//DelaymS(18);
DelaymS(5);
Display(); //总延时22ms
DelaymS(5);
Display();
//P2_0=1;
COM_IN;
COM_SET;
//总线由上拉电阻拉高 主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us();
//主机设为输入 判断从机响应信号
//P2_0=1;
//判断从机是否有低电平响应信号 如不响应则跳出,响应则向下运行
// if(!P2_0) //T !
if(COM_R)U8FLAG=1;
while(!(COM_R))
{
U8FLAG=2;
//判断从机是否发出 80us 的低电平响应信号是否结束
//while((!P2_0)&&U8FLAG++);
while((!(COM_R))&&U8FLAG++);
if(U8FLAG==1)break;
U8FLAG=2;
//判断从机是否发出 80us 的高电平,如发出则进入数据接收状态
//while((P2_0)&&U8FLAG++);
while((COM_R)&&U8FLAG++);
if(U8FLAG==1)break;
//数据接收状态
COM();
if(U8FLAG==1)break;
U8T_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8T_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_H_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8RH_data_L_temp=U8comdata;
COM();
if(U8FLAG==1)break;
U8checkdata_temp=U8comdata;
break;
}//while
//P2_0=1;
COM_IN;
COM_SET;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
if(U8temp==U8checkdata_temp)
{
U8T_data_H=U8T_data_H_temp;
U8T_data_L=U8T_data_L_temp;
U8RH_data_H=U8RH_data_H_temp;
U8RH_data_L=U8RH_data_L_temp;
U8checkdata=U8checkdata_temp;
}//fi
COM_IN;
COM_SET;
}
void Display_data(void)
{
if(U8FLAG==1)
{
PLAY[0] = 12;
PLAY[1] = 13;
PLAY[2] = 13;
PLAY[3] = 12;
PLAY[4] = 13;
PLAY[5] = 13;
}//fi
else
{
ReceiveHighByte=U8T_data_H;
ReceiveHighByte<<=8;
ReceiveHighByte|=U8T_data_L;
ReceiveLowByte=U8RH_data_H;
ReceiveLowByte<<=8;
ReceiveLowByte|=U8RH_data_L;
if(ReceiveHighByte&0x8000)
{
ReceiveHighByte&=0x7fff; //清负数标志
if(ReceiveHighByte>=199)
{
PLAY[3] = 11;
PLAY[4] = 9;
PLAY[5] = 9;
}//fi
else if(ReceiveHighByte>=100)
{
PLAY[3] = 11;
PLAY[4] = ReceiveHighByte%100/10;
PLAY[5] = ReceiveHighByte%10;
} //esle if
else
{
PLAY[3] = 10;
PLAY[4] = ReceiveHighByte%100/10;
PLAY[5] = ReceiveHighByte%10;
} //esle
} //fi
else
{
PLAY[3] = ReceiveHighByte/100;
PLAY[4] = ReceiveHighByte%100/10;
PLAY[5] = ReceiveHighByte%10;
if(ReceiveHighByte<100)
{
PLAY[3]=14;
}
} //esle
PLAY[0] = ReceiveLowByte/100; //湿度
PLAY[1] = ReceiveLowByte%100/10;
PLAY[2] = ReceiveLowByte%10;
if(ReceiveLowByte<100)
{
PLAY[0]=14;
}
}//esle
}
/**************************************************************************
主函数
**************************************************************************/
void main(void)
{
init_devices() ;
COM_IN;
COM_SET;
while(1)
{
RH();
Display_data();
Display();
//延时2S
for(U8temp=0;U8temp<200;U8temp++)
{
DelaymS(5);
Display();
}//rof
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -