⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zhts.c

📁 开发板测试程序 本程序为实验板的总体测试程序
💻 C
字号:
//flow light and beep 
#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit adrd=P3^7;                          //IO口定义
sbit adwr=P3^6;
sbit diola=P2^5;
sbit dula=P2^6;
sbit wela=P2^7;
sbit csda=P3^2;


sbit dawr=P3^6;

unsigned char j,k;
unsigned char a,b;
sbit DS=P2^2;           //define interface
uint temp;             // variable of temperature
uchar flag1;            // sign of the result positive or negative
sbit beep=P2^3;
void dazhuanhuan();
void adzhuanhuan();
void jianpan();
void display1(unsigned char);
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,				//数码管编码
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
                        0x87,0xff,0xef};


void delay1(uint count)      //delay
{
  uint i;
  while(count)
  {
    i=200;
    while(i>0)
    i--;
    count--;
  }
}
///////功能:串口初始化,波特率9600,方式1///////
void Init_Com(void)
{
     TMOD = 0x20;
     PCON = 0x00;
     SCON = 0x50;
     TH1 = 0xFd;
     TL1 = 0xFd;
     TR1 = 1;
}

void dsreset(void)       //send reset and initialization command
{
  uint i;
  DS=0;
  i=103;
  while(i>0)i--;
  DS=1;
  i=4;
  while(i>0)i--;
}

bit tmpreadbit(void)       //read a bit
{
   uint i;
   bit dat;
   DS=0;i++;          //i++ for delay
   DS=1;i++;i++;
   dat=DS;
   i=8;while(i>0)i--;
   return (dat);
}

uchar tmpread(void)   //read a byte date
{
  uchar i,j,dat;
  dat=0;
  for(i=1;i<=8;i++)
  {
    j=tmpreadbit();
    dat=(j<<7)|(dat>>1);   //读出的数据最低位在最前面,这样刚好一个字节在DAT里
  }
  return(dat);
}

void tmpwritebyte(uchar dat)   //write a byte to ds18b20
{
  uint i;
  uchar j;
  bit testb;
  for(j=1;j<=8;j++)
  {
    testb=dat&0x01;
    dat=dat>>1;
    if(testb)     //write 1
    {
      DS=0;
      i++;i++;
      DS=1;
      i=8;while(i>0)i--;
    }
    else
    {
      DS=0;       //write 0
      i=8;while(i>0)i--;
      DS=1;
      i++;i++;
    }

  }
}

void tmpchange(void)  //DS18B20 begin change
{
  dsreset();
  delay1(1);
  tmpwritebyte(0xcc);  // address all drivers on bus
  tmpwritebyte(0x44);  //  initiates a single temperature conversion
}

uint tmp()               //get the temperature
{
  float tt;
  uchar a,b;
  dsreset();
  delay1(1);
  tmpwritebyte(0xcc);
  tmpwritebyte(0xbe);
  a=tmpread();
  b=tmpread();
  temp=b;
  temp<<=8;             //two byte  compose a int variable
  temp=temp|a;
  tt=temp*0.0625;
  temp=tt*10+0.5;
  return temp;
}

void readrom()          //read the serial
{
  uchar sn1,sn2;
  dsreset();
  delay1(1);
  tmpwritebyte(0x33);
  sn1=tmpread();
  sn2=tmpread();
}


void delay10ms1()            //delay
  {
    uchar a,b;
    for(a=10;a>0;a--)
      for(b=60;b>0;b--);
   }

void display2(uint temp)			//显示程序
{
   uchar A1,A2,A2t,A3,ser;
   ser=temp/10;
   SBUF=ser;
   A1=temp/100;
   A2t=temp%100;
   A2=A2t/10;
   A3=A2t%10;
   dula=0;
   P0=table[A1];		//显示百位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay1(1);

   dula=0;
   P0=table1[A2];		//显示十位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay1(1);

   P0=table[A3];		//显示个位
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay1(1);
}


void wendu()
{
 uchar a,c;
 Init_Com();
  for(c=0;c<20;c++)
  {
    tmpchange();
   // delay(200);
   for(a=10;a>0;a--)
     {   display2(tmp());
     }
  }                
}


void delay10ms()
  {
    for(a=100;a>0;a--)
      for(b=225;b>0;b--);
   }

   //拧动AD旁边的电位器,会在数码管的前三位显示0-255之间的数值。这就是把模拟电压转换成数字信号。

void delay(unsigned char i)		//延时程序
{
  for(j=i;j>0;j--)
    for(k=125;k>0;k--);
}


void display(uchar bai_c,uchar sh_c,uchar g_c)			//显示程序
{
   dula=0;
   P0=table[bai_c];		//显示百位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7e;
   wela=1;
   wela=0;
   delay(5);

   dula=0;
   P0=table[sh_c];		//显示十位
   dula=1;
   dula=0;

   wela=0;
   P0=0x7d;
   wela=1;
   wela=0;
   delay(5);

   P0=table[g_c];		//显示个位
   dula=1;
   dula=0;

   P0=0x7b;
   wela=1;
   wela=0;
   delay(5);
}

     da();//DA
