标题: 给看看 这个是通过max7219控制的数码管显示温湿度的! [打印本页]

作者: syc    时间: 2015-6-7 00:47
标题: 给看看 这个是通过max7219控制的数码管显示温湿度的!
   #include<reg52.h>
#include <intrins.h>
#include <stdio.h>  
#define uchar unsigned char      
#define uint unsigned int
uchar dis1[];
typedef unsigned char  U8;//全局变量uchar类型意思是可接收8位二进制
typedef unsigned int   U16;//全局变量uint类型意思是可接受16位二进制
U8 U8FLAG;
U8 U8temp;
U8 U8T_data_H,U8T_data_L,U8RH_data_H,U8RH_data_L,U8checkdata;//分别代表高8位温度,低八位温度,高八位湿度,低八位湿度,校验和U8  
U8 U8T_data_H_temp,U8T_data_L_temp,U8RH_data_H_temp,U8RH_data_L_temp,U8checkdata_temp;//同上
U8 U8comdata;
U16  DHTData1,DHTData2;
U8 count; //数据接收变量
sbit DIN=P3^4;
sbit LOAD=P3^3;
sbit CLK=P3^2;
sbit p33= P2^7;/
//uchar table[]={0, 1, 2, 3, 4, 5, 6, 7, 8,9,15};
uchar code table1[8][8]={       //{1,15,15,15,15,15,15,15},
                //{2,1,15,15,15,15,15,15},
                //{3,2,1,15,15,15,15,15},
                //{4,3,2,1,15,15,15,15},
                //{5,4,3,2,1,15,15,15},
                //{6,5,4,3,2,1,15,15},
                //{7,6,5,4,3,2,1,15},
                //{8,7,6,5,4,3,2,1}
                                {15,15,15,15,15,15,15,1},
                                {15,15,15,15,15,15,2,1},
                                {15,15,15,15,15,3,2,1},
                                {15,15,15,15,4,3,2,1},
                                {15,15,15,5,4,3,2,1},
                                {15,15,6,5,4,3,2,1},
                                {15,7,6,5,4,3,2,1},
                                {8,7,6,5,4,3,2,1}
   };
void delay1(uchar t)
{
        uchar x, y;
        for(x=t; x>0; x--)
                for(y=250; y>0; y--);
}
void write(uchar add1, uchar dat1)
{
        uchar i;
        LOAD=0;
        for(i=0; i<8; i++)
        {
                CLK=0; add1<<=1; DIN=CY;
                CLK=1; _nop_(); _nop_(); CLK=0;
        }
        for(i=0; i<8; i++)
        {
                CLK=0; dat1<<=1; DIN=CY;
                CLK=1; _nop_(); _nop_(); CLK=0;
        }
        LOAD=1;
}
void init()
{
        int i;
        write(0x09, 0xff);//编码模式地址0x09 0x00~0xff,为一的则位选通
        write(0x0a, 0x07);//亮度地址0x0A 0x00~0x0F 0x0F最亮
        write(0x0b, 0x03);//扫描数码管个数地址 0BH,最多扫描8只数码管
        write(0x0c, 0x01);//工作模式地址0x0C 0X00:关闭 0x01 正常
        for(i=8; i>0; i--)
        {
                write(i+1, 15);
        } }
//uchar busy;                             //12864判忙标志
//={"以下是当前温湿度"};


/dht11数据输入口
//sbit p34= P1^1;///////////////////////////////////////
//延时程序部分      
//dht11数据口
void delayms(uint xms)
{
    uint i,j;
        for(i=xms;i>0;i--)
        for(j=114;j>0;j--);
}  

//dht11程序部分

/***********************/


/***********************/

