可單鍵實現(xiàn)三種功能的切換: 1、 電子時鐘: 初始顯示時間為23-59-55,正常走時,2個按鍵調(diào)整時、分 功能, 按鍵1選擇的調(diào)整內(nèi)容以閃爍表示,按鍵2具備長按連續(xù)加1功能。 操作過程中顯示穩(wěn)定,單次按鍵調(diào)整不出現(xiàn)數(shù)字跳變情形(防抖)。 后臺走時:切換至其他功能,仍能后臺正確走時。 2、 跑表 顯示格式為000.0,計時單位為0.1秒,范圍為0.1秒~999.9秒 后臺計時:計時中的跑表,切換至其他功能,后臺計時繼續(xù)。 單鍵實現(xiàn)啟動、停止、清零功能 3、 簡易直流電壓表: 直流電壓由信號源或直流源給出,范圍0.2v~2.5v; 按鍵校準:測量儀器給出標準1v電壓,可用按鍵校準自身顯示; 自動穩(wěn)定顯示直流電壓;1.1v~2.5v范圍內(nèi)任測1個電壓值,誤差<2%; 0.2~1v范圍內(nèi),任測1電壓值,誤差<1%,且顯示基本穩(wěn)定。 芯片:TLC2543、lcd1602、51 內(nèi)含:protues仿真電路圖
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
QQ截圖20170803174900.png (32.99 KB, 下載次數(shù): 59)
下載附件
2017-8-3 17:49 上傳
0.png (61.62 KB, 下載次數(shù): 58)
下載附件
2017-8-3 22:14 上傳
單片機源程序如下:
- #include<reg51.h>
- #include "lcd.h"
- #include "TLC2543.h"
- #define uchar unsigned char
- #define uint unsigned int
- #define d0 0x80
- #define d1 0xc0
- sbit s1=P1^0; //按鍵1:進入時鐘設置,再按進入秒表界面,再按進入電壓表界面
- sbit s5=P1^4; //時鐘下:時分秒的選擇(第四次確認設置);秒表下:啟動、停止、清零
- sbit s6=P1^5; //時鐘下:加1,長按停頓后連續(xù)加1
- uchar count=0,count1=0,s=23,f=59,m=55;
- uchar ss1=0,t0,t1,n=0;
- uchar code tab2[]=" 000.0";
- uchar code tab3[]=" 0.000";
- float p=0;
- void delay(uint c);
- void button0();
- void button1();
- void button2();
- void main()
- {
- LcdInit();
- while(1)
- {
- if(s1==0)
- {
- delay(5);
- if(s1==0) {while(!s1);ss1++;button0();}
- }
- LcdWriteSg(d1,2,s);
- LcdWriteSg(d1,5,f);
- LcdWriteSg(d1,8,m);
- }
- }
- //子函數(shù)
- void delay(uint x)
- {
- uint i;
- while(x--)
- for(i=0;i<110;i++);
- }
- void button0()
- {
- LcdWriteCom(d1+6);
- LcdWriteCom(0x0f); //開光標
- while(1)
- {
- if(ss1==0) return;
- if(s5==0)
- {
- delay(5);
- if(s5==0)
- {
- while(!s5);
- ss1++;
- if(ss1==2)
- {
- LcdWriteCom(d1+3); //在時鐘時個位光標閃爍
- }
- if(ss1==3)
- {
- ss1=0; //取消設置
- LcdWriteCom(0x0c); //整體顯示開、光標關、光標不閃爍
- return;
- }
- }}
- if(ss1!=0)
- {
- if(s6==0)
- {
- delay(5);
- if(s6==0)
- {
- delay(850);
- if(s6)
- {
- if(ss1==1)
- {
- f++;
- if(f==60) f=0;
- LcdWriteSg(d1,5,f);
- LcdWriteCom(d1+6);
- }
- if(ss1==2)
- {
- s++;
- if(s==24) s=0;
- LcdWriteSg(d1,2,s);
- LcdWriteCom(d1+3);
- }
- }
- while(!s6){
- if(ss1==1)
- {
- f++;
- if(f==60) f=0;
- LcdWriteSg(d1,5,f);
- LcdWriteCom(d1+6);
- }
- if(ss1==2)
- {
- s++;
- if(s==24) s=0;
- LcdWriteSg(d1,2,s);
- LcdWriteCom(d1+3);
- }
- delay(100);
- }
- }
- }
- }
- if(s1==0)
- {
- delay(5);
- if(s1==0){while(!s1);ss1=0;button1();}
- }
- }
- }
- void button1()
- {
- uchar i;
- LcdWriteCom(0x0c);
- LcdWriteCom(0x01);
- LcdWriteCom(0x80);
- for(i=0;i<7;i++)
- {
- LcdWriteData(tab2[i]);
- delay(5);
- }
- while(1){
- if(s5==0 && n==0)
- {
- delay(5);
- if(s5==0)
- {
- n++;
- while(!s5);
- TMOD=TMOD|0x10;//定時器1 每50000*1us=0.05s溢出一次
- TH1=0x3c;
- TL1=0xd0;
- EA=1; //開總中斷
- ET1=1; //開定時器1中斷
- TR1=1; //開定時器
- }
- }
- if(s5==0 && n==1)
- {
- delay(5);
- if(s5==0)
- {
- while(!s5);
- n++;
- TR1=0;
- }
- }
- if(s5==0 && n==2)
- {
- if(s5==0)
- {
- while(!s5);
- n=0;
- t0=0;
- t1=0;
- }
- }
- LcdWriteSg(d0,2,t1);
- LcdWriteSg1(d0,4,t0);
- if(s1==0)
- {
- delay(5);
- if(s1==0) {while(!s1);button2();return;}
- }
- }
- }
- void button2()
- {
- uchar i,a[5];
- uint dat;
- float s;
- LcdWriteCom(0x01);
- LcdWriteCom(0x80);
-
-
- for(i=0;i<7;i++)
- {
- LcdWriteData(tab3[i]);
- delay(5);
- }
- while(1){
- dat=Read_AD_Data(0);
- s=(float)5*dat/4096;
- if(s5==0)
- {
- delay(5);
- if(s5==0)
- {
- p=s-1;
- }
- }
- s=s-p;
- a[3]=(int)s*1;
- a[2]=((int)(s*10))%10;
- a[1]=((int)(s*100))%10;
- a[0]=((int)(s*1000))%10;
- a[4]=((int)(s*10000))%10;
- if(a[4]>5)
- {
- if(a[0]==9)
- {
- a[0]=0;
- if(a[1]==9)
- {
- a[1]=0;
- if(a[2]==9)
- {
- a[2]=0;
- a[3]++;
- }
- else a[2]++;
- }
- else a[1]++;
- }
- else a[0]++;
- }
- LcdWriteCom(0x80+0x02);
- LcdWriteData(0x30+a[3]);
- LcdWriteCom(0x80+0x04);
- LcdWriteData(0x30+a[2]);
- LcdWriteCom(0x80+0x05);
- LcdWriteData(0x30+a[1]);
- LcdWriteCom(0x80+0x06);
- LcdWriteData(0x30+a[0]);
- if(s1==0)
- {
- delay(5);
- if(s1==0){while(!s1);LcdInit();return;}
- }
- }
- }
- void tim0() interrupt 1
- {
- TH0=0x3c;
- TL0=0xd0;
- count++;
- if(count==20)
- {
- count=0;
- m++;
- if(m==60)
- {
- m=0;
- f++;
- if(f==60)
- {
- f=0;
- s++;
- if(s==24) s=0;
- }
- }
- }
- }
- void tim1() interrupt 3
- {
- TH1=0x3c;
- TL1=0xd0;
- count1++;
- if(count1==2)
- {
- count1=0;
- t0++;
- if(t0==100)
- {
- t0=0;
- t1++;
- }
- if(t1==99 && t0==99)
- {
- TR1=0; //關中斷
- }
- }
- }
復制代碼
所有資料51hei提供下載:
簡易時鐘 跑表 直流電壓表.rar
(100.52 KB, 下載次數(shù): 91)
2017-8-3 17:49 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|