智能仪器温度检测,12位AD转换。
单片机源程序如下:
- #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)
|