/***********************************************
***********************************************/
#include "reg52.h"
#include "intrins.h"
#include "seg.h"
bit flag_timer ;
sbit Door=P1^0; //门限位开关
sbit Led=P1^1; //照明灯
sbit Beep=P2^4; //扬声器
sbit JD=P2^5; //继电器 加热装置控制接口
sbit key_open=P1^4; //开启按钮
sbit key_set=P1^5; //设置按钮
sbit key_add=P1^6; //时间加按钮
sbit key_dec=P1^7; //时间减按钮
void delay_10us(unsigned int nus)
{
while(nus--);
}
void delay_ms(unsigned int nms)
{
unsigned int i ,j;
for(i=nms;i>0;i--) //nms即延时约n毫秒
{ for(j=110;j>0;j--); }
}
/************************************************************************
* 函数: void Beep_Play(unsigned int t)
* 描述: 无源蜂鸣器驱动函数
* 参数: t : 起振频率
* 返回: none.
* 备注: t越大频率越小
************************************************************************/
void Beep_Play(unsigned int t)
{
unsigned char i;
for(i=0;i<100;i++)
{
Beep = ~Beep;
delay_10us(t);
}
Beep = 0;
}
void Timer1Init(void) //50毫秒@11.0592MHz
{
TMOD &= 0x0F; //设置定时器模式
TMOD |= 0x10; //设置定时器模式
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
TF1 = 0; //清除TF1标志
TR1 = 0; //定时器1停止计时
ET1 = 1; //中断使能
}
int cnt=0;
bit ok_flag=0; //1 为按下按键正常工作
bit hotover_flag=0; //1 加热完成标志
void main(void)
{
unsigned char pp=0;
smg_display(0); //显示数值
Timer0Init(); //定时器0初始化,2毫秒@11.0592MHz
Timer1Init(); //定时器1初始化,50毫秒@11.0592MHz
while(1)
{
if(flag_timer==1) //赋一次值
{
flag_timer = 0; //清除标志 等待下一次400ms
smg_display(cnt); //显示数值
}
if(hotover_flag == 1) //加热完成
{
Beep_Play(50);
Beep_Play(50);
Beep_Play(50);
pp++;
if(pp>10)
{
pp = 0;
hotover_flag = 0;
}
}
if(ok_flag == 1) //确认键按下了已经
{
if(Door==0&&cnt>0) //门被关上
{
// TR1 = 1; //定时器1开始计时 如果是关门自动加热则不注释
JD = 0; //加热
Beep = 1; //报警关闭
Led = 1; //照明灯灭
}
else //门未关
{
Beep_Play(50);
// Beep = 0; //报警
TR1 = 0; //定时器1停止计时
JD = 1; //停止加热
Led = 0; //照明灯亮
}
}
if(Door==0) //门被关上
{
Led = 1; //照明灯灭
}
else //门未关
{
Led = 0; //照明灯亮
}
if(key_add==0) //设置加按钮按下
{
delay_ms(200); //消除抖动
if(key_add==0) //设置加按钮按下
{
cnt++;
if(cnt>999)
cnt=0;
}
}
if(key_dec==0) //设置减按钮按下
{
delay_ms(200); //消除抖动
if(key_dec==0) //设置减按钮按下
{
cnt--;
if(cnt<0)
cnt=999;
}
}
if(key_set==0) //确认键按下
{
while(key_set==0); //等待释放
if(cnt>0) //如果定时的值大于0
{
ok_flag = 1;
TR1 = 1; //定时器1开始计时
}
}
}
}
void tm0_isr() interrupt 1 using 1
{
static unsigned char num=0;
TF0 = 0;
TL0 = 0xCD; //设置定时初值
TH0 = 0xF8; //设置定时初值
display(); //数码管显示函数
if(num++ >= 100) //2ms*100 =200ms
{
num = 0;
flag_timer = 1;
}
}
void tm1_isr() interrupt 3 using 1 //定时50毫秒
{
static unsigned int num1=0;
TL1 = 0x00; //设置定时初值
TH1 = 0x4C; //设置定时初值
if(num1++>=20&&cnt>0) //1s到
{
num1 = 0;
cnt--;
}
if(cnt==0)
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………