程序如下,新手求高手指教,要被弄疯了
#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;
}
|