智能儀器溫度檢測,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;
- /***溫度循環(huán)檢測***/
- n++;
- P3=0x00;
- if(n==50)
- {
- /***單路溫度檢測***/
- if(i_flag==0)
- {
- i++;
- if(i==5)
- i=1;
- i1=i;
- }
- else
- {
- i=i1;
- }
- /***四路溫度循環(huán)檢測***/
- 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
|