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

📄 wk.c

📁 51系列单片机的汇编程序包
💻 C
字号:
/*======================================
  程序名称:温度闭环控制程序
  源文件名:tempcl.c
  编程语言:KEIL/Franklin C51
  编译选项:BANK 0, OPTIMIZE(0), SMALL
======================================*/

#include <reg51.h>

#define uint  unsigned int
#define uchar unsigned char

/* 8255并行口 */
uchar xdata *CS8255 = 0x8063;  /*控制命令*/
uchar xdata *OUTSEG = 0x8060;  /*字形控制口*/
uchar xdata *OUTBIT = 0x8061;  /*字位/键扫控制口*/
uchar xdata *IN_KEY = 0x8062;  /*键盘读入口*/

uchar LedBuf[8];               /* 键盘扫描、LED八段数码管显示 */
uchar code LedMap[16] =        /*LED字形代码表*/
{
  0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8,
  0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e
};
uchar code KeyTab[32] =        /*键盘阵列表*/
{
  0x07, 0x01, 0x10, 0x18, 0x04, 0x00, 0x11, 0x19,/*A7,A1,B7,B1,A4,A0,B4,B0*/
  0x08, 0x02, 0x12, 0x1a, 0x05, 0x0f, 0x13, 0x1b,/*A8,A2,B8,B2,A5,AF,B5,BF*/
  0x09, 0x03, 0x14, 0x1c, 0x06, 0x0e, 0x15, 0x1d,/*A9,A3,B9,B3,A6,AE,B6,BE*/
  0x0a, 0x0c, 0x16, 0x1e, 0x0b, 0x0d, 0x17, 0x1f /*AA,AC,BA,BC,AB,AD,BB,BD*/
};

/* ADC0809模数转换 */
uchar xdata *CS0809 = 0x80c0;

/* 273锁存输出 */
uchar xdata *CS_IO  = 0x80e0;

/* 延时程序 */
void Delay(uint count)
{
  uchar i;
  while(count-- != 0) for(i=0;i<30;i++);
}

/* LED七段码显示函数 */
void DispLed()
{
  uchar i, pos=0x80;     /*pos为最高字位*/
  for(i=0; i<8; i++)     /*一次扫描8个LED*/
  {
    *OUTSEG = LedBuf[i]; /*写字形代码*/
    *OUTBIT = pos;       /*写字位控制*/
    Delay(2);            /*延时*/
    pos>>=1;             /*移位显示*/
  }
}

/* 读取键盘状态(高4位不用) */
uchar TestKey()
{
  *OUTBIT = 0;  /*置输出线为0*/
  return(~(*IN_KEY) & 0xf);
}

/* 得到键盘扫描码 */
uchar GetKey()
{
  uchar pos,i,k;
  i = 8;
  pos = 0x80;      /*扫描列*/
  do
  {
    *OUTBIT = ~pos;
    pos>>=1;
    k=~(*IN_KEY) & 0xf;
  } while ((--i!=0)&&(k==0));

  if(k!=0)  /* 键盘扫描码 = 列 * 4 + 行 */
  {
    i*=4;
    if(k&2) i+=1;
    else if(k&4) i+=2;
    else if(k&8) i+=3;
    *OUTBIT = 0;
    while(TestKey())   /*等键释放*/
      DispLed();       /*显示*/
    return(i);         /*返回扫描码*/
  }
  else return(0xff);   /*键值超出范围*/
}

/* 主函数 */
void main()
{
  uchar keyval,ad,a,b,uv,i;
  bit   fl;

  *CS8255 = 0x89;       /*PA,PB输出、PC输入*/

  LedBuf[0] = 0xbf;
  LedBuf[1] = 0xbf;
  for(i=2;i<8;i++) LedBuf[i] = 0xff;
  while(1)
  {
    if(TestKey())
    {
      keyval = GetKey();
      if(!fl)
      {
        a = KeyTab[keyval];
        if(a<0x10) LedBuf[0] = LedMap[a];
        fl = 1;
      }
      else
      {
        b = KeyTab[keyval];
        if(a<0x10) LedBuf[1] = LedMap[b];
        fl = 0;
      }
    }
    uv = (a<<4) + (b&0xf);
    *CS0809 = 0;  /*通道0采样*/
    ad = *CS0809;
    LedBuf[4] = LedMap[ad>>4];
    LedBuf[5] = LedMap[ad&0xf];
    DispLed();    /*LED显示*/
    if(ad>=uv) *CS_IO = 0; /*停止加温*/
    else *CS_IO = 0xff;    /*继续加温*/
  }
}

⌨️ 快捷键说明

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