📄 wk.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 + -