#include <avr/io.h>
#include<avr/interrupt.h>
#include<avr/sfr_defs.h>
#include<util/delay.h>
#include<math.h>
#include <avr/pgmspace.h>
#include "st7920.h"
#define uchar unsigned char
#define uint unsigned int
//#include<avr/pgmspace.h>
//const prog_char text_0[]={"题C:水温控制系统"};
//const prog_char text1[]={"量程:10-70摄氏度"};
const char text0[]={"题C:水温控制系统"};
const char text1[]={"量程:10-70摄氏度"};
const char text2[]={"黑龙江科技学院--"};
const char text3[]={"2010.08.14至28日"};
const char text4[]={" *水温控制系统* "};
const char text5[]={"当前温度: ℃"};
const char text6[]={"设定温度: ℃"};
const char text7[]={"当前值"};
const char text9[]={"℃"};
const char text8[]={"设定值"};
unsigned char text10[]={};
unsigned char re_temp[80]={};
unsigned char table[]={};
const uchar DIP_NUM[16]={"0123456789.C"};
unsigned char lcd[640]={};
unsigned int a,e;
//const char text8[]={" "};//画图第三行
//const char text9[]={" "};//画图第四行
/***********************按键设置****************************
设置温度
************************************************************/
#define Set_D PORTD|=(1<<4)|(1<<5)|(1<<6)|(1<<7)
#define Set_A PORTA|=(1<<7)|(1<<4)|(1<<6)
#define D4_In DDRD&=~(1<<4)
#define D5_In DDRD&=~(1<<5)
#define D6_In DDRD&=~(1<<6)
#define D7_In DDRD&=~(1<<7)
#define A7_In DDRA&=~(1<<7)
#define A6_In DDRA&=~(1<<6)
#define A4_In DDRA&=~(1<<4)
#define Check_PD4 (PIND & 0x10)
#define Check_PD5 (PIND & 0x20)
#define Check_PD6 (PIND & 0x40)
#define Check_PD7 (PIND & 0x80)
#define Check_PA7 (PINA & 0x80)
#define Check_PA6 (PINA & 0x40)
#define Check_PA4 (PINA & 0x10)
/******************************************************
按键参数//自锁
******************************************************/
#define PB4 4
#define PB4_In DDRB&=~(1<<PB4)
#define Set_PB4 PORTB|=(1<<PB4)
#define Check_PB4 (PINB & 0x10)
#define PB5 5
#define PB5_In DDRB&=~(1<<PB5)
#define Set_PB5 PORTB|=(1<<PB5)
#define Check_PB5 (PINB & 0x20)
#define PB1 1
#define PB1_Out DDRB|=(1<<PB1)
#define Set_PB1 PORTB|=(1<<PB1)
#define Check_PB5 (PINB & 0x20)
/******************************************************
PID调节参数
******************************************************/
int w=0,K;//外部中断计数标志 PID调节返回数
unsigned char p;//定时器 中断计数
int Temp_Now;
int Temp_Set=0;// 设定温度值
#define I_max 255
#define I_min -255
#define Check 5 //与设定目标值相差若干度数前 比例控制
#define PD1 1//触发光耦端口
#define PD2 2//外部中断0 触发端口
#define DD_out DDRD|=(1<<PD1);//光耦低电平触发 前期设置输出 且为高电平
#define PORT_out PORTD|=(1<<PD1);
char KP,KI;//比例、积分、微分常数(为什么给int呢?其实给char形式就可以了??????????????????????
unsigned char zz=0;
char KD;
//unsigned char yy=0;
/*****************************************************/
/************************DS18B20的测温参量设置****************************/
#define ddr_dat 2
#define Clr_DS18B20 PORTB&=~(1<<ddr_dat) //数据线强制拉低
#define Set_DS18B20 PORTB|=(1<<ddr_dat) //数据线强制拉高,上拉
#define SET_Master_Out DDRB|=(1<<ddr_dat) //Mega16控制总线
#define SET_Master_In DDRB&=~(1<<ddr_dat) //释放总线
#define Check_DS18B20 (PINB & 0x04) //数据线的状态
/************************************************************************/
/****************************************Copyright (c)**************************************************
** 描 述: DS18B20函数
**********************************************************************************************************/
/**********************************************************************
functionName: uchar resetDS18B20(void)
description :DS18B20初始化
**********************************************************************/
void Initial_DS18B20(void)
{
//释放总线
SET_Master_Out;
Set_DS18B20; //Maga16控制总线
Clr_DS18B20; //强制拉低
_delay_us(600); //延时500us,大于480us
SET_Master_In; //释放总线,总线自动上拉
Set_DS18B20;
_delay_us(45); //等待85us,读取总线状态
while(! Check_DS18B20); //等待复位成功
SET_Master_In; //释放总线,总线自动上拉
Set_DS18B20;
_delay_us(500);
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :读DS18B20一个字节
**********************************************************************/
uchar readByteDS18B20()
{
uchar i;
uchar retVal=0; //释放总线
for(i=8;i>0;i--)
{
SET_Master_In;
Set_DS18B20;
_delay_us(2);
retVal>>=1;
SET_Master_Out; //Maga16控制总线
Set_DS18B20;
Clr_DS18B20; //强制拉低
_delay_us(2); //延时2us,大于1us
SET_Master_In;
Set_DS18B20;
_delay_us(8); //10us后读取总线状态,
if( Check_DS18B20)
{
retVal|=0x80;
_delay_us(60);
}
else
{
_delay_us(60); //延时30us
SET_Master_In;
Set_DS18B20; //释放总线
}
}
return(retVal);
}
/**********************************************************************
functionName: uchar readByteDS18B20(void)
description :写DS18B20一个字节
**********************************************************************/
void writeByteDS18B20(uchar wb)
{
uchar j=8;
for(j=8;j>0;j--)
{
SET_Master_In;
Set_DS18B20;
_delay_us(10);
SET_Master_Out;
Set_DS18B20; //Maga16控制总线
Clr_DS18B20; //强制拉低
_delay_us(3); //保持3us
if((wb&0x01)==0x01)
{
SET_Master_In;
Set_DS18B20;
_delay_us(82);
}
else
{
Clr_DS18B20;
_delay_us(82);
SET_Master_In;
Set_DS18B20;
}
//释放总线
wb>>=1;
}
}
/**********************************************************************
functionName: unsigned int readTempDS18B20(void)
description :读DS18B20温度
**********************************************************************/
unsigned char readTempDS18B20(void)
{
unsigned char tempL,tempH,y,z,m;
unsigned long int x;
Initial_DS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0x44); //启动温度转换
_delay_ms(800);
Initial_DS18B20();
writeByteDS18B20(0xcc); //跳过ROM
writeByteDS18B20(0xbe); //读数据
tempL=readByteDS18B20();
tempH=readByteDS18B20();
/*if(tempL==0)//查看是否 有无进位
{
tempL=~tempL+1;
tempH=~tempH+1;
}
else
{
tempL=~tempL+1;
tempH=~tempH;
}*/
y=(tempH<<4)|(tempL>>4);//取得整数
m=(tempL&0x0f);//取低四位
x=m*625;
table[2]=y%100/10;//10
table[1]=y%100%10;//1
z=x%1000/100;//0.01
if(z>=5)//四舍五入
{
table[0]=(x/1000+1);//0.1
}
else
{
table[0]=x/1000;//0.1
}
//L=table[2]*10+table[1];
return(y);
}
/******************************************************************************************************
*******************************************************************************************************/
/*******************************************************************************************************/
////////////////////////////////////////////////////////////////////////////////////////////////////////
void Huage_and_clear(void)
{
uint length;
for(length=639;length>0;length--)
{
lcd[length]=0x00;
}//清零显示屏幕
lcd[0]=0x00;
lcd[1]=0x00;
for(a=0;a<10;a+=5)
{
lcd[620+a]|=0x00;
lcd[620+a+1]|=0x80;
lcd[620+a+2]|=0x20;
lcd[620+a+3]|=0x08;
lcd[620+a+4]|=0x02;
}//小格分割线
for(a=1;a<64;a+=5)
{
lcd[10*a]|=0x80;
lcd[10*(1+a)]|=0x80;
lcd[10*(2+a)]|=0x80;
if((a+3)==64) break;
lcd[10*(3+a)]|=0x80;
lcd[10*(4+a)]|=0xc0;
}//画竖框带虚点的
lcd[0]=0x00;
for(a=0;a<10;a++)
{
lcd[630+a]=0xff;
}//画横框
}
//图形连线绘制曲线
void processing_grap(unsigned char *shuzu)
{ unsigned int b,c,d;
for(a=0;a<10;a++)
{