标题:
智能仪器温度检测,12位AD转换
[打印本页]
作者:
南條
时间:
2018-6-28 22:29
标题:
智能仪器温度检测,12位AD转换
智能仪器温度检测,12位AD转换。
QQ图片20180628222929.png
(43.93 KB, 下载次数: 31)
下载附件
2018-6-28 22:29 上传
单片机源程序如下:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs = P2 ^ 0;
sbit rw = P2 ^ 1;
sbit ep = P2 ^ 2;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88, 0x83,0xc6,0xa1,0x86,0x8e};
/***定义0831引脚***/
sbit CS1=P1^0;
sbit CLK1=P1^1;
sbit DO1=P1^2;
/***定义温度报警引脚***/
sbit P24=P2^4;
sbit P25=P2^5;
/***定义按键引脚***/
sbit Key0=P1^3;
sbit Key1=P1^4;
sbit Key2=P1^5;
sbit Key3=P1^6;
uchar i_flag=0;
uchar len=0;
uchar key_flag=0;
uchar key_operate=0;
uchar counter;
uchar flag=0;
uint Tl=0;
uchar TV;
uint Th[]={100,110,120,120};
uchar tempH[3];
uchar tempL[3];
uchar tmpdata[]={0,0,0};
uchar i=0,i1=0,n=0;
int tmp=0;
/***延时程序1***/
void delayUs()
{
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/***延时程序2***/
void delayms(uint i)
{
uint j;
for(;i>0;i--)
for(j=55;j>0;j--);
}
/***0831初始化和数据读取***/
uchar readad0831()
{
uchar i=0,tmp=0;
DO1=1;
CS1=1;
delayUs();
CLK1=0;
CS1=0;
delayUs();
CLK1=1;
delayUs();
CLK1=0;
delayUs();
CLK1=1;
delayUs();
CLK1=0;
delayUs();
for(i=0;i<=7;i++)
{
tmp<<=1; //左移一位
if(DO1)
tmp++;
CLK1=1;
delayUs();
CLK1=0;
delayUs();
}
CS1=1;
return tmp;
}
/***主函数***/
void main()
{
TMOD=0x01;
TH0=(65535-50000)/256; //定时器0赋初值
TL0=(65535-50000)%256;
TH1=(65535-30000)/256; //定时器1赋初值
TL1=(65535-30000)%256;
ET1=1; //允许定时器1中断
ET0=1; //允许定时器0中断
TR0=1; //定时器0开始工作
TR1=1; //定时器1开始工作
EA=1; //开放总中断
while(1)
{
P2=P2&0xf0; //关闭所有数码管
P2=P2|0x01; //打开第一个数码管
P0=table[i]; //第一个数码管显示数据
delayms(1);
if(flag==0)
{
tmpdata[0]=tmp/100; //百位
tmpdata[1]=tmp%100/10; //十位
tmpdata[2]=tmp%100%10; //个位
if(tmp>=Th[i-1]) //温度上限报警
P24=0; //红灯亮
else
P24=1;
if(tmp<=Tl) //温度下限报警
P25=0; //黄灯亮
else
P25=1;
display(tmpdata); //显示温度值
}
if(flag==1) //报警温度上限值的显示
{
tempH[0]=Th[i-1]/100; //百位
tempH[1]=Th[i-1]%100/10; //十位
tempH[2]=Th[i-1]%100%10; //个位
display(tempH);
}
}
}
/***定时器0开中断***/
void timer0() interrupt 1 {
TH0=(65535-50000)/256; //定时器0重新赋初值
TL0=(65535-50000)%256;
/***温度循环检测***/
n++;
P3=0x00;
if(n==50)
{
/***单路温度检测***/
if(i_flag==0)
{
i++;
if(i==5)
i=1;
i1=i;
}
else
{
i=i1;
}
/***四路温度循环检测***/
if(i==1) //第一路
{
P3=0x01;
}
else if(i==2) //第二路
{
P3=0x02;
}
else if(i==3) //第三路
{
P3=0x04;
}
else //第四路
{
P3=0x08;
}
n=0;
delayUs();
TV=readad0831(); //读取温度值
tmp=TV*(120.0/255.0)+0.5; //A/D转换
}
}
/***定时器1开中断***/
void Timer_1(void) interrupt 3 using 2 {
TH1=(65536-30000)/256; //定时器1重新赋初值
TL1=(65536-30000)%256;
if(((!Key0)|(!Key1)|(!Key2)|(!Key3))&(key_flag==0)) //进入按键设置
{
key_flag=20;
while(--key_flag); //延时去抖动
key_flag=1;
if(!Key0) //进入单路温度检测模式
{
if(key_operate==0)
{
key_flag=0; //允许按键长按
if(counter++>30) //Modle键要长按2S生效
{
i_flag=1;
i1=i;
key_operate++;
flag=0;
key_flag=1; //不允许按键长按
}
}
else
{
flag=1;
}
}
if(key_flag==1) //进入单路温度上限值的设定
{
if(!Key1) //加1键
{
Th[i-1]++;
}
if(!Key2) //减1键
{
Th[i-1]--;
}
}
if(!Key3) //恢复四路温度检测
{
key_operate=0;
counter=0;
flag=0;
i_flag=0;
}
}
if((Key0)&(Key1)&(Key2)&(Key3))
key_flag=0;
}
复制代码
所有资料51hei提供下载:
智能仪器温度检测.zip
(57.34 KB, 下载次数: 20)
2018-6-28 22:28 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
为了通过
时间:
2019-5-30 10:05
报警时是哪一个led灯亮啊?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1