void Delay(U16 j) //100us延时
{  

          U8 i;         
          for(;j>0;j--)         
          {                  
           for(i=0;i<27;i++);         
           }
}
void Delay_10us(void)        //进入函数3us
{          U8 i;               
           i--;                  
                   i--;        
                   i--;        
                   i--;        
                   i--;        
                   i--;
}  
void COM(void)
{ U8 i;         
   for(i=0;i<8;i++)            
   {  U8FLAG=2;//将其赋值为2所以下段程序中其变量只能执行253此每次约1us做延时用的   
    while((!p33)&&U8FLAG++);//由于初始时主机将数据线拉低大约时间记不清了自己看时序图吧其中U8FLAG最多可加到255
        Delay_10us();
        Delay_10us();
        Delay_10us();
        U8temp=0;
        if(p33)U8temp=1;//此处代表dht11与单片机连接上了选择接收到的数据是一还是零
       
        U8FLAG=2;
        while((p33)&&U8FLAG++); //超时则跳出for循环
        if(U8FLAG==1)break;
        U8comdata<<=1;
        U8comdata|=U8temp;
   }
}//按照说明上接到的顺序是温度高八位温度低八位湿度高八位湿度低八位
void RH(void)
{
//主机拉低18ms
p33=0;
Delay(5); /************************/
p33=1; //总线由上拉电阻拉高主机延时20us
Delay_10us();
Delay_10us();
Delay_10us();
Delay_10us(); //主机设为输入判断从机响应信号
p33=1; //判断从机是否有低电平响应信号如不响应则不读数据,响应则向下运行
if(!p33)//p20==0往下执行
{U8FLAG=2;//判断从机发出80us的低电平响应信号是否结束
while((!p33)&&U8FLAG++);//强制低电平信号最长为254us
U8FLAG=2;//判断从机发出80us的高电平,如发出则进入数据接收状态
while((p33)&&U8FLAG++);//数据接收状态
COM();
U8RH_data_H_temp=U8comdata;//将得到的数据传送给变量
COM();
U8RH_data_L_temp=U8comdata;
COM();
U8T_data_H_temp=U8comdata;
COM();
U8T_data_L_temp=U8comdata;
COM();
U8checkdata_temp=U8comdata;
p33=1;
//数据校验
U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
       if(U8temp==U8checkdata_temp)//如果校验成功则重新赋值
           {
                           U8RH_data_H=U8RH_data_H_temp;//将的到的数据在赋给变量
                           U8RH_data_L=U8RH_data_L_temp;//低八位为0
                      DHTData1  = U8RH_data_H;
                    DHTData1<<= 8;
                        DHTData1        |= U8RH_data_L;
                       
                         
                         U8T_data_H=U8T_data_H_temp;
                           U8T_data_L=U8T_data_L_temp;//低八位为0
                             DHTData2  = U8T_data_H;
                          DHTData2        <<=8;
                          DHTData2|= U8T_data_L;

                         U8checkdata=U8checkdata_temp;//湿度值
             }
        }
}
void display()
    {
        dis1[0]=DHTData1/100+0x30;
        dis1[1]=DHTData1%100/10+0x30;
        dis1[2]= DHTData2/100+0x30;
    dis1[3]= DHTData2%100/10+0x30;
        dis1[4]= DHTData2%10+0x30;
         U8checkdata=U8checkdata_temp;
        }
void main()
{
        uchar i, j;
        while(1)
        {        RH(void) ;
display();
                init();
                for(i=0; i<8; i++)
                {
                        for(j=0; j<3; j++)
                        {       
                                write(j+1,table1[i][j]);
                                delay1(1000);       
                        }
                delay1(100);
                }

        }       
}


作者: syc    时间: 2015-6-7 00:48
不管怎么样   数码管都不出字了   是不是哪里冲突了
作者: admin    时间: 2015-6-7 01:13
电路图呢?是不是电路接法有误?数码管有短暂的闪烁吗?
作者: syc    时间: 2015-6-7 01:15
admin 发表于 2015-6-7 01:13
电路图呢?是不是电路接法有误?数码管有短暂的闪烁吗?

不是的   单独的测试程序都是可以的
作者: LLLW    时间: 2015-6-9 14:53
不管怎么样   数码管都不出字了   是不是哪里冲突了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1