|
51hei圖片20191231112031.png (61.29 KB, 下載次數: 24)
下載附件
2019-12-31 11:21 上傳
單片機源程序如下:
#include <reg51.h>
#include<intrins.h>//頭文件
#define uchar unsigned char
#define uint unsigned int
uchar count;
sbit CS = P2^0;
sbit Clk = P3^6;
sbit DATI = P3^7;
sbit DATO = P3^7;
sbit key1=P1^4;//按鍵定義
sbit key2=P1^5;//按鍵定義
sbit key3=P1^6;//按鍵定義
sbit beep=P2^5;
#define datlcd P0
sbit lcdrs = P2^1; //液晶讀
sbit lcdrw = P2^2; //液晶寫
sbit lcden = P2^3;//液晶選擇
long ch0_temp; //定義變量
unsigned char dat = 0x00;
unsigned char count = 0x00;
unsigned char CH;
signed int MIN=200;
signed int MAX=1500;
uchar page=0;
unsigned char adc0832(unsigned char CH) //ADC測量程序
{
unsigned char i,test,adval;
adval = 0x00;
test = 0x00;
Clk = 0;
DATI = 1;
_nop_();
CS = 0;
_nop_();
Clk = 1;
_nop_();
if ( CH == 0x00 )
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 0;
_nop_();
Clk = 1;
_nop_();
}
else
{
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
DATI = 1;
_nop_();
Clk = 1;
_nop_();
}
Clk = 0;
DATI = 1;
for( i = 0;i < 8;i++ )
{
_nop_();
adval <<= 1;
Clk = 1;
_nop_();
Clk = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++)
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
Clk = 1;
_nop_();
Clk = 0;
}
if (adval == test)
dat = test;
_nop_();
CS = 1;
DATO = 1;
Clk = 1;
return dat;
}
// 0 1 2 3 4 5 6 7 8 9
//================================定時器0/1初始化函數================================
void T0_T1_init()
{
TMOD = 0x11;//定時器0/1均工作于方式1,16位計時方式
EA = 1;//開總中斷
TR1=0; //打開定時器
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
ET1=1;
}
//****1MS延時函數********
void delay(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<124;j++);
}
void lcdwc(uchar lcd_cmd) //液晶命令
{
lcden=0;
lcdrs=0;
lcdrw=0;
datlcd=lcd_cmd;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcdwd(uchar lcd_data) //液晶數據
{
lcden=0;
lcdrs=1;
lcdrw=0;
datlcd=lcd_data;
delay(1);
lcden=1;
delay(1);
lcden=0;
}
void lcdxy(uchar hlcd,uchar addlcd,uchar dtlcd) //液晶指定位置寫數據
{
if (hlcd==1)
{
lcdwc(0x80+addlcd); //第一行地址
lcdwd(dtlcd);
}
else
{
lcdwc(0xc0+addlcd); //第二行地址
lcdwd(dtlcd);
}
}
void init_1602() //初始化
{
delay(5);
lcdwc(0x01);//清屏
lcdwc(0x38); //顯示模式
lcdwc(0x0c); //顯示開
lcdwc(0x06); //顯示光標移動設置
}
void xs_ad(uint aaa,uint bbb,uint ccc)//顯示函數
{
lcdxy(1,0,'T');
lcdxy(1,1,'e');
lcdxy(1,2,'m');
lcdxy(1,3,'p');
// lcdxy(1,4,'u');
lcdxy(1,4,':');
lcdxy(1,6,aaa/1000+0x30); //測量值q位
lcdxy(1,7,aaa%1000/100+0x30); // b位
lcdxy(1,8,aaa%1000%100/10+0x30);//s位
lcdxy(1,9,aaa%10+0x30);//個位
lcdxy(1,10,0xdf);//個位
lcdxy(1,11,'C');//個位
lcdxy(2,0,'L');
lcdxy(2,1,':');
lcdxy(2,2,bbb/1000+0x30); //測量值q位
lcdxy(2,3,bbb%1000/100+0x30); // b位
lcdxy(2,4,bbb%1000%100/10+0x30);//s位
lcdxy(2,5,bbb%10+0x30);//個位
lcdxy(2,8,'H');
lcdxy(2,9,':');
lcdxy(2,10,ccc/1000+0x30); //測量值q位
lcdxy(2,11,ccc%1000/100+0x30); // b位
lcdxy(2,12,ccc%1000%100/10+0x30);//s位
lcdxy(2,13,ccc%10+0x30);//個位
}
void key()//按鍵掃描
{
if(key1==0) //加按鍵按下
{
delay(2); //延時,消除按鍵抖動
if(key1==0)
{
while(!key1); //判斷按鍵可釋放
page++;
if(page>2)
page=0;
}
}
if(key2==0) //減同理
{
delay(2);
if(key2==0)
{
if(page==1)
{
MIN++;
if(MIN>1500)MIN=0;
}
if(page==2)
{
MAX++;
if(MAX>1500)MAX=0;
}
delay(1000);
while(!key2)
{
delay(10);
if(page==1)
{
MIN=MIN+10;
if(MIN>1500)MIN=0;
}
if(page==2)
{
MAX=MAX+10;
if(MAX>1500)MAX=0;
}
}
}
}
if(key3==0) //加按鍵按下
{
delay(2); //延時,消除按鍵抖動
if(key3==0)
{
if(page==1)
{
MIN--;
if(MIN<0)MIN=1500;
}
if(page==2)
{
MAX--;
if(MAX<0)MAX=1500;
}
delay(1000);
while(!key3)//判斷按鍵可釋放
{
if(page==1)
{
MIN=MIN-10;
if(MIN<0)MIN=1500;
}
if(page==2)
{
MAX=MAX-10;
if(MAX<0)MAX=1500;
}
}
}
}
}
//******主函數*********
void main()
{
init_1602() ;
T0_T1_init();
beep=0;
while(1)
{
key();
ch0_temp=2.69*adc0832(0)*55/25; //把測量的模轉換成數字量
xs_ad(ch0_temp,MIN,MAX);
if((ch0_temp<MIN)||(ch0_temp>MAX))
{
TR1=1;
}
else
TR1=0;
}
}
void time1() interrupt 3 //蜂鳴器報警
{
static uchar count=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==4) //0.2S
{
count=0;
beep=~beep;
}
}
|
評分
-
查看全部評分
|