程序如下,新手求高手指教,要被弄瘋了
#include<reg51.h>
#include <intrins.h>
#include"temp.h"
sfr AUXR1=0xA2;
sfr adc_contr=0xbc;//adc控制寄存器,不可位尋址,用或運算來設置
sfr adc_res=0xbd;//轉換結果寄存器,高八位
sfr adc_low2=0xbe;//轉換結果寄存器,低兩位
sfr p1asf=0x9d;//設置p1的那一口為輸入口,不可位尋址.
//以下都是控制寄存器的各位地址
#define adc_power 0x80;//adc電源,第7位
#define adc_flag 0x10;//轉換結束標志位,第4位
#define adc_start 0x08;//轉換開始,第3位
#define adc_speedll 0x00;//速度位,第5,6位
#define adc_speedl 0x20;
#define adc_speedh 0x40;
#define adc_speedhh 0x60;
#define adc_chs 0x04;//輸入通道為第p1.0,1,2,3三位可設置p10-p17
//位定義完成
//--定義使用的IO--//
#define GPIO_KEY P0 //鍵盤用P0口
sbit OUT=P2^0; //風機運行輸出
sbit OUT2=P2^1; //壓縮機運行輸出
sbit DIO = P3^0; //串行數據輸入
sbit RCLK = P3^1; //時鐘脈沖信號——上升沿有效
sbit SCLK = P3^2; //打入信號————上升沿有效
//--定義全局變量--//
unsigned char code fseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
unsigned char code segbit[]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
uchar code Temp[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//--聲明全局函數--//
void LcdDisplay(int);
void LcdDisplay2(int);
void DigDisplay();
void DigDisplay2();
void Outv(int);
int Ds18b20ReadTemp();
int Ds18b20ReadTemp2();
int Ds18b20ReadTemp3();
unsigned char Key_Scan();
void main (void); // 主函數
void LED4_Display (int temp); // LED顯示
void LED4_Display2 (int sd); // LED顯示
void LED_OUT(uchar X); // LED單字節串行移位函數
unsigned char code LED_0F[]; // LED字模表
void Delay(unsigned char a1,b1,c1);
unsigned int AD();
uint adc_finished;//轉換結束標志
/*******************************************************************************
* 函 數 名 : Delay1ms
* 函數功能 : 延時函數
* 輸 入 : 無
* 輸 出 : 無
******************************************************************************/
void Delay1ms(uint c)
{
unsigned char a,b;
for(;c>0;c--)
for(b=43;b>0;b--)
for(a=127;a>0;a--);
}
void Delay(unsigned char a1,b1,c1)
{
unsigned char a,b,c;
for(a=0;a<a1;a++)
for(b=0;b<b1;b++)
for(c=0;c<c1;c++);
}
/*******************************************************************************
* 函 數 名 : main
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : 無
*******************************************************************************/
void main()
{
while(1)
{
unsigned char keyNum,k,c;
int i,d,b,e,j;
uint x,y;
i=0x0369;
c=0xfe;
while (1)
{
b=Ds18b20ReadTemp();
d=Ds18b20ReadTemp2();
e=AD();
x=100;
y=10;
while(x)
{
x--;
while(y)
{
y--;
Outv(b);
if (e>i)
{
OUT2=1;
}
else
{
OUT2=0;
}
keyNum = Key_Scan();//掃描鍵盤
if(keyNum == 0xff)
{k=c;}
else
{k=keyNum;}
if (k ==0xfe) //有按鍵按下
{
j=5;
while(j>0)
{j--;LED4_Display (b);}
c =0xfe;
}
if (k ==0xfd) //有按鍵按下
{
j=5;
while(j>0)
{j--;LED4_Display (d);}
c =0xfd;
}
if (k ==0xfb) //有按鍵按下
{
j=5;
while(j>0)
{j--;LED4_Display2 (e);}
c =0xfb;
}
}
}
}
}
}
/*******************************************************************************
* 函 數 名 : 脈沖輸出
* 函數功能 : 主函數
* 輸 入 : 無
* 輸 出 : V
*******************************************************************************/
void Outv(int temp)
{
int i;
if(temp>0)
{
i=temp*0.0625*50;
if(i>300)
{
OUT=0;
}
else
{
OUT=0;
Delay1ms(i);
OUT=1;
}
}
else
{OUT=0;}
}
/*******************************************************************************
* 函 數 名 : Key_Scan()
* 函數功能 : 掃描鍵盤
* 輸 入 : 無
* 輸 出 : 讀取到的鍵值
*******************************************************************************/
unsigned char Key_Scan()
{
unsigned char keyValue ,i; //保存鍵值
keyValue=0xff;
//--檢測按鍵1--//
if (GPIO_KEY != 0xFF) //檢測按鍵K1是否按下
{
Delay1ms(10); //消除抖動
if (GPIO_KEY != 0xFF) //再次檢測按鍵是否按下
{
keyValue = GPIO_KEY;
i = 0;
while ((i<5) && (GPIO_KEY != 0xFF)) //檢測按鍵是否松開
{
Delay1ms(1);
i++;
}
}
}
return keyValue; //將讀取到鍵值的值返回
}
/*******************************************************************************
* 函 數 名 : LED4_Display (int temp)
* 函數功能 : LED顯示讀取到的溫度
* 輸 入 :
* 輸 出 : 無
*******************************************************************************/
void LED4_Display (int temp)
{
unsigned char code *led_table; // 查表指針
uchar i,j;
float tp;
//顯示第4位
if(temp< 0) //當溫度值為負數
{
i =0xbf;
LED_OUT(i);
LED_OUT(0x08);
RCLK = 0;
RCLK = 1;
//因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
temp=temp-1;
temp=~temp;
tp=temp;
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算由?.5,還是在小數點后面。
}
else
{
i =0xff;
LED_OUT(i);
LED_OUT(0x08);
RCLK = 0;
RCLK = 1;
tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
//如果溫度是正的那么,那么正數的原碼就是補碼它本身
temp=tp*0.0625*100+0.5;
//留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
//后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
//算加上0.5,還是在小數點后面。
}
//顯示第3位
led_table = LED_0F + temp % 10000 / 1000;
i = *led_table;
LED_OUT(i);
LED_OUT(0x04);
RCLK = 0;
RCLK = 1;
//顯示第2位
led_table = LED_0F + temp % 1000 / 100;
j = *led_table;
i =j & 0x7f;
LED_OUT(i);
LED_OUT(0x02);
RCLK = 0;
RCLK = 1;
//顯示第1位
led_table = LED_0F + temp % 100 / 10;
i = *led_table;
LED_OUT(i);
LED_OUT(0x01);
RCLK = 0;
RCLK = 1;
}
/*******************************************************************************
* 函 數 名 : LED4_Display2 (int temp)
* 函數功能 : LED顯示讀取到的濕度
* 輸 入 :
* 輸 出 : 無
*******************************************************************************/
void LED4_Display2 (uchar sd)
{
unsigned char code *led_table2; // 查表指針
uchar i;
uchar sdc;
sdc=(sd-80)*100/327;
//顯示第4位
led_table2 = LED_0F + (sdc % 10000 / 1000);
i = *led_table2;
LED_OUT(i);
LED_OUT(0x08);
RCLK = 0;
RCLK = 1;
//顯示第3位
led_table2 = LED_0F + (sdc % 1000 / 100);
i = *led_table2;
LED_OUT(i);
LED_OUT(0x04);
RCLK = 0;
RCLK = 1;
//顯示第2位
led_table2 = LED_0F + (sdc % 100 / 10);
i = *led_table2;
LED_OUT(i);
LED_OUT(0x02);
RCLK = 0;
RCLK = 1;
//顯示第1位
led_table2 = LED_0F + (sdc % 10);
i = *led_table2;
LED_OUT(i);
LED_OUT(0x01);
RCLK = 0;
RCLK = 1;
}
/*******************************************************************************
* 函 數 名 : LED_OUT(uchar X)
* 函數功能 : LED段選
* 輸 入 :
* 輸 出 : 無
*******************************************************************************/
void LED_OUT(uchar X)
{
uchar i;
for(i=8;i>=1;i--)
{
if (X&0x80) DIO=1; else DIO=0;
X<<=1;
SCLK = 0;
SCLK = 1;
}
}
unsigned char code LED_0F[] =
{// 0 1 2 3 4 5 6 7 8 9 A b C d E F -
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf
};
//
void adcinit()//adc初始化函數
{
p1asf=0x10;//設置p10 為ad轉換輸入口
AUXR1&=0xfb;
adc_contr=0xe0;//打開電源,設最高速度
//adc_contr=adc_power|adc_speedh|adc_chs;//電源X0000000,速度0XX00000
//通道:00000XXX
Delay1ms(5);
adc_contr|=adc_chs;//設置頻道
}
unsigned int AD()
{
unsigned char sd=0;
adcinit();
adc_res=0;
adc_low2=0;
adc_contr|=adc_start;//啟動ad轉換,置1為起動,轉換結束后自動置0
while(adc_finished==0)
{
adc_finished=adc_contr&adc_flag;//檢測是否轉換結束,沒結束一直等
}
adc_contr=adc_contr&0xef;//轉換結束標志清零
sd=adc_res*5*100/1024;
return sd;
}
|