void main()
{ uchar liushui;
  k=0xfe;
  for(liushui=0;liushui<8;liushui++)
  {
      delay10ms();
      beep=0;
      delay10ms();
      beep=1;
      j=_crol_(k,1);
      k=j;
      P1=j;
   }
dazhuanhuan();
wendu();
adzhuanhuan();
jianpan();



}


void dazhuanhuan()
{unsigned char a,k;
  wela=0;
  dula=0;
  csda=0;
  a=0;
  dawr=0;
  for(k=0;k<255;k++)
  {
  P0=a;
  delay(50);
  a++;
  }
}


void adzhuanhuan()
{uchar a,b,A1,A2,A2t,A3,adval;
    b=0xf0;
    while(b==0xf0)
  {
    wela=1;
    P0=0;                       //选通ADCS
    adwr=0;			//AD写入(随便写个什么都行,主要是为了启动AD转换)
    _nop_();
    adwr=1;
    P0=0xff;                    //关闭ADCS
    delay(10);
    wela=0;                     //关闭有AD片选信号锁存器的锁存端以防止在操作数码管时使AD的片选发生变化
       for(a=20;a>0;a--)        //需要注意的是ADC0804在写和读之间的时间间隔要足够长否则无法读出数据
    {                           //这里把显示部分放这里的原因也是为了增加写读之间的时间间隔                                                                                                                                                                                                                           
        display(A1,A2,A3);
     }	//送去显示各位。
     wela=1;                   //重新打开有AD片选信号锁存器的锁存端
     P1=0xff;                    //读取P1口之前先给其写全1
     P0=0;                       //选通ADCS
     adrd=0;                     //AD读使能
     adval=P1;			//AD数据读取赋给P1口
     adrd=1;
     P0=0xff;                     //关闭ADCS
     adwr=0;
     P1=adval;                    //同时把AD的值送八个发光二极显示
     A1=adval/100;		//分出百,十,和个位
     A2t=adval%100;
     A2=A2t/10;
     A3=A2t%10;

	 P3=0xf0;//扫描键盘  看是否有见键按下
	 b=P3&0xf0;
   }
}




//4*4键盘检测程序,按下键后相应的代码显示在数码管上
void display1(unsigned char num)
{
         P0=table[num];
   //    P0=0xff;
         dula=1;
         dula=0;
         P0=0xc7;
         wela=1;
         wela=0;


		
}
void jianpan()
{unsigned char temp,key;
  dula=0;
  wela=0;
  while(1)
  {
    P3=0xfe;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xee:
               key=0;
               break;

          case 0xde:
               key=1;
               break;

          case 0xbe:
               key=2;
               break;

          case 0x7e:
               key=3;
               break;
         }
         while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
        display1(key);
        // P0=table[key];
 /*        P0=0xff;
         dula=1;

         while(i--);
         dula=0;
         P0=0xc0;
         wela=1;
         wela=0;
  dula=0;
  wela=0;
  P0=0xff;
  dula=1;
  dula=0;
  P0=0xc5;
  wela=1;
  wela=0; */
         P1=0xfe;
      }
    }
    P3=0xfd;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xed:
               key=4;
               break;

          case 0xdd:
               key=5;
               break;

          case 0xbd:
               key=6;
               break;

          case 0x7d:
               key=7;
               break;
         }
         while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
         display1(key);
/*         P0=table[key];
         dula=1;
      //   while(100--);
         dula=0;
         P0=0xc0;
         wela=1;
         wela=0;
  */       P1=0xfc;
      }
      }
    P3=0xfb;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xeb:
               key=8;
               break;

          case 0xdb:
               key=9;
               break;

          case 0xbb:
               key=10;
               break;

          case 0x7b:
               key=11;
               break;
         }
         while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
        display1(key);
     /*    P0=table[key];
         dula=1;
      //   while(100--);
         dula=0;
         P0=0xc0;
         wela=1;
         wela=0;
    */     P1=0xf8;
      }
      }
    P3=0xf7;
    temp=P3;
    temp=temp&0xf0;
    if(temp!=0xf0)
    {
      delay(10);
      if(temp!=0xf0)
      {
        temp=P3;
        switch(temp)
        {
          case 0xe7:
               key=12;
               break;

          case 0xd7:
               key=13;
               break;

          case 0xb7:
               key=14;
               break;

          case 0x77:
               key=15;
               break;
         }
         while(temp!=0xf0)
         {
           temp=P3;
           temp=temp&0xf0;
           beep=0;
         }
         beep=1;
        display1(key);
  /*       P0=table[key];
         dula=1;
   //      while(100--);
         dula=0;
         P0=0xc0;
         wela=1;
         wela=0;
    */     P1=0xf0;
      }
    }
  }
}


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -