📄 智能体温计程序_主机.c
字号:
/**********************************************
Project Name : 智能体温计程序_主机
Designed By : sc.Dai
Date : 2007.5.30
**********************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code dis_code[10]={0xc0,0xf9,0xa4,0xb0, // 0, 1, 2, 3
0x99,0x92,0x82,0xf8,0x80,0x90}; // 4, 5, 6, 7, 8, 9, off
uchar data set_data[3]={0x00,0x07,0x03}; //预设37.0度
uchar data ad_data; //AD转换结果
uchar data dis_buf[3]={0x00,0x00,0x00}; // 显示缓冲区
uchar data bcd_buf[3]={0x00,0x00,0x00}; //十进制BCD码转换存放区
uchar data TIMER0_NUM;
bit TIMER0_flag;
bit data set_flag=0;
sbit ALE=P2^4;
sbit OE=P2^5;
sbit START=P2^6;
sbit EOC=P2^7;
sbit P30=P3^0;
sbit select0=P3^7;
sbit select1=P3^6;
sbit select2=P3^5;
sbit K1=P2^0;
sbit K2=P2^1;
sbit K3=P2^2;
sbit K4=P2^3;
sbit bep=P3^3;
sbit SET_IND=P3^4;
sbit P17=P1^7; //小数点
uint data temp;
/**********************************************/
/*函数声明
/**********************************************/
void delay1ms(uchar t);
void adc(void);
void BCD(void);
void keyscan(void);
void send_str(void);
void beep(void);
void display(void);
/**********************************************/
/*按键蜂鸣函数
/**********************************************/
void beep2(void)
{
uchar data j,k;
for(j=26;j>0;j--)
{
for(k=254;k>0;k--);
bep=!bep;
}
bep=1;
}
/**********************************************/
/*蜂鸣报警
/**********************************************/
void beep(void)
{
uchar data j,k;
for(j=100;j>0;j--)
{
for(k=254;k>0;k--)
bep=0;
}
bep=1; //关蜂鸣器
}
/**********************************************/
/*延时1ms函数
/**********************************************/
void delay1ms(uchar t)
{
uchar j,k;
for(j=0;j<t;j++)
for(k=0;k<120;k++);
}
/**********************************************/
/*AD转换函数
/**********************************************/
void adc(void)
{
ALE=1;
_nop_();
_nop_();
ALE=0;
START=1;
_nop_();
_nop_();
START=0;
_nop_();
_nop_();
_nop_();
_nop_();
while(EOC==0); //等待转换结束
OE=1;
ad_data=P0; //读入转换数据
OE=0;
}
/**********************************************/
/*十进制BCD码转换函数
/**********************************************/
void BCD(void)
{
bcd_buf[2]=(ad_data/51); //十位
temp=(ad_data%51);
temp=(temp*10);
bcd_buf[1]=(temp/51); //个位
temp=(temp%51);
temp=temp*10;
bcd_buf[0]=(temp/51); //小数位
if(bcd_buf[2]>set_data[2]) //报警值检测
beep();
else if(bcd_buf[2]==set_data[2])
{
if(bcd_buf[1]>set_data[1])
beep();
else if(bcd_buf[1]==set_data[1])
{
if(bcd_buf[0]>set_data[0])
beep();
}
}
}
/**********************************************/
/*键盘扫描函数
/**********************************************/
void keyscan(void)
{
uchar data m;
if(K1==0) //K1设置键
{
for(m=0;m<100;m++) //延时11ms
display();
if(K1==0)
{
beep2(); //按键时响一声
set_flag=!set_flag; //设置标志位取反
}
}
if(set_flag==1) //若设置键按下,则检测K2-K4
{
SET_IND=0; //设置灯亮
if(K2==0) //K2:十位加1
{
for(m=0;m<100;m++) //延时11ms
display();
if(K2==0)
{
beep2(); //按键时响一声
set_data[2]++;
if(set_data[2]==5) set_data[2]=0;
}
}
if(K3==0) //K3:个位加1
{
for(m=0;m<100;m++) //延时11ms
display();
if(K3==0)
{
beep2(); //按键时响一声
set_data[1]++;
if(set_data[1]==10) set_data[1]=0;
}
}
if(K4==0) //K4:小数位加1
{
for(m=0;m<100;m++) //延时11ms
display();
if(K4==0)
{
beep2(); //按键时响一声
set_data[0]++;
if(set_data[0]==10) set_data[0]=0;
}
}
}
else SET_IND=1;
}
/**********************************************/
/*显示函数
/**********************************************/
void display(void)
{
if(set_flag) //设置键按下,则显示设置的数值
{
dis_buf[0]=set_data[0];
dis_buf[1]=set_data[1];
dis_buf[2]=set_data[2];
}
else
{ //否则显示温度值
dis_buf[0]=bcd_buf[0];
dis_buf[1]=bcd_buf[1];
dis_buf[2]=bcd_buf[2];
}
P1 = 0xff; // 先关闭所有数码管
P1 = dis_code[dis_buf[0]]; // 小数显示代码传送到P1口
select2=1;select1=1;select0=0; // 位选
delay1ms(1); //延时1ms
P1 = dis_code[dis_buf[1]]; // 个位显示代码传送到P1口
select2=1;
select1=0;select0=1;
P17=0;
delay1ms(1); //延时1ms
P1 = dis_code[dis_buf[2]]; // 十位显示代码传送到P1口
select2=0;select1=1;select0=1;
delay1ms(1); //延时1ms
}
/**********************************************/
/*串口发送一个字符函数
/**********************************************/
void send_str(void)
{
SBUF = ad_data; //串口发送AD转换温度值
while(TI==0); // 等待数据传送
TI = 0; // 清除数据传送标志
}
/**********************************************/
/*主函数
/**********************************************/
void main(void)
{
TMOD = 0x21; // 定时器1工作于方式2,8位自动重载模式, 用于产生波特率
// 定时器0工作于方式1,产生1s的AD间隔时间
TH0=15536/256; //T0定时50ms
TL0=15536%256;
TH1 = 0xe1; // 波特率1000
TL1 = 0xe1;
SCON = 0x50; // 设定串行口工作方式1
PCON = 0x00; // 波特率不倍增
TI=0; //清除发送中断标志
EA = 1; // 开总中断
ET0 = 1; //开T0中断
ET1=0;
TR1 = 1; // 启动T1
TR0 = 1; //启动T0
while(1)
{
display();
keyscan();
if(TIMER0_flag)
{
TIMER0_flag=0;
adc();
BCD();
send_str();
}
}
}
/**********************************************/
/*T0中断服务程序
/*每秒钟ADC一次,串口发送一次
/**********************************************/
void timer0(void) interrupt 1
{
TH0=15536/256; //重装初值
TL0=15536%256;
TIMER0_NUM++;
if(TIMER0_NUM==20)
{
TIMER0_NUM=0;
TIMER0_flag=1;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -