注册 登录
电子工程世界-论坛 返回首页 EEWORLD首页 频道 EE大学堂 下载中心 Datasheet 专题
xyufeng2008的个人空间 https://home.eeworld.com.cn/space-uid-62491.html [收藏] [复制] [分享] [RSS]
日志

max7219\18b20\串口通信c51程序

已有 1026 次阅读2009-2-5 22:10 |个人分类:源码

#include <STC89C51.H>
#include <INTRINS.H>
#include "absacc.h"
#include "max7219.h"
#define uint unsigned int
#define uchar unsigned char
/*定义7219口*/
sbit load=P1^0;
sbit din= P1^2;
sbit clk= P1^1;

/*串口接收定义*/
   uchar j=0;
// uchar b;
char jie[4];
 //char code str[] = "Welcome! \n\r";

/*有关ds18b20的定义*/
sbit DQ=P1^3; //c51与DS18B20通信口
unsigned char tempL=0; //温度低八位
unsigned char tempH=0;  //温度高八位
float temperature;  //显示温度值
/*有关显示的定义*/
uchar display[4];//键盘输入显示
uchar tm[4];//要显示的温度
uchar key;//键盘返回值
/*定义函数*/
void write7219 (uchar address,uchar dat);//向max7219写8位数据
void initia7219(void);//初始化max7219
uchar kbscan(void); //键盘扫描函数
void delay (uchar m);//去抖延时子程序
void sent(void); //串口发送子程序

void tempDisplay();//显示温度子程序
void ds18b20_delay(unsigned int time);
Init_DS18B20(void); //初始化ds18b20
ReadOneChar(void); // 从ds18b20读取一个字节
WriteOneChar(unsigned char dat);  //向ds18b20写一个字节
ReadTemperature(void);  //从ds18b20读取温度


/*****************************************
写数据到max7219并显示
*****************************************/
void write7219  (uchar address,uchar dat)
{
 uchar i;
 load=0;
 for(i=0;i<8;i++)
    {
     clk=0;
     din=(bit)(address&0x80);
     address<<=1;
     clk=1;
    }
 for(i=0;i<8;i++)
    {
     clk=0;
     din=(bit)(dat&0x80);
     dat<<=1;
     clk=1;
    }
    load=1;
}
/*****************************************
初始化max7219
*****************************************/
void initia7219(void)
{
 write7219(shut_down,0x01);
 write7219(display_test,0x00);
 write7219(decode_mode,0xff);
 write7219(scan_limit,0x03);
 write7219(intensity,0x04);
}
/**************************************
显示键盘输入到显存的内容
**************************************/
void disp(uchar dd)
{
 display[3]=display[2];
 display[2]=display[1];
 display[1]=display[0];
 display[0]=dd;
 write7219(4,display[0]);
 write7219(3,display[1]);
 write7219(2,display[2]);
 write7219(1,display[3]);
}
/************************************
清除显存及led屏
*************************************/
void clr(void) 
{
 display[3]=0;
 display[2]=0;
 display[1]=0;
 display[0]=0;

 write7219(1,0);
 write7219(2,0);
 write7219(3,0);
 write7219(4,0);
}
/****************************************
          串口初始化 
*****************************************/
serial_init ()
{
 TMOD=0x20;//在12M下,设置串口2400波特率,方式3 00100000B使用定时器0,M1M0=10,常数自动装入的8位定时器,
 TL1=0xf3;//常数为0xf3,波特率为2400
 TH1=0xf3;
 SCON=0xd8; //  串行口控制寄存器11011000B,方式3
 PCON=0x00;// 电源控制寄存器0000 0000B,
 TR1=1;
 ES=1;
 EA=1;
}
/*****************************************
        串口中断服务程序
******************************************/
com_ino() interrupt 4 using 1
{
 if(RI)
    {
     jie[j]=SBUF;
      RI=0;
   j++;
   if(j>3)
  {
   j=0;
  }
   write7219(1,jie[0]);
   write7219(2,jie[1]);
   write7219(3,jie[2]);
   write7219(4,jie[3]);

    }
 else if(TI)
    {
  uchar mm=4;
  TI=0;
  while(mm!=0)
  {
   --mm;
   SBUF=display[mm];
   while(!TI);
   TI=0;
        }
/*uchar i=0;
   TI=0;
while(str[i]!='\0')
{
SBUF=str[i];
while(!TI);
TI=0;
i++; }
 /*TI=0;
 SBUF=b;
 while(!TI);
 TI=0;*/
  }
}

