回复 yoso 的帖子
程序比较粗糙简单,只是能运行而已,其中ADC部分的代码用的是芯片手册中的。由于图省事在电路和程序中都未考虑环境温度的影响,因此要根据环境温度调整设定的温度档次(好在用按纽调整非常方便)。
程序清单如下:
/* 白光烙铁控制程序 */
/* 3位共阴数码管,第一位显示温度;第二位暂不用;第三位在暂停时显示(与第一位显示的数字相同) */
/* 左侧升温键,右侧降温键,下方为暂停/开机键 */
#include "reg51.h"
#include "intrins.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC; // ADC 控制寄存器
sfr ADC_RES = 0xBD; // ADC 转换结果高8位寄存器
sfr ADC_RESL = 0xBE; // ADC 转换结果低2位寄存器
sfr P1ASF = 0x9D; // P1 各位第二功能控制寄存器
#define ADC_POWER 0x80 // ADC 开关
#define ADC_FLAG 0x10 // ADC 转换完成标志
#define ADC_START 0x08 // ADC 检测开始
#define ADC_SPEEDLL 0x00 // ADC 转换周期(420 clocks)
sbit Out1 = P3^6; // P3.6控制P-mos导通/截至
sbit LED = P1^0; // P1.0用作LED显示
void InitADC();
BYTE GetADCResult();
void delay(BYTE ms);
void ajjc(void);
void ajjp(void);
void ajjp2(void);
BYTE ch = 7; // 当前ADC输入口为P1.7
BYTE Vin; // 输入电压
BYTE smgc[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x58,0x5e,0x79,0x71,0x76};
sbit smg1 = P2^1; // P2.1用作第一位数码管阴极
sbit smg2 = P2^2; // P2.2用作第二位数码管阴极(未使用)
sbit smg3 = P2^3; // P2.3用作第三位数码管阴极
sbit ajz = P2^5; // P2.5用作升温键
sbit ajf = P2^6; // P2.6用作降温键
sbit ajp = P2^4; // P2.4用作暂停键
BYTE tmpv = 10; // 设定初始温度
BYTE i = 8; // 与初始温度对应的显示数值
BYTE ys = 25; // 按键消抖延时值
void main()
{
Out1 = 1; // P-mos管截止
smg1 = 0; // 第1位数码管显示初始温度
smg3 = 0; // 第3位数码管同时显示,说明程序为暂停状态
P0 = smgc; // 显示的数值
InitADC(); // 初始化ADC
ajjp2(); // 检测3个按键,开始工作或调温
while(1)
{
ajjp();
Vin = GetADCResult();
if(Vin <= tmpv)
{
LED = 0; // 显示正在加热
Out1 = 0; // 开始加热
delay(20);
Out1 = 1; // 停止加热
LED = 1;
delay(20);
}
}
}
/*------------ 初始化 ADC -----------------------*/
void InitADC()
{
P1ASF = 0x80; // 只将P1.7设置为ADC输入口
ADC_RES = 0; // 清空ADC转换结果寄存器
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
delay(20);
}
/*------------ ADC 转换 -------------------------*/
BYTE GetADCResult()
{
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG)); //等待转换完成
ADC_CONTR = 0;
return ADC_RES;
}
/*------------ 延时 -----------------------------*/
void delay(BYTE ms)
{
BYTE i, j;
while(ms--)
{
for(j=0; j<100; j++)
{
for(i = 0; i < 100; i++);
}
}
}
/*------- 检测暂停键进入暂停 --------------------*/
void ajjp(void)
{
ajp = 1;
_nop_();
_nop_();
_nop_();
if(ajp == 0)
{
delay(ys); // 按键消抖
if(ajp == 0) // 检测到按暂停键
{
smg3 = 0; // 第3位数码管亮,显示暂停
delay(100);
ajjp2();
}
}
ajjc();
}
/*------- 检测暂停键恢复正常工作状态 ------------*/
void ajjp2(void)
{
while(1) // 检测到再次按暂停键
{
ajp = 1;
_nop_();
_nop_();
_nop_();
if(ajp == 0)
{
delay(ys); // 按键消抖
if(ajp == 0) // 检测到再次按暂停键
{
smg3 = 1;
break; // 程序正常运行
}
}
ajjc();
}
}
/*------- 检测控温键,修改温度值--------------*/
void ajjc(void)
{
/* 检测升温键 */
ajz = 1;
_nop_();
_nop_();
_nop_();
if(ajz == 0)
{
delay(ys); // 按键消抖
if(ajz == 0)
{
if(tmpv < 16) // 预设最高温度对应值“F”
{
i++;
P0 = smgc;
tmpv = tmpv + 1;
}
}
}
/* 检测降温键 */
ajf = 1;
_nop_();
_nop_();
_nop_();
if(ajf == 0)
{
delay(ys); // 按键消抖
if(ajf == 0)
{
if(i > 0)
{
i--;
P0 = smgc;
tmpv = tmpv - 1;
}
}
}
}
|