|
发表于 2012-6-2 14:05:15
|
显示全部楼层
本帖最后由 elecfun 于 2012-6-2 14:08 编辑
给个你参考下
#include <AT89x51.H> //器件配置文件
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char //宏定义
#define RX P3_5
#define TX P3_4
unsigned int time = 0;
unsigned int timer = 0;
unsigned char posit = 0;
unsigned long S = 0;
bit flag = 0;
#define SET P1_0 //定义调整键
#define ADD P1_1 //定义减少键
#define DEC P1_2 //定义增加键
#define BEEP P3_7 //定义蜂鸣器
bit shanshuo_st; //闪烁间隔标志
bit beep_st; //蜂鸣器间隔标志
uchar x = 0; //计数器
uchar set_st = 0; //状态标志
unsigned long m; //温度值全局变量
unsigned long shangxian = 200; //上限报警,默认值为38
unsigned long xiaxian = 150; //下限报警,默认值为38
unsigned char const discode[] = {0x28, 0xeb, 0x32, 0xa2, 0xe1, 0xa4, 0x24,
0xea, 0x20, 0xa0, 0xf7, 0xff
};//1-9 "-" 全灭
unsigned char const positon[4] = { 0xfe, 0xfb, 0xef, 0xbf};
unsigned char disbuff[4] = { 0, 0, 0, 0,};
/*****延时子程序*****/
void Delay(uint num)
{
while(--num);
}
/********************************************************/
void Display(void) //扫描数码管
{
if(posit == 2)
{P2 = (discode[disbuff[posit]]) & 0xdf;}
else
{P2 = discode[disbuff[posit]];}
P0 = positon[posit];
if(++posit >= 4)
posit = 0;
}
/*****显示报警温度子程序*****/
Disp_alarm(uchar baojing)
{
P2 = discode[baojing%10];
P0 = 0xbf;
Delay(200);
P2 = discode[baojing%100/10]; //显示十位
P0 = 0xef;
Delay(200);
P2 = discode[baojing/100]; //显示百位
P0 = 0xfb;
Delay(200);
if(set_st == 1)P2 = 0x61;
else if(set_st == 2)P2 = 0x3d; //上限H、下限L标示
P0 = 0xfe;
Delay(200);
P0 = 0xff; //关闭显示
}
/********************************************************/
void Conut(void)
{
time = TH0 * 256 + TL0;
TH0 = 0;
TL0 = 0;
S = (time * 1.7) / 10; //算出来是CM
m = S / 10;
if(S >= 7000) { //超出测量范围显示-
disbuff[0] = 10; //-
disbuff[1] = 10; //-
disbuff[2] = 10; //-
disbuff[3] = 10; //-
} else {
disbuff[0] = S % 10000 / 1000;
disbuff[1] = S % 10000 % 1000 / 100;
disbuff[2] = S % 10000 % 1000 % 100 / 10;
disbuff[3] = S % 10000 % 1000 % 100 % 10;
}
}
/********************************************************/
/*****报警子程序*****/
void Alarm()
{
if(x >= 3) {beep_st = ~beep_st; x = 0;}
if((m >= shangxian && beep_st == 1) || (m < xiaxian && beep_st == 1))BEEP = 1; //&&beep_st==1//&&beep_st==1
else BEEP = 0;
}
/********************************************************/
void zd3() interrupt 3 { //T1中断用来扫描数码管和计800MS启动模块
TH1 = 0xf8;
TL1 = 0x30;
Display();
timer++;
x++;
if(timer >= 400) {
timer = 0;
TX = 1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX = 0;
}
}
/*********************************************************/
void main(void)
{
TMOD = 0x11; //设T0为方式1,GATE=1;
TH1 = 0xf8; //2MS定时
TL1 = 0x30;
ET1 = 1; //允许T1中断
TR1 = 1;
EA = 1; //开启总中断
BEEP = 0;
while(1) {
if(SET == 0) {
Delay(2000);
do {} while(SET == 0);
set_st++; x = 0;
shanshuo_st = 1;
if(set_st > 2)set_st = 0;
}
if(set_st == 0) {
EA = 1;
while(!RX); //当RX为零时等待
TR0 = 1; //开启计数
while(RX); //当RX为1计数并等待
TR0 = 0; //关闭计数
Conut(); //计算
Alarm();
} else if(set_st == 1) {
BEEP = 0; //关闭蜂鸣器
EA = 0;
if(DEC == 0) {
Delay(2000);
do {} while(DEC == 0);
shangxian--;
if(shangxian < xiaxian)shangxian = xiaxian;
}
if(ADD == 0) {
Delay(2000);
do {} while(ADD == 0);
shangxian++;
if(shangxian > 500)shangxian = 500;
}
if(x >= 10) {shanshuo_st = ~shanshuo_st; x = 0;}
if(shanshuo_st) {Disp_alarm(shangxian);}
} else if(set_st == 2) {
BEEP = 0; //关闭蜂鸣器
EA = 0;
if(DEC == 0) {
Delay(2000);
do {} while(DEC == 0);
xiaxian--;
if(xiaxian < 0)xiaxian = 0;
}
if(ADD == 0) {
Delay(2000);
do {} while(ADD == 0);
xiaxian++;
if(xiaxian > shangxian)xiaxian = shangxian;
}
if(x >= 10) {shanshuo_st = ~shanshuo_st; x = 0;}
if(shanshuo_st) {Disp_alarm(xiaxian);}
}
}
}
|
|