/************************************
主程序
************************************/
void main(void)
{
 initia7219();//初始化7219
 clr();
 serial_init();//初始化串口
 while(1)
 { 
  P0=0xf0;
  if(P0!=0xf0)
  {
   delay(20);
   if(P0!=0xf0)
   {
    key=kbscan();
       if(key>=0&key<10)
       {
        disp(key);
       }
          switch (key)
       {
        case 10:
      {
       for(j=0;j<=3;j++)
       {
       jie[j]=0;

       }
       write7219(1,0);
       write7219(2,0);
       write7219(3,0);
       write7219(4,0);
       break;
      }
     case 11:
      break;
     case 12:
         break;
     case 13:
      clr();
         break;
     case 14:
       tempDisplay();
         break;
     case 15:
      sent();
         break;            
     default:
      break;
    }  
      while(P0!=0xf0)
       {;}
    delay(10);
   }
  }
 }
}
/*******************************************************
显示温度子程序
*******************************************************/
void tempDisplay(void)
{
uchar k;

 while(P0!=0xf0)
 {
  P0=0xf0;
 }
 while(P0==0xf0)
 {
  ReadTemperature();
    if(temperature>=0)
       {
        
   tm[0]=(int)(temperature/100);
     tm[1]=((int)(temperature)%100)/10;
     tm[2]=(((int)temperature)%10)|0x80;
     tm[3]=((int)(temperature*10))%10;
        k=0;
       }
       else
       {
        tm[0]='-';
     tm[1]=((int)(temperature)%100)/10;
     tm[2]=(((int)temperature)%10)|0x80;
     tm[3]=((int)(temperature*10))%10;
        k=1;
        }
        write7219(1,tm[0]);
        write7219(2,tm[1]);
        write7219(3,tm[2]);
        write7219(4,tm[3]);
    }
}
/*******************************************************
                  去抖延时子程序
********************************************************/
void delay (uchar m)
{
 uchar n;
 for(;m>0;m--)
  {
   n=255;
   while (--n);
  }
}
/****************************************************
数据发送程序
****************************************************/
void sent(void)
{
 TI=1;
/*uchar mm=4;
   while(mm!=0)
   {
   SBUF=display[mm];
   while(!TI);
   TI=0;
   mm--;
   }*/

}

 


 void ds18b20_delay(unsigned int time) //延时
{
 unsigned int n;
 n=0;
 while(n<time) n++;
 return;
}

Init_DS18B20(void) //初始化
{
 unsigned char x=0;
   DQ=1;
   ds18b20_delay(8);
   DQ=0;
   ds18b20_delay(85);
   DQ=1;
   ds18b20_delay(14);
   x=DQ;
   ds18b20_delay(20);
}

ReadOneChar(void) //读一个字节
{
   unsigned char i=0;
   unsigned  char dat=0;
   for (i=8;i>0;i--)
   {
     DQ=1;
  ds18b20_delay(1);
  DQ=0;
  dat>>=1;
  DQ=1;
  if(DQ) dat|=0x80;
  ds18b20_delay(4);
   }
   return(dat);
}

WriteOneChar(unsigned char dat)  //写一个字节
{
 unsigned char i=0;
 for (i=8;i>0;i--)
   {                           
     DQ=0;
  DQ=dat&0x01;
  ds18b20_delay(5);
  DQ=1;
  dat>>=1;
   }
   ds18b20_delay(4);
}

ReadTemperature(void)  //读取温度
{
   char ctempL,ctempH;
   Init_DS18B20();
   WriteOneChar(0xcc);
   WriteOneChar(0x44);  //启动温度转换
   ds18b20_delay(125);
   Init_DS18B20();
   WriteOneChar(0xcc);
   WriteOneChar(0xbe);  //读取暂存器内容
   tempL=ReadOneChar();//读取温度低字节     
   tempH=ReadOneChar();
   if(tempH<0xf8) //温度是否小于零
     temperature=((tempH*256)+tempL)* 0.0625;//大于零
   else   
    {
    ctempL=tempL;
       ctempH=tempH;  
    temperature=(((~ctempH)*256)+(~ctempL)+1)* 0.0625;
    temperature=-temperature;
 }
   ds18b20_delay(200);
   return(temperature);
}

#include <STC89C51.H>
#include <INTRINS.H>
#define uint unsigned int
#define uchar unsigned char
uchar keyb; 
uchar temp,num;

/*******************************************************
                  去抖延时子程序
********************************************************/
void m_delay (uchar m)
{
uchar n;
for(;m>0;m--)
 {
 n=255;
 while (--n);
 }
}
   /*******************************************************
                  键盘扫描子程序
********************************************************/

uchar kbscan(void)   //键盘扫描子程序
 {
  if(P0!=0xf0)
  //while (P0!=0xf0)
   {
  P0=0xfe;
  temp=P0;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
   m_delay(20);
   if(temp!=0xf0)
    {
    switch(temp)
    {
     case 0xe0: num=7;keyb=1;
      break;
     case 0xd0: num=8;keyb=1;
      break;
     case 0xb0: num=9;keyb=1;
      break;
     case 0x70: num=10;keyb=0;
      break;
        default: num=17;
              break;
    }
    }
   }

  P0=0xfd;
  temp=P0;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
   m_delay(20);
   if(temp!=0xf0)
    {
    switch(temp)
    {
     case 0xe0: num=4;keyb=1;
      break;
     case 0xd0: num=5;keyb=1;
      break;
     case 0xb0: num=6;keyb=1;
      break;
     case 0x70: num=11;keyb=0;
      break;
        default: num=17;
              break;
    }
    }
   }

  P0=0xfb;
  temp=P0;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
   m_delay(20);
   if(temp!=0xf0)
    {
    switch(temp)
    {
     case 0xe0: num=1;keyb=1;
      break;
     case 0xd0: num=2;keyb=1;
      break;
     case 0xb0: num=3;keyb=1;
      break;
     case 0x70: num=12;keyb=0;
      break;
        default: num=17;
              break;
    }
    }
   }

  P0=0xf7;
  temp=P0;
  temp=temp&0xf0;
  if(temp!=0xf0)
   {
   m_delay(20);
   if(temp!=0xf0)
    {
    switch(temp)
    {
     case 0xe0: num=13;keyb=2;
      break;
     case 0xd0: num=0;keyb=1;
      break;
     case 0xb0: num=14;keyb=3;
      break;
     case 0x70: num=15;keyb=4;
      break;
        default: num=17;
              break;
    
    }
    }
   }  
   }
   

  return num;
 } 

评论 (0 个评论)

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 注册

热门文章