仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*
- P1口三个led灯代表模式:
- 模式1:开始记录
- 模式2:查看记录 按s3下一条 s4下一条
- 模式3:时间矫正 按s2选择矫正位 按s3加一 按s4减一 led
- 注:p33口低电平触发记录; 调整实践时时钟停止 可存储十条记录,自动清除最旧记录
- */
- #include<reg52.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit du=P2^6;
- sbit we=P2^7;
- sbit s2=P3^0;
- sbit s3=P3^1;
- sbit s4=P3^2;
- sbit led1=P1^7;
- sbit led2=P1^6;
- sbit led3=P1^5; //模式状态灯
- uchar temp0;//P1口状态存储
- uint temp;//秒调整
- uchar ii,ii2; //中断存储循环用
- uchar Mode=1;//模式选择
- uchar num=1; //记录调出值
- uchar time[10][4]; //鸡蛋时间记录储存
- double timeh,timem,times; //系统时间
- uchar code ld[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
- void display(uchar i,uchar j,uchar k,uchar l);
- void delay(uint z);
- void inti()
- {
- EA=1;//总开关
- EX1=1;//int1中断 p33口
- IT1=0;//触发方式:低电平
- ET0=1;//定时器0中断允许
- TMOD=0x01;//模式选择;//定时器0,1,16位定时器
- TH0=0x4b;
- TL0=0xfe;//50ms
- TR0=1;
- }
- void main()
- {
- inti(); //初始化配置
- while(1)
- {
- if(s2==0)
- {
- Mode++;
- if(Mode==6)Mode=1;
- if(!(Mode==1||Mode==2))ET0=0;
- if(Mode==1||Mode==2)ET0=1;
- while(!s2);
- delay(100);
- } //模式选择
- if(Mode==1)//模式1 工作模式显示时间
- {
- display(100,timeh,timem,times);
- led1=0;led2=1;led3=1;
- }
- if(Mode==2)//模式2 查询
- {
- led1=1;led2=0;led3=1;
- if(s3==0)
- {
- num++;
- if(num==11)num=10;//防止查询溢出
- while(!s3);
- delay(100);
- }
- if(s4==0)
- {
- num--;
- if(num==0)num=1;//防止查询溢出
- while(!s4);
- delay(100);
- }
- display(num,time[num-1][0],time[num-1][1],time[num-1][2]);
- }
- if(Mode==3)//模式3 时间矫正 时
- {
- led1=1;led2=1;led3=0;
- if(s3==0)
- {
- timeh++;
- if(timeh==24)timeh=0;
- if(timeh<0)timeh=23;
- while(!s3);
- delay(100);
- }
- if(s4==0)
- {
- timeh--;
- if(timeh==24)timeh=0;
- if(timeh<0)timeh=23;
- while(!s4);
- delay(100);
- }
- display(100,timeh,100,100);
- }
- if(Mode==4)//模式3 时间矫正 分
- {
- led1=1;led2=1;led3=0;
- if(s3==0)
- {
- timem++;
- if(timem==60)timem=0;
- if(timem<0)timem=59;
- while(!s3);
- delay(100);
- }
- if(s4==0)
- {
- timem--;
- if(timem==60)timem=0;
- if(timem<0)timem=59;
- while(!s4);
- delay(100);
- }
- display(100,100,timem,100);
- }
- if(Mode==5)//模式3 时间矫正 秒
- {
- led1=1;led2=1;led3=0;
- if(s3==0)
- {
- times++;
- if(times==60)times=0;
- if(times<0)times=59;
- while(!s3);
- delay(100);
- }
- if(s4==0)
- {
- times--;
- if(times==60)times=0;
- if(times<0)times=59;
- while(!s4);
- delay(100);
- }
- display(100,100,100,times);
- }
- }
- }
- void timer0() interrupt 1
- {
- temp++;
- TH0=0x4b;
- TL0=0xfe; //50ms进入一次
- if(temp==20)
- {
- times++;
- temp=0;
- }
- if(times==60)
- {
- timem++;
- times=0;
- }
- if(timem==60)
- {
- timeh++;
- timem=0;
- }
- if(timeh==24)
- {
- timeh=0;
- } //时间计算
- }
- void int1() interrupt 2 //p33口
- {
- for(ii=0;ii<10;ii++)
- {
- for(ii2=0;ii2<3;ii2++)
- {
- time[9-ii][ii2]=time[8-ii][ii2];
- }
- }
- time[0][0]=timeh;
- time[0][1]=timem;
- time[0][2]=times;//存储数据
- temp0=P1;
- P1=0;//中断响应
- delay(1000);
- P1=temp0;
- }
- void display(uchar i,uchar j,uchar k,uchar l)
- {
-
- uchar shi1,ge1,shi2,ge2,shi3,ge3,shi4,ge4;
- if(i<100)
- {
- shi1=i/10;
- ge1=i%10;
- }
- else
- {
- shi1=ge1=10;
- }
- if(j<100)
- {
- shi2=j/10;
- ge2=j%10;
- }
- else
- {
- shi2=ge2=10;
- }
- if(k<100)
- {
- shi3=k/10;
- ge3=k%10;
- }
- else
- {
- shi3=ge3=10;
- }
- if(l<100)
- {
- shi4=l/10;
- ge4=l%10;
- }
- else
- {
- shi4=ge4=10;
- }
- P0=0xff; //清除段码
- we=1;
- P0=0xfe;//1111 1110
- we=0;//第一次位选
-
- du=1;
- P0=ld[shi1];
- du=0;
- delay(1);//第一次段选
- P0=0xff; //清除段码
- we=1;
- P0=0xfd;//1111 1101
- we=0;//第二次位选
- du=1;
- P0=ld[ge1];
- du=0;
- delay(1);//第二次段选
- P0=0xff; //清除段码
- we=1;
- P0=0xfb;//1111 1011
- we=0;//第一次位选
-
- du=1;
- P0=ld[shi2];
- du=0;
- delay(1);//第一次段选
- P0=0xff; //清除段码
- we=1;
- P0=0xf7;//1111 0111
- we=0;//第二次位选
- du=1;
- P0=ld[ge2];
- du=0;
- delay(1);//第二次段选
- P0=0xff; //清除段码
- we=1;
- P0=0xef;//1110 1111
- we=0;//第一次位选
-
- du=1;
- P0=ld[shi3];
- du=0;
- delay(1);//第一次段选
- P0=0xff; //清除段码
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
proteus仿真51开发板.zip
(35.92 KB, 下载次数: 25)
程序.zip
(33.62 KB, 下载次数: 37)
|