為什么我用pt100和adc0809加12864測量溫度,而溫度的值不能實時更新
下面是程式代碼#include <reg51.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
uint volt,vtime,dianya,wd; //電壓值測定值
uint sx,xx,sxgw,sxsw,xxgw,xxsw,sjsw,sjgw,sjxs;//上下限溫度
uchar wendu;
#define volt P1 // ADC0809模塊的D0-D7分別接P3.0-P3.7
/*TS12864A-3 埠定義*/
#define LCD_data P0 //資料口
sbit LCD_RS = P3^5; //暫存器選擇輸入
sbit LCD_RW = P3^6; //液晶讀/寫控制
sbit LCD_EN = P3^4; //液晶使能控制
sbit LCD_PSB = P3^7; //串/并方式控制
sbit wela = P2^6;
sbit dula = P2^7;
sbit CLK=P2^4; //時鐘信號
sbit START=P2^5; //轉換啟動開關
sbit EOC=P2^1; //轉換結束標志
sbit OE=P2^2; //定義ADC0809各腳
sbit S3=P3^0;
sbit S5=P3^1;
sbit kc=P2^0;
sbit gc=P3^3;
uchar code dis1[] = {"0123456789.V"};
uchar code dis2[] = {"0123456789.V"};
uchar code dis3[] = {"0123456789.V"};
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
uchar IRDIS[2];
uchar IRCOM[4];
void delay0(uchar x); //x*0.14MS
void beep();
void dataconv();
void lcd_pos(uchar X,uchar Y); //確定顯示位置
void timer();
void display(uchar WD);
void display1 (uint sx);
void display2 (uint xx);
void keyscan();
void wdscan();
/*******************************************************************/
/* */
/* 延時函式 */
/* */
/*******************************************************************/
void delay(int ms)
{
while(ms--)
{
uchar i;
for(i=0;i<250;i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
/**********************************************************/
//函式名:ADC()
//功能:數模轉換程式
//呼叫函式:
//輸入引數:
//輸出引數:
//說明:將轉換好的測定值保存在變數volt中
/**********************************************************/
void ADC()
{
OE=0;
START=0;
delay(20);
START=1;
delay(20);
START=0;//ad開始轉換
delay(20);
while (0==EOC); //等待轉換結束
{
}
OE=1; //輸出資料標志為真
EA=0; //關中斷
volt=P1; //獲取轉換值保存到volt中,(P1為轉換后資料)
dianya=volt; //轉換值處理 (例子的滿量程為5V,轉換分辯率為8位即最大值是255,5/255=19.6mV,即1代表19.6mV)
OE=0; //輸出轉換結束 (要在獲取轉換值之后)
EOC=~EOC; //自己加的
wendu=dianya;
}
/*******************************************************************/
/* */
/*檢查LCD忙狀態 */
/*lcd_busy為1時,忙,等待。lcd-busy為0時,閑,可寫指令與資料。 */
/* */
/*******************************************************************/
bit lcd_busy()
{
bit result;
LCD_RS = 0;
LCD_RW = 1;
LCD_EN = 1;
delayNOP();
result = (bit)(P0&0x80);
LCD_EN = 0;
return(result);
}
/*******************************************************************/
/* */
/*寫指令資料到LCD */
/*RS=L,RW=L,E=高脈沖,D0-D7=指令碼。 */
/* */
/*******************************************************************/
void lcd_wcmd(uchar cmd)
{
while(lcd_busy());
LCD_RS = 0;
LCD_RW = 0;
LCD_EN = 0;
_nop_();
_nop_();
P0 = cmd;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/*寫顯示資料到LCD */
/*RS=H,RW=L,E=高脈沖,D0-D7=資料。 */
/* */
/*******************************************************************/
void lcd_wdat(uint dat)
{
while(lcd_busy());
LCD_RS = 1;
LCD_RW = 0;
LCD_EN = 0;
P0 = dat;
delayNOP();
LCD_EN = 1;
delayNOP();
LCD_EN = 0;
}
/*******************************************************************/
/* */
/* LCD初始化設定 */
/* */
/*******************************************************************/
void lcd_init()
{
LCD_PSB = 1; //并口方式
lcd_wcmd(0x34); //擴充指令操作
delay(5);
lcd_wcmd(0x30); //基本指令操作
delay(5);
lcd_wcmd(0x0C); //顯示開,關游標
delay(5);
lcd_wcmd(0x01); //清除LCD的顯示內容
delay(5);
}
//自己加的
void xianshi(uchar code *s) //用指標顯示字串
{ //各種字符都用字串顯示出來 方法簡單
while(*s>0)
{
lcd_wdat(*s);
s++;
delay(10);
}
}
/*********************************************************/
/* */
/* 主程式 */
/* */
/*********************************************************/
main()
{
int i;
delay(10); //延時
EA=1;//開總中斷
EX0=1;//開外部中斷
TMOD=0x01;//設定定時計數作業方式
//為定時器初賦值
TH0=0XFC;
TL0=0X18;
ET0=1;//開定時器0中斷
TR0=1;//開啟定時器0
wela=0;
dula=0;
dianya=0;
wendu=0;
sx=42;
xx=20;
//S3=1;
//S5=1;
kc=0;
gc=1;
lcd_init(); //初始化LCD
lcd_pos(0,0); //設定顯示位置為第一行的第1個字符
lcd_wcmd(0x80); //自己加的
xianshi("當前溫度 :00.0度");//自己加的
delay(5);
lcd_wcmd(0x90);
xianshi("上限溫度 : 0 度");
delay(5);
lcd_wcmd(0x88);
xianshi("下限溫度 : 0 度");
delay(5);
while(1)
{
ADC();//呼叫模數轉換程式
display(wendu); //自己加的
delay(5);
display1(sx);
delay(5);
display2(xx);
delay(5);
keyscan();//按鍵掃描
wdscan();//溫度掃描
delay(6000);
}
}
/*********************************************************/
/* */
/* 延時x*0.14ms子程式 */
/* */
/*********************************************************/
void delay0(uchar x) //x*0.14MS
{
uchar i;
while(x--)
{
for (i = 0; i<13; i++) {}
}
}
/*********************************************************/
/* */
/* 設定顯示位置 */
/* */
/*********************************************************/
void lcd_pos(uchar X,uchar Y)
{
uchar pos;
if (X==0)
{X=0x80;}
else if (X==1)
{X=0x90;}
else if (X==2)
{X=0x88;}
else if (X==3)
{X=0x98;}
pos = X+Y ;
lcd_wcmd(pos); //顯示地址
}
void display (uchar wendu)
{
uint sjsw,sjgw,sjxs,wd;
lcd_wcmd(0x85);
wd=wendu*3.92;
sjxs=wd%10;
sjgw=(wd%100)/10;
sjsw=wd/100;
lcd_wdat(dis1[sjsw]);
delay(5);
lcd_wdat(dis1[sjgw]);
delay(5);
lcd_wdat(dis1[10]);
delay(5);
lcd_wdat(dis1[sjxs]);
delay(5);
}
void display1 (uint sx)
{
uint sxgw,sxsw;
lcd_wcmd(0x95);
sxgw=(sx)%10;
sxsw=(sx-sxgw)/10;
lcd_wdat(sxsw+0x30);
delay(5);
lcd_wdat(sxgw+0x30);
delay(5);
}
void display2 (uint xx)
{
uint xxgw,xxsw;
lcd_wcmd(0x8D);
xxgw=(xx)%10;
xxsw=(xx-xxgw)/10;
lcd_wdat(xxsw+0x30);
delay(5);
lcd_wdat(xxgw+0x30);
delay(5);
}
void wdscan()
{
if((wd/10)>=sx)
{
kc=1;
delay(100);
kc=0;
}
if((wd/10)<=xx)
{
gc=0;
delay(100);
gc=1;
}
}
void keyscan()
{
if(S3==0)
{
delay(100);
if(S3==0)
{
while(!S3);
sx++;
}
}
if(S5==0)
{
delay(100);
if(S5==0)
{
while(!S5);
xx++;;
}
}
}
/**********************************************************/
//函式名:timer() interrupt 1
//功能:定時中斷0回應程式
//呼叫函式:
//輸入引數:
//輸出引數:
//說明:為ADC提供時鐘信號
/**********************************************************/
void timer() interrupt 1
{
//初值重置
TH0=0XFC;
TL0=0X18;
CLK=~CLK;//取反 產生時鐘信號
}


uj5u.com熱心網友回復:
請問你是學習的是標準庫呀.uj5u.com熱心網友回復:
對,lcd12864是帶中文字庫的
uj5u.com熱心網友回復:
ADC程式邏輯有問題uj5u.com熱心網友回復:
請問大佬,應該怎么改呢
uj5u.com熱心網友回復:
請問大佬,應該怎么改呢
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/106986.html
標籤:單片機/工控
