华理信息工程综合课设:AT89C52
2017-07-10 本文已影响0人
某不科学的XX
信工课程设计:电路焊接与时序级编程
- 主要芯片:AT89C52,DS18B20,24C16,HD7279
- 主要功能:实时测温,手动风扇变速,自动风扇变速,PID控温,参数配置,密码验证,键盘变速连按等
#include <REG52.H>
#include <stdio.h>
#include <math.h>
#include <intrins.h>
#define U8 unsigned char
#define somenop(); _nop_();_nop_();_nop_();_nop_();_nop_();
#define somenop10(); somenop();somenop();
#define somenop25(); somenop();somenop();somenop();somenop();somenop();
#define somenop50(); somenop25();somenop25();
#define somenop100(); somenop50();somenop50();
#define kp 5
#define ki 5
#define kd 5
/*
#define CMD_RESET 0xA4
#define PIDA 12
#define PIDB 10
*/
unsigned char KeyNum;
unsigned char KeyValue;
int KeyCount1;
U8 temperature[2];
unsigned char MotorNow;
bit MotorFlag,returnFlag;
unsigned char firstmenu;
unsigned char MotorCount = 0;
unsigned int TempNow;
unsigned int TempCount =0;
bit TempInput = 0;
int duk,e1=0,e2=0,e3=0;
unsigned char Tset = 30;
unsigned char Tup[4];
unsigned char Tdown[4];
unsigned char Level[11] = {0,10,20,30,40,50,60,70,80,90,100};
unsigned char pass[4] = {1,2,3,4};
unsigned char code KeyTable[4] = {0x3B,0x3A,0x39,0x38};
unsigned char Buff[8] = {0,1,2,3,4,5,6,7};
//unsigned char Disp[8] = {0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97};
unsigned char code LEDValue[35] = {0xFC,0x44,0x79,0x5D,0xC5,0x9D,0xBD,0x54,0xFD,0xDD,
0xFE,0x46,0x7B,0x5F,0xC7,0x9F,0xBF,0x56,0xFF,0xDF,
0xF5,0xAD,0xB8,0x6D,0xB9,0xB1,0xF1,0x01,0xA9,0x00,//A B C D E F P - t 空
0x21,0x2C,0x25,0x2D// r u n o
};
sbit CS = P1^4;
sbit CLK = P1^5;
sbit DATA = P1^7;
sbit Motor = P1^2;
sbit DS1820_DQ= P1^3;
sbit ECLK = P1^1;
sbit EDTA = P1^0;
void Key(void);
void Init_7279(void);
void send_byte(unsigned char);
void write_7279(unsigned char,unsigned char);
void display(unsigned char buff[]);
unsigned char ReadKey(void);
unsigned char receive_byte(void);
bit count(int ,int ,unsigned char);
void clean(void);
//void func(int);
void temper(void);
//void motor(void);
void motorConfigure(void);
void configure(void);
//void run(void);
//void runMotor(unsigned char);
void showTemp();
void choiceLevel();
bit DS1820_Reset(); //DS1820 复位
void DS1820_WriteData(U8 wData); //写数据到DS1820
U8 DS1820_ReadData(); //读数据
void displayTemperature();
void estart();
void estop();
bit ack();
void init_24c16();
void ewrite_byte(unsigned char);
unsigned char eread_byte();
void ewrite_add(unsigned char,unsigned char);
unsigned char eread_add(unsigned char);
void Menu(void);
void button(void);
void parun();
void pacon();
void paconb();
void paconf();
bit mm();
void pid();
void main (void) {
int tmr;
for(tmr=0;tmr<0x2000;tmr++);
SP = 0xB0;
//Init_7279();
TMOD = 0x11;
EA = 1;
ET0 = 1;
ET1 = 1;
KeyCount1 = 0;
TR0 = 1;
TR1 = 1;
// init_24c16();
firstmenu = 1;
clean();
//ewrite_add(4,Tdown[0]);ewrite_add(5,Tdown[1]);
//ewrite_add(6,Tup[0]);ewrite_add(7,Tup[0]);
//ewrite_add(10,50);ewrite_add(11,50);ewrite_add(12,50);
Tdown[0] = eread_add(4);somenop25();
Tdown[1] = eread_add(5);somenop25();
Tup[0] = eread_add(6);somenop25();
Tup[1] = eread_add(7);somenop25();
Level[0] = eread_add(20);somenop25();
Level[1] = eread_add(21);somenop25();
Level[2] = eread_add(22);somenop25();
Level[3] = eread_add(23);somenop25();
Level[4] = eread_add(24);somenop25();
Level[5] = eread_add(25);somenop25();
Level[6] = eread_add(26);somenop25();
Level[7] = eread_add(27);somenop25();
Level[8] = eread_add(28);somenop25();
Level[9] = eread_add(29);somenop25();
Level[10] = eread_add(30);somenop25();
while(1){
display(Buff);
Menu();
button();
}
/* 电机
MotorCount = 60;
MotorNow = 0;
TR0 = 0;
while(1){
TR0 = MotorFlag;
// run();
} ;
*/
/* 存储
init_24c16();
somenop25();
ewrite_add(0,5);
somenop25();
i = eread_add(0);
somenop25();
write_7279(0x93,LEDValue[i]);
ewrite_add(0,4);somenop25();
ewrite_add(1,5); somenop25();
ewrite_add(2,1); somenop25();
ewrite_add(3,3); somenop25();
Buff[0] = eread_add(0);somenop25();
Buff[1] = eread_add(1);somenop25();
Buff[2] = eread_add(2);somenop25();
Buff[3] = eread_add(3);somenop25();
display(Buff);
*/
/* 温度显示
while (1)
{
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM 命令
DS1820_WriteData(0x44); //温度转换命令
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM 命令
DS1820_WriteData(0xbe); //读DS1820 温度暂存器命令
for (i=0;i<2;i++)
{
temperature[i]=DS1820_ReadData(); //采集温度
}
DS1820_Reset(); //复位,结束读数据
displayTemperature(); //显示温度值
somenop50();
}*/
/* 菜单目录
run();
while(1);
*/
/* 键盘测试
for(i=0;i<8;i++)
Buff[i] = 0x15;
while(1)
{
display(Buff);
temp = ReadKey(); //读键值
if(temp != 0xFF){
Buff[0] = (temp>>4) & 0x0f;
Buff[1] = temp & 0x0f;
}
} */
/* 显示字形表
while(1){
//write_7279(0x90,0x79);
//send_byte(0xBF);
// display(Buff);
}
*/
}
void Menu(void){
switch(firstmenu){
case 1:{Buff[4] = 28;Buff[5] = 26;Buff[6] = 27;Buff[7] = 29;};break; //tp-
case 2:{Buff[4] = 30;Buff[5] = 31;Buff[6] = 32;Buff[7] = 27;};break; //run-
case 3:{Buff[4] = 22;Buff[5] = 33;Buff[6] = 32;Buff[7] = 27;};break; //con-
case 4:{Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 29;};break; //pa-
case 5:{Buff[4] = 26;Buff[5] = 1;Buff[6] = 23;Buff[7] = 27;};break; //pid-
default : break;
}
//display(DispBuff);
}
//按键控制
void button(void)
{
Key();
if(KeyNum==1){
if(firstmenu==5)firstmenu=1;
else firstmenu++;
}
if(KeyNum==0){
if(firstmenu==1)firstmenu=5;
else firstmenu--;
}
if(KeyNum==2){
returnFlag = 1;
}
if(KeyNum==3) {
switch(firstmenu){
case 1:{showTemp();}break;
case 2:{returnFlag = 0;choiceLevel();}break;
case 3:{motorConfigure();}break;
case 4:{if(mm()){configure();}}break;
case 5:{pid();}break;
default : break;
}
}
}
/*
void pid(){
unsigned char MotorCount1,MotorCount2,MotorCount3,mTnow;
float u;
char A,B,C;
A = 12;
B = -10;
C = 0;
// u = a*kp*(1+t/PIDA+PIDB/t)-b*kp*(1+2*PIDB/t)+c*kp*PIDB/t;
TempCount = 15;
MotorCount1 = eread_add(10);//now-1
MotorCount2 = eread_add(11);//now-2
MotorCount3 = eread_add(12);//now
//mTnow = Buff[4]*1000+(Buff[5]-10)*100+Buff[6]*10+Buff[7];
returnFlag = 0;
while(!returnFlag){
Key();
if(TempInput == 1 ){
temper();
Buff[4] = Buff[0];
Buff[5] = Buff[1];
Buff[6] = Buff[2];
Buff[7] = Buff[3];
TempInput = 0;
//sh = 1;
mTnow = Buff[4]*1000+(Buff[5]-10)*100+Buff[6]*10+Buff[7];
}
u = A*mTnow/100+MotorCount1*B+MotorCount2*C;
MotorCount = MotorCount3 + u;
MotorCount2 = MotorCount1;
MotorCount1 = MotorCount;
if(KeyNum == 2){
returnFlag = 1;
//MotorCount =0;
}
}
ewrite_add(10,MotorCount1);
ewrite_add(11,MotorCount2);
ewrite_add(12,MotorCount3);
}
*/
/*
void run(void){
clean();
if(count(0,3,0x93)==0){
clean();
KeyCount1 = 0;
}
func(KeyCount1);
}
void func(int ifunc){
switch(ifunc){
case 0: {
Buff[4] = 28;Buff[5] = 26;Buff[6] = 27; display(Buff);
temper();
break;
}; //tp-
case 1: {
Buff[4] = 30;Buff[5] = 31;Buff[6] = 32;Buff[7] = 27; display(Buff);
KeyCount1 = 1;
choiceLevel();
break;}; //run-
case 2: {
Buff[4] = 22;Buff[5] = 33;Buff[6] = 32;Buff[7] = 27; display(Buff);
motorConfigure();
break;}; //con-
case 3: {
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27; display(Buff);
configure();
break;}; //pa-
default:
run();
}
}
*/
bit mm(){
unsigned char m1,m2,m3,m4;
returnFlag = 0;
Buff[4] = 27;Buff[5] = 27;Buff[6] = 27;Buff[7] = 27;
display(Buff);
if(!count(0,9,0x94)){
return returnFlag;
}else{
m1 = KeyCount1;
KeyCount1 = 0;
Buff[4] = m1;
display(Buff);
}
if(!count(0,9,0x95)){
return returnFlag;
}else{
m2 = KeyCount1;
KeyCount1 = 0;
Buff[5] = m2;
display(Buff);
}
if(!count(0,9,0x96)){
return returnFlag;
}else{
m3 = KeyCount1;
KeyCount1 = 0;
Buff[6] = m3;
display(Buff);
}
if(!count(0,9,0x97)){
return returnFlag;
}else{
m4 = KeyCount1;
KeyCount1 = 0;
Buff[7] = m4;
display(Buff);
}
if(pass[0]==m1 && pass[1]==m2 && pass[2]==m3 &&pass[3]==m4 ){
returnFlag = 1;
}
return returnFlag;
}
void temper(void){
unsigned char i;
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM 命令
DS1820_WriteData(0x44); //温度转换命令
DS1820_Reset(); //复位
DS1820_WriteData(0xcc); //跳过ROM 命令
DS1820_WriteData(0xbe); //读DS1820 温度暂存器命令
for (i=0;i<2;i++)
{
temperature[i]=DS1820_ReadData(); //采集温度
}
DS1820_Reset(); //复位,结束读数据
displayTemperature(); //显示温度值 存储温度
Buff[0] = eread_add(0);somenop25();
Buff[1] = eread_add(1)+10;somenop25();
Buff[2] = eread_add(2);somenop25();
Buff[3] = eread_add(3);somenop25();
// somenop50();
// display(Buff);
//Key();
//if(KeyNum==2){
//退出
//}
// Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
}
/*
void motor(void){
unsigned char i;
i = 60; //级别选择
runMotor(i); //启动电机并控制返回
while(1){
Key();
if(KeyNum==2){
run();
}
}
}
*/
/*
void runMotor(unsigned char i){
MotorCount = i*10;
MotorNow = 0;
TR0 = 1;
while(1);
}
*/
void choiceLevel(){
//KeyCount1 = 1;
while( !returnFlag ){
if(KeyCount1==10){
Buff[6] = 1;Buff[7] = 0;
}else{
Buff[6] = 29;Buff[7] = KeyCount1;
}
Buff[4] = 30;Buff[5] = 27;
display(Buff); //r- num
if(count(0,10,0x97)==0){
KeyCount1 = 0;
returnFlag = 1;
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
}else{
MotorCount = Level[KeyCount1];
if( MotorCount/100){
Buff[1] = MotorCount/100;
}else{Buff[1] = 29;}
if( !((MotorCount%100)/10) && Buff[1] == 29){
Buff[2] = 29;
}else{Buff[2] = (MotorCount%100)/10;}
Buff[0] = 29;Buff[3] = MotorCount%10;
}
}
}
void motorConfigure(void){
bit sh;
unsigned int mTnow,mTup,mTdown;
float mi;
TempCount = 15;
returnFlag = 0;
mTup = Tup[0]*1000+Tup[1]*100+Tup[2]*10+Tup[3];
mTdown = Tdown[0]*1000+Tdown[1]*100+Tdown[2]*10+Tdown[3];
while (!returnFlag) {
Key();
if(KeyNum==2){ returnFlag = 1;TempInput = 0;}
if(TempInput == 1 ){
temper();
Buff[4] = Buff[0];
Buff[5] = Buff[1];
Buff[6] = Buff[2];
Buff[7] = Buff[3];
TempInput = 0;
sh = 1;
mTnow = Buff[4]*1000+(Buff[5]-10)*100+Buff[6]*10+Buff[7];
}
if(mTup < mTnow){
MotorCount = 100;
Buff[0] = 29;Buff[1] = 1;Buff[2] = 0;Buff[3] = 0;
}else if(mTdown > mTnow){
MotorCount = 0;
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 0;
} else if(sh){
mi = 50 * (mTnow-mTdown)/(mTup-mTdown);
MotorCount = 50 + mi;
Buff[0] = 29;Buff[1] = 29;Buff[2] = (MotorCount%100)/10;Buff[3] = MotorCount%10;
}
display(Buff);
}
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
//TempCount = 0;
KeyNum = 0xff;
}
void configure(void){
bit secondmenu;
returnFlag = 0;
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 29;
while(!returnFlag){
Key();
if(KeyNum==1){
secondmenu = !secondmenu;
}
if(KeyNum==0){
secondmenu = !secondmenu;
}
if(KeyNum==2){
returnFlag = 1;
}
if(KeyNum==3) {
if(secondmenu){
parun();
}else{
pacon();
}
}
if(secondmenu){
Buff[1] = 30;Buff[2] = 31;Buff[3] = 32;Buff[0] = 29; // run
}else{
Buff[1] = 22;Buff[2] = 33;Buff[3] = 32;Buff[0] = 29; // con
}
display(Buff);
}
clean();
}
void parun(){
unsigned char mlevelvalue,mlevel ;
returnFlag = 0;
while(!returnFlag){
if(KeyCount1==10){
Buff[6] = 1;Buff[7] = 0;
}else{
Buff[6] = 29;Buff[7] = KeyCount1;
}
Buff[4] = 26;Buff[5] = 27;
display(Buff); //P- num
if(!count(0,10,0x97)){
KeyCount1 = 0;
returnFlag = 1;
}else{
mlevelvalue = Level[KeyCount1];
if( mlevelvalue/100){
Buff[1] = mlevelvalue/100;
}else{Buff[1] = 29;}
if( !((mlevelvalue%100)/10) && Buff[1] == 29){
Buff[2] = 29;
}else{Buff[2] = (mlevelvalue%100)/10;}
Buff[0] = 29;Buff[3] = mlevelvalue%10;
if(KeyCount1==10){
Buff[6] = 1;Buff[7] = 0;
}else{
Buff[6] = 29;Buff[7] = KeyCount1;
}
Buff[4] = 20;Buff[5] = 27;
display(Buff); //A- num
mlevel = KeyCount1;
KeyCount1 = mlevelvalue;
if(!count(0,100,0x93)){
KeyCount1 = 0;
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
// returnFlag = 1;
}else{
Level[mlevel] = KeyCount1;
ewrite_add(mlevel+20,KeyCount1);
KeyCount1 = 0;
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
}
}
}
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 29; //pa-
Buff[0] = 29;Buff[1] = 30;Buff[2] = 31;Buff[3] = 32; // run
returnFlag = 0;
}
void pacon(){
bit thirdmenu;
returnFlag = 0;
while(!returnFlag){
Key();
if(KeyNum==1){
thirdmenu = !thirdmenu;
}
if(KeyNum==0){
thirdmenu = !thirdmenu;
}
if(KeyNum==2){
returnFlag = 1;
}
if(KeyNum==3) {
if(thirdmenu){
paconb();
}else{
paconf();
}
}
if(thirdmenu){
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 21; //pa-b
Buff[0] = 29;
Buff[1] = 29;
Buff[2] = Tdown[0];
Buff[3] = Tdown[1]; //Tdown
}else{
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 25; //pa-f
Buff[0] = 29;
Buff[1] = 29;
Buff[2] = Tup[0];
Buff[3] = Tup[1]; //Tup
}
display(Buff);
}
Buff[4] = 26;Buff[5] = 20;Buff[6] = 27;Buff[7] = 29;
returnFlag = 0;
}
void paconb(){
Buff[4] = 20;Buff[5] = 27;Buff[6] = 29;Buff[7] = 21; //a- b
display(Buff);
returnFlag = 0;
KeyCount1 = Tdown[0]*10+Tdown[1];
if(!count(0,50,0x93)){
KeyCount1 = 0;
}else{
Tdown[0]=KeyCount1/10;
ewrite_add(4,Tdown[0]);somenop25();
Tdown[1]=KeyCount1%10;
ewrite_add(5,Tdown[1]);somenop25();
}
}
void paconf(){
Buff[4] = 20;Buff[5] = 27;Buff[6] = 29;Buff[7] = 25; //a- f
display(Buff);
returnFlag = 0;
KeyCount1 = Tup[0]*10+Tup[1];
if(!count(0,50,0x93)){
KeyCount1 = 0;
}else{
Tup[0]=KeyCount1/10;
ewrite_add(6,Tup[0]);somenop25();
Tup[1]=KeyCount1%10;
ewrite_add(7,Tup[1]);somenop25();
}
}
void clean(void){
unsigned char i;
for(i=0;i<8;i++)
Buff[i] = 0x1D;
display(Buff);
}
//返回1确认,0退出
bit count(int min,int max,unsigned char w2){
bit f,s;
unsigned char ten;
ten = 0;
f = max/100;
if(f==0){
s = max/10;
}else{
s = 1;
}
write_7279(0x90,LEDValue[29]);
while(1){
if( KeyCount1 > max){
KeyCount1 = min;
}else if(KeyCount1 < min){
KeyCount1 = max;
}
if(KeyCount1 > 9 && KeyCount1 < 100){
if(f){write_7279(w2-2,LEDValue[29]);}
write_7279(w2-1,LEDValue[KeyCount1 / 10]);
write_7279(w2,LEDValue[KeyCount1 % 10]);
}else if(KeyCount1 == 100){
if(f){write_7279(w2-2,LEDValue[1]);}
write_7279(w2-1,LEDValue[0]);
write_7279(w2,LEDValue[0]);
}else{
if(f){write_7279(w2-2,LEDValue[29]);}
if(s){write_7279(w2-1,LEDValue[29]);}
write_7279(w2,LEDValue[KeyCount1]);
}
Key();
if(KeyNum == 0){
KeyCount1--;
ten=0;
}else if(KeyNum == 1){
if(ten == 10){
KeyCount1+=10;
}else{
ten++;
KeyCount1++;
}
}else if(KeyNum == 3){
return 1;
}else if(KeyNum == 2){
return 0;
}
}
}
void write_7279(unsigned char cmd,unsigned char dta)
{
CS = 0;
somenop50();
somenop();
send_byte(cmd);
somenop25();
somenop();
send_byte(dta);
somenop();
somenop();
CS = 1;
}
void send_byte(unsigned char cmd)
{
unsigned char i;
somenop50();somenop50(); //时序初始延时
for(i = 0;i < 8;i++)
{ //写cmd的最高位,
if(cmd&0x80) // 最高位为1则写"1"
DATA = 1;
else // 最高位为0写"0"
DATA = 0;
// CLK形成下降沿,先1后0,注意延时时间要满足时序要求
CLK = 1; somenop10();somenop10();
CLK = 0; somenop10();somenop10();
//命令行左移,为写下一个位做准备
cmd = cmd << 1;
}
DATA = 0; //依照时序要求全部写完后Data清零
}
void Init_7279(void)
{
CS = 0;
somenop50();somenop50();
send_byte(0xA4);
somenop50();somenop50();
CS = 1;
}
void display(unsigned char buff[])
{
unsigned char i,j;
for( i=0x90,j=0 ; j<=7 ; i++,j++ )
write_7279(i, LEDValue[buff[j]]);
}
unsigned char ReadKey(void)
{
unsigned char readkey;
CS = 0;
somenop50();somenop50();
send_byte(0x15); //读键值命令15H
somenop25();somenop25();
readkey = receive_byte();
CS = 1;
return(readkey); //返回键值
}
unsigned char receive_byte(void)
{
unsigned char i, in_byte;
DATA=1;
somenop50();somenop50();
for (i=0;i<8;i++)
{
CLK=1;somenop10();somenop10();
//左移一位,空出最后一位存放新进来的位DATA
in_byte=in_byte*2;
//若新进来的位DATA为1,则in_byte的末位置1,否则不需要变
if (DATA)
in_byte=in_byte|0x01;
CLK=0; somenop10();somenop10();
}
DATA=0;
return (in_byte); //返回接收值
}
/*
void Key(void)
{
unsigned char temp,i;
temp = ReadKey(); //读键值
if (temp==0xff)
{
KeyNum = 0xff;
KeyValue = 0xff;
}
else
{
if(KeyValue!=0xff)
KeyNum=0xff;
else
{
KeyValue = temp;
for(i=0;i<=3;i++)
if (KeyValue == KeyTable[i])
{ KeyNum = i; break; }
}
}
}
*/
void Key(void)
{
unsigned char i,temp;
unsigned int Press_CNT;
temp = ReadKey();
if(temp==0xFF){
KeyNum = 0xFF;
KeyValue = 0xFF;
}else{
if(KeyValue!=0xff){
// KeyNum=0xff;
if(Press_CNT < 0xfff)
{
Press_CNT ++;
KeyNum = 0xFF;
}
if(Press_CNT >= 500)//调用时间间隔确定
{
Press_CNT -= 50;
for(i=0;i<=1;i++){
if(KeyValue == KeyTable[i]){
KeyNum = i;
break;
}
}
}
}else{
KeyValue = temp;
for(i=0;i<=3;i++){
if(KeyValue == KeyTable[i]){
KeyNum = i;
Press_CNT = 0;
break;
}
}
}
}
}
bit DS1820_Reset()
{
bit flag;
DS1820_DQ = 0; //拉低总线
somenop100();somenop100();
somenop100();somenop100();
somenop50();somenop10();
somenop10();somenop10();
DS1820_DQ = 1; //释放总线
somenop50();somenop10();
somenop10();somenop10();
flag = DS1820_DQ; //对数据脚采样
somenop100();somenop100();
somenop100();somenop100();
return (flag);
}
void DS1820_WriteData(U8 wData)
{
U8 i;
for (i=8;i>0;i--)
{
DS1820_DQ = 0; //拉低总线,产生写信号
somenop();
DS1820_DQ = wData&0x01; //发送1 位
somenop50();somenop10();
DS1820_DQ = 1; //释放总线,等待总线恢复
wData>>=1; //准备下一位数据的传送
}
}
U8 DS1820_ReadData()
{
U8 i,TmepData;
for (i=8;i>0;i--)
{
TmepData>>=1;
DS1820_DQ = 0; //拉低总线,产生读信号
somenop();
DS1820_DQ = 1; //释放总线,准备读数据
somenop();somenop();
if (DS1820_DQ == 1)
{ TmepData |= 0x80;}
somenop50(); somenop10();
DS1820_DQ = 1; //拉高总线,准备下一位数据的读取.
}
return (TmepData);//返回读到的数据
}
void displayTemperature(){
// int Tnow,Told;
U8 temp_data,temp_data_2;
U8 temp[7]; //存放分解的7 个ASCII 码温度数据
U8 TempDec; //用来存放4 位小数
temp_data = temperature[1];
temp_data &= 0xf0; //取高4 位
if (temp_data==0xf0) //判断是正温度还是负温度读数
{
//负温度读数求补,取反加1,判断低8 位是否有进位
if (temperature[0]==0)
{ //有进位,高8 位取反加1
temperature[0]=~temperature[0]+1;
temperature[1]=~temperature[1]+1;
}
else
{ //没进位,高8 位不加1
temperature[0]=~temperature[0]+1;
temperature[1]=~temperature[1];
}
}
temp_data = temperature[1]<<4; //取高字节低4 位(温度读数高4 位),注意此时是12 位精度
temp_data_2 = temperature[0]>>4; //取低字节高4 位(温度读数低4 位),注意此时是12 位精度
temp_data = temp_data|temp_data_2; //组合成完整数据
//temp[0] = temp_data/100; //取百位转换为ASCII 码
temp[1] = (temp_data%100)/10; //取十位转换为ASCII 码
temp[2] = (temp_data%100)%10; //取个位转换为ASCII 码
temperature[0]&=0x0f; //取小数位转换为ASCII 码
TempDec = temperature[0]*6.25; //625=0.0625*10000,表示小数部分,扩大1 万倍 ,方便显示
temp[3] = (TempDec %100)/10; //取小数十分位转换为ASCII 码
temp[4] = TempDec % 10; //取小数百分位转换为ASCII 码
/*Buff[0] = temp[1];Buff[1] = temp[2]+10;Buff[2] = temp[3];Buff[3] = temp[4];
display(Buff); */
//if(temp[1]<4 && temp[1] > 0){
//Tnow = temp[1]*1000+temp[2]*100+temp[3]*10+temp[4];
//Told = eread_add(0)*1000+eread_add(1)*100+eread_add(2)*10+eread_add(3);
//if(!(Tnow - Told >= 100 || Told - Tnow <= 100)){
if(temp[1]<4 && temp[1] > 0){
ewrite_add(0,temp[1]); somenop25();
ewrite_add(1,temp[2]); somenop25();
ewrite_add(2,temp[3]); somenop25();
ewrite_add(3,temp[4]); somenop25();
}
// }
//}
//display(Buff);
/*
// temp[5] = ((TempDec%1000)%100)/10+0x30;//取小数千分位转换为ASCII 码
// temp[6] = ((TempDec%1000)%100)%10+0x30;//取小数万分位转换为ASCII 码
if(temp[0]==0x30) DisplayChar(3,0,' ');//如果百位为0,显示空格
else DisplayChar(3,0,temp[0]); //否则正常显示百位
DisplayChar(4,0,temp[1]);//十位
DisplayChar(5,0,temp[2]);//个位
DisplayChar(6,0,0x2e); //小数点 .
DisplayChar(7,0,temp[3]);
DisplayChar(8,0,temp[4]);
DisplayChar(9,0,temp[5]);
DisplayChar(10,0,temp[6]);
DisplayChar(11,0,'\''); //显示'
DisplayChar(12,0,'C'); //显示C
*/
}
void showTemp(){
TempCount = 15;
returnFlag = 0;
while (!returnFlag) {
Key();
if(KeyNum==2){ returnFlag = 1;TempInput = 0;}
if(TempInput == 1 ){
temper();
TempInput = 0;
}
display(Buff);
}
Buff[0] = 29;Buff[1] = 29;Buff[2] = 29;Buff[3] = 29;
//TempCount = 0;
//TempInput = 0;
}
void estart() //起始信号 当时钟线为1,数据线有个下降沿
{
ECLK=1;
EDTA=1;
somenop();
EDTA=0;
ECLK=0;
somenop();
}
void estop()//终止信号 当时钟线为1,数据线有个上升沿
{
EDTA=0;
ECLK=1;
somenop();
EDTA=1;
ECLK=0;
somenop();
}
bit ack() //应答信号由从机发出信号为sda由1变为0
{
ECLK=1;
EDTA=1;
if(EDTA==1){
ECLK=0;
return 1;
}else{
ECLK=0;
return 0;
}
}
void init_24c16()//24c16初始化
{
EDTA=1;
somenop();
ECLK=1;
somenop();
}
void ewrite_byte(unsigned char dat) //字节写(写数据或地址)数据线sda不变,scl有个上升沿,写入数据
{
unsigned char i;
for(i=0;i<8;i++)
{
ECLK=0;
somenop();
EDTA=dat&0x80;
somenop();
ECLK=1;
somenop();
dat <<= 1;
}
ECLK=0;
somenop();
}
unsigned char eread_byte() //字节读 scl有下降沿读出
{
unsigned char i,k;
for(i=0;i<8;i++)
{
ECLK=1;
somenop();
k=(k<<1)|EDTA;
ECLK=0;
somenop();
}
return k;
}
void ewrite_add(unsigned char add,unsigned char dat)
{
do{
estart();
ewrite_byte(0xa0);
}
while(ack());
ewrite_byte(add);
ack();
do{
ewrite_byte(dat);
}
while(ack());
estop();
}
unsigned char eread_add(unsigned char add)
{
unsigned char dat;
do{
estart();
ewrite_byte(0xa0);
}
while(ack());
ewrite_byte(add);
ack();
do{
estart();
ewrite_byte(0xa1);
}
while(ack());
dat=eread_byte();
estop();
return dat;
}
void pid(){
unsigned char mTnow;
TempCount = 15;
returnFlag = 0;
while(!returnFlag){
if(TempInput == 1 ){
temper();
Buff[4] = Buff[0];
Buff[5] = Buff[1];
Buff[6] = Buff[2];
Buff[7] = Buff[3];
TempInput = 0;
mTnow = Buff[4]*10+(Buff[5]-10);
e1 = mTnow - Tset;
duk = (kp+ki+kd)*e1 - (kp + 2*kd)*e2 + kd * e3;
MotorCount = MotorCount + duk;
if(MotorCount > 100) MotorCount = 100;
else if (MotorCount < 50) MotorCount = 50;
e2 = e1;
e3 = e2;
if( MotorCount == 100){
Buff[4] = 29;
Buff[5] = 1;
Buff[6] = 0;
Buff[7] = 0;
}else{
Buff[4] = 29;
Buff[5] = 29;
Buff[6] = MotorCount/10;
Buff[7] = MotorCount%10;
}
}
display(Buff);
Key();
if(KeyNum == 2){
returnFlag = 1;
Buff[0] = 29;
Buff[1] = 29;
Buff[2] = 29;
Buff[3] = 29;
display(Buff);
MotorCount = 0;
TempInput = 0;
//TempCount = 0;
}
}
}
/*
void pid(){
unsigned char MotorCount1,MotorCount2,MotorCount3,mTnow;
// int e1,e2,e3;
char A,B,C;
bit sh;
// e1 = 0;
// e2 = 0;
// e3 = 0;
A = 12;
B = -10;
C = 0;
// u = a*kp*(1+t/PIDA+PIDB/t)-b*kp*(1+2*PIDB/t)+c*kp*PIDB/t;
TempCount = 15;
MotorCount1 = eread_add(10);//now-1
MotorCount2 = eread_add(11);//now-2
MotorCount3 = eread_add(12);//now
//mTnow = Buff[4]*1000+(Buff[5]-10)*100+Buff[6]*10+Buff[7];
//Tset = eread_add(13);
returnFlag = 0;
while(!returnFlag){
Key();
if(KeyNum == 2){
returnFlag = 1;
Buff[4] = 29;
Buff[5] = 29;
Buff[6] = 29;
Buff[7] = 29;
display(Buff);
//MotorCount =0;
}
if(TempInput == 1 ){
temper();
Buff[4] = Buff[0];
Buff[5] = Buff[1];
Buff[6] = Buff[2];
Buff[7] = Buff[3];
TempInput = 0;
mTnow = Buff[4]*10+(Buff[5]-10);
MotorCount = MotorCount3 + A*mTnow+MotorCount1*B+MotorCount2*C - Tset;
if( MotorCount/10 > 9){
Buff[4] = 29;
Buff[5] = 1;
Buff[6] = 0;
Buff[7] = 0;
}else if(MotorCount/10 < 3){
Buff[4] = 29;
Buff[5] = 29;
Buff[6] = 3;
Buff[7] = 0;
}else{
Buff[4] = 29;
Buff[5] = 29;
Buff[6] = MotorCount/10;
Buff[7] = MotorCount%10;
}
}
display(Buff);
MotorCount2 = MotorCount1;
MotorCount1 = MotorCount;
}
ewrite_add(10,MotorCount1);
ewrite_add(11,MotorCount2);
ewrite_add(12,MotorCount3);
}
*/
void timer0(void) interrupt 1 using 3
{
TH0 = 0xFC;
TL0 = 0x66;
if(MotorNow < MotorCount){
Motor = 1;
MotorNow++;
P2 = 0x00;
}else if(MotorNow >= MotorCount && MotorNow <= 100){
Motor = 0;
P2 = 0x02;
MotorNow++;
}else{
MotorNow=0;
}
}
void timer1(void) interrupt 3 using 2
{
TH0 = 0xDC;
TL0 = 0x00;
if(TempNow != TempCount){
TempNow++;
}else if(TempNow >= TempCount && TempNow != 0){
TempInput = 1;
TempNow = 0;
}
}