程序格式不对,我重发一遍,大家见谅,见怪不怪- #include <reg52.h> //51芯片管脚定义头文件
- #define uchar unsigned char
- #define uint unsigned int
- uchar code zheng[8]={0x01,0x03,0x02,0x06,0x04,0x0c,0x08,0x09};
- uchar code fan[8]={0x09,0x08,0x0c,0x04,0x06,0x02,0x03,0x01};
- sbit key1 = P3^0; //正转
- sbit key2 = P3^1; //反转----按键分时复用
- sbit key3 = P3^2; //停止
- sbit key4 = P3^3; //时间调整按钮
- sbit beep=P2^3; sbit dsds=P2^4;
- sbit dsrw=P2^2; sbit dsas=P2^1;
- sbit dscs=P2^0; sbit irq=P3^3;
- sbit rd=P3^7; sbit guang_dq=P3^6;//光敏电阻输出
- sbit DQ=P2^5;//ds18b20与单片机连接口
- sbit lcden=P3^4;sbit lcdrs=P3^5;
- sbit dula=P2^6;sbit wela=P2^7;
- char shi,fen,miao,nian,yue,ri;
- uchar num,flag,flag1,flag_ting,count;
- uint temp,aa;//温度值
- uchar tflag;//温度正负标志
- uchar code table[]=" : : T: ";
- uchar code table1[]="20 - - L: G";
- void write_ds(uchar,uchar);
- uchar read_ds(uchar);
- uchar set_alarm(uchar,uchar,uchar);
- uchar read_time(uchar);
- void delay(uint z)//延时函数--1ms
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
- void didi()
- {
- beep=0;
- delay(200);
- beep=1;
- }
- void wr_com(uchar com)//写指令//
- {
- delay(1);
- lcdrs=0;
- lcden=0;
- P0=com;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void wr_data(uchar date)//写数据//
- {
- delay(1);
- lcdrs=1;
- lcden=0;
- P0=date;
- delay(1);
- lcden=1;
- delay(1);
- lcden=0;
- }
- void init()//初始化设置//
- {
- beep=1;
- EA=1;
- TMOD=0x01;
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- ET0=1;
- TR0=1;
- rd=0;
- dula=0;
- wela=0;
- wr_com(0x38);
- wr_com(0x0c);
- wr_com(0x04);
- wr_com(0x01);
- wr_com(0x80);
- for(num=0;num<15;num++)
- {
- wr_data(table[num]);
- delay(20);
- }
- wr_com(0x80+0x40);
- for(num=0;num<16;num++)
- {
- wr_data(table1[num]);
- delay(20);
- }
- }
- /////////////写时分秒
- void write_sfm(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- wr_com(0x80+add);
- wr_data(0x30+shi);
- wr_data(0x30+ge);
- }
- /////////////写年月日
- void write_nyr(uchar add,uchar date)
- {
- uchar shi,ge;
- shi=date/10;
- ge=date%10;
- wr_com(0x80+0x40+add);
- wr_data(0x30+shi);
- wr_data(0x30+ge);
- }
- ///////////12c887写一位
- void write_ds(uchar add,uchar date)
- {
- dsas=1;
- dsds=1;
- dsrw=1;
- dscs=0;
- P0=add;
- dsas=0;
- dsrw=0;
- P0=date;
- dsrw=1;
- dscs=1;
- dsas=1;
- }
- ///////////12c887读一位
- uchar read_ds(uchar add)
- {
- uchar data_ds;
- dsas=1;
- dsds=1;
- dsrw=1;
- dscs=0;
- P0=add;
- dsas=0;
- dsds=0;
- P0=0xff;
- data_ds=P0;
- dsds=1;
- dscs=1;
- dsas=1;
- return data_ds;
- }
- /***************************ds18b20程序****************************/
- void delay_18B20(uint i)//延时1微秒
- {
- while(i--);
- }
- void ds1820rst()/*ds1820复位*/
- {
- DQ = 1; //DQ复位
- delay_18B20(4); //延时
- DQ = 0; //DQ拉低
- delay_18B20(100); //精确延时大于480us
- DQ = 1; //拉高
- delay_18B20(30);
- }
- uchar ds1820rd()/*读数据*/
- {
- uchar i=0;
- uchar dat = 0;
- for (i=8;i>0;i--)
- {
- DQ = 0; //给脉冲信号
- dat>>=1;
- DQ = 1; //给脉冲信号
- if(DQ)
- dat|=0x80;
- delay_18B20(10);
- }
- return(dat);
- }
- void ds1820wr(uchar wdata)/*写数据*/
- {
- uchar i=0;
- for (i=8; i>0; i--)
- {
- DQ = 0;
- DQ = wdata&0x01;
- delay_18B20(10);
- DQ = 1;
- wdata>>=1;
- }
- }
- uint read_temp()/*读取温度值并转换*/
- {
- uint a,b;
- ds1820rst();
- ds1820wr(0xcc);//*跳过读序列号*/
- ds1820wr(0x44);//*启动温度转换*/
- ds1820rst();
- ds1820wr(0xcc);//*跳过读序列号*/
- ds1820wr(0xbe);//*读取温度*/
- a=ds1820rd();
- b=ds1820rd();
- temp=b;
- temp<<=8;
- temp=temp|a;
- if(temp<0x08ff)
- tflag=0;
- else
- {
- temp=~temp+1;
- tflag=1;
- }
- temp=temp*(0.0625)*100+0.5;//温度值扩大10倍,精确到liang位小数
- return temp;
- }
- void display_real_temp(uint temp)//实时温度显示函数
- {
- uchar datas[] = {0, 0, 0, 0}; //定义数组
-
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- datas[2] = temp % 100 / 10;
-
- wr_com(0x80+0x0b); //写地址 80表示初始地址
- wr_data('0'+datas[0]); //十位
-
- wr_com(0x80+0x0c); //写地址 80表示初始地址
- wr_data('0'+datas[1]); //个位
- wr_com(0x80+0x0d); //写地址 80表示初始地址
- wr_data(0x20+14); //个位
-
- wr_com(0x80+0x0e); //写地址 80表示初始地址
- wr_data('0'+datas[2]); //显示小数点
- wr_com(0x80+0x0f); //写地址 80表示初始地址
- wr_data(0x60+3); //显示C
-
- }
- /********************************************************
- 步进电机正转
- *********************************************************/
- void motor_zheng()
- {
- uchar i;
- for (i=0; i<8; i++) //一个周期转45度
- {
- P1 = zheng[i]; //取数据
- delay(1); //调节转速
- }
- }
- /********************************************************/
- /*步进电机反转
- /********************************************************/
- void motor_fan()
- {
- uchar i;
- for (i=0; i<8; i++) //一个周期转45度1
- {
- P1 = fan[i]; //取数据
- delay(1); //调节转速
- }
- }
- //////////////手动按键控制
- void shoudong()
- {
- uchar r,N=1; //N 步进电机运转圈数 因为我们的步进电机是减速步进电机 减速比是1/64 所以这里N=64时 步进电机外部的主轴转1圈
- if(key1==0)
- {
- delay(10);
- if(key1==0)
- {
- if(!key1);
- wr_com(0x80+0x40+15);
- wr_data('Z');
- while(1)
- {
- for(r=0;r<N;r++)
- {
- motor_zheng(); //电机正转
- }
- if(key3==0)
- break; //退出此循环程序
- if(key2==0)
- break;
- }
- }
- }
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(!key2);
- wr_com(0x80+0x40+15);
- wr_data('F');
- while(1)
- {
- for(r=0;r<N;r++)
- {
- motor_fan(); //电机反转
- }
- if(key3==0)
- break; //退出此循环程序
- if(key1==0)
- break;
- }
- }
- }
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(!key3);
- wr_com(0x80+0x40+15);
- wr_data('G');
- P1=0xf0;
- }
- }
- }
- /////////////电机自动正转
- void zidong_zheng()
- {
- //uchar i,j
- while(1)
- {
- motor_zheng();
- }
- }
- /////////////电机自动反转
- void zidong_fan()
- {
- //uchar r,N=1;
- while(1)
- {
- motor_fan();
- }
- }
- void keyscan()
- {
- uchar keynum;
- if(key4==0)//----加和减都是在第一个按键按下情况下进行的
- {
- delay(10);//按键消抖----有按键操作就需要消抖--还需要进行松手检测
- if(key4==0)//第一个按键
- {
- flag=1;
- keynum++;
- if(keynum==1)//第一次按键--操作秒---即光标的位置<操作对象>
- {
- while(!key4);
- wr_com(0x80+6);//指令执行位置
- wr_com(0x0f);//光标闪烁
- }
- if(keynum==2)//第二次按键--操作分
- {
- while(!key4);
- wr_com(0x80+3);
- wr_com(0x0f);
- }
- if(keynum==3)//第三次按键--操作时
- {
- while(!key4);
- wr_com(0x80);
- wr_com(0x0f);
- }
- if(keynum==4)//第4次按键--操作日
- {
- while(!key4);
- wr_com(0x80+0x40+8);
- wr_com(0x0f);
- }
- if(keynum==5)//第5次按键--操作月
- {
- while(!key4);
- wr_com(0x80+0x40+5);
- wr_com(0x0f);
- }
- if(keynum==6)//第6次按键--操作年
- {
- while(!key4);
- wr_com(0x80+0x40+2);
- wr_com(0x0f);
- }
- if(keynum==7)//第7次按键一--回复操作前状态
- {
- while(!key4);
- keynum=0;
- wr_com(0x0c);
- flag=0;//DS12C887正常运行---并将修改过的值写进芯片-----这句不加不能进入设置
- write_ds(0,miao);
- write_ds(2,fen);
- write_ds(4,shi);
- write_ds(7,ri);
- write_ds(8,yue);
- write_ds(9,nian);
- }
- }
- }
- //////////////时间调整---加
- if(keynum!=0)
- {
- if(key2==0)
- {
- delay(10);
- if(key2==0)
- {
- if(keynum==1)
- {
- while(!key2);
- miao++;
- if(miao==60)
- miao=0;
- write_sfm(6,miao);
- wr_com(0x80+6);
- }
- if(keynum==2)
- {
- while(!key2);
- fen++;
- if(fen==60)
- fen=0;
- write_sfm(3,fen);
- wr_com(0x80+3);
- }
- if(keynum==3)
- {
- while(!key2);
- shi++;
- if(shi==24)
- shi=0;
- write_sfm(0,shi);
- wr_com(0x80);
- }
- if(keynum==4)
- {
- while(!key2);
- ri++;
- if(ri==32)
- ri=1;
- write_nyr(8,ri);
- wr_com(0x80+0x40+8);
- }
- if(keynum==5)
- {
- while(!key2);
- yue++;
- if(yue==13)
- yue=1;
- write_nyr(5,yue);
- wr_com(0x80+0x40+5);
- }
- if(keynum==6)
- {
- while(!key2);
- nian++;
- if(nian==100)
- nian=0;
- write_nyr(2,nian);
- wr_com(0x80+0x40+2);
- }
- }
- }
- //////////////时间调整---减
- if(key3==0)
- {
- delay(10);
- if(key3==0)
- {
- if(keynum==1)
- {
- while(!key3);
- miao--;
- if(miao==-1)
- miao=59;
- write_sfm(6,miao);
- wr_com(0x80+6);
- }
- if(keynum==2)
- {
- while(!key3);
- fen--;
- if(fen==-1)
- fen=59;
- write_sfm(3,fen);
- wr_com(0x80+3);
- }
- if(keynum==3)
- {
- while(!key3);
- shi--;
- if(shi==-1)
- shi=23;
- write_sfm(0,shi);
- wr_com(0x80);
- }
- if(keynum==4)
- {
- while(!key3);
- ri--;
- if(ri==0)
- ri=31;
- write_nyr(8,ri);
- wr_com(0x80+0x40+8);
- }
- if(keynum==5)
- {
- while(!key3);
- yue--;
- if(yue==0)
- yue=12;
- write_nyr(5,yue);
- wr_com(0x80+0x40+5);
- }
- if(keynum==6)
- {
- while(!key3);
- nian--;
- if(nian==-1)
- nian=99;
- write_nyr(2,nian);
- wr_com(0x80+0x40+2);
- }
- }
- }
- }
- }
- /********************************************************
- * 主程序
- *********************************************************/
- void main()
- {
- //uchar i;
- init();
- while(1)
- {
- keyscan();
- if((guang_dq==1)&&(aa<200))//----------问题在这,程序一直在这循环
- {
- zidong_zheng();
- }
- didi();
- delay(200);
- P1=0xf0;
- flag=0;
- if(flag==0)
- {
- read_temp();
- display_real_temp(temp);
- shoudong();
- miao=read_ds(0);
- fen=read_ds(2);
- shi=read_ds(4);
- ri=read_ds(7);
- yue=read_ds(8);
- nian=read_ds(9);
-
- write_sfm(6,miao);
- write_sfm(3,fen);
- write_sfm(0,shi);
- write_nyr(8,ri);
- write_nyr(5,yue);
- write_nyr(2,nian);
- }
- }
- }
- void timer0() interrupt 1 //定时器---程序复杂--为了不影响时钟的反应速度--在定时器内完成这些操作
- {
-
- TH0=(65536-50000)/256;
- TL0=(65536-50000)%256;
- aa++;
-
- }
-
复制代码 |