QQ截圖20180619162700.jpg (168.19 KB, 下載次數(shù): 24)
下載附件
2018-6-19 16:27 上傳
- #include"reg52.h"
- #define ucharunsigned char
- #define uintunsigned int
- sbit lcdrs=P1^0; //液晶數(shù)據(jù)命令選擇端
- sbit lcden=P1^1; //液晶使能端
- sbit A0=P2^3; //8選1(A0~A2)接口
- sbit A1=P2^4;
- sbit A2=P2^5;
- void delay();
- void write_com();
- void write_date();
- void init();
- void display();
- void fenpin();
- uchartable[]={"frequence:"};
- uint f,K;
- uchar num1,count;
- ucharbw,sw,w,q,b,s,g;
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- voidwrite_com(uchar com)
- {
- lcdrs=0; //選擇寫命令模式
- P0=com; //將要寫的命令字送到數(shù)據(jù)總線上
- delay(5); //稍微延時以待數(shù)據(jù)穩(wěn)定
- lcden=1; //使能端給一高脈沖
- delay(5); //稍微延時
- lcden=0; //將使能端置0以完成高脈沖
- }
- void write_date(uchardate)
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- uchar num;
- lcden=0;
- write_com(0x38); //設(shè)置16×2顯示,5×7點陣,8位數(shù)據(jù)接口
- write_com(0x0c); //設(shè)置開顯示,不顯示光標
- write_com(0x06); //寫一個字符后地址指針加1
- write_com(0x01); //顯示清0,數(shù)據(jù)指針清0
- write_com(0x80); //設(shè)置顯示初始坐標
- for(num=0;num<10;num++) //顯示frequency
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40+3); //寫出頻率f
- write_date('f');
- delay(5);
- write_com(0x80+0x40+4); //寫出頻率=
- write_date('=');
- delay(5);
- write_com(0x80+0x40+12); //寫出頻率單位Hz
- write_date('H');
- delay(5);
- write_com(0x80+0x40+13);
- write_date('z');
- delay(5);
- TMOD=0X15; //設(shè)置定時器0和1工作方式1
- TH1=(65536-45872)/256; //對TH0 TL0賦值
- TL1=(65536-45872)%256; //使定時器50ms中斷一次
- TH0=0;
- TL0=0;
- EA=1; //開總中斷
- TR0=1; //啟動定時器0 開始計時
- TR1=1; //啟動計數(shù)器1
- PT0=1; //計數(shù)優(yōu)先
- ET0=1; //開定時器0中斷
- ET1=1; //開定時器1中斷
- }
- void display()
- {
- bw=f/1000000;
- sw=f%1000000/1000000;
- w=f%1000000%100000/10000;
- q=f%1000000%100000%10000/1000;
- b=f%1000000%100000%10000%1000/100;
- s=f%1000000%100000%10000%1000%100/10;
- g=f%1000000%100000%10000%1000%100%10;
- write_com(0x80+0x40+5);
- write_date(0x30+bw);
- delay(5);
- write_com(0x80+0x40+6);
- write_date(0x30+sw);
- delay(5);
- write_com(0x80+0x40+7);
- write_date(0x30+w);
- delay(5);
- write_com(0x80+0x40+8);
- write_date(0x30+q);
- delay(5);
- write_com(0x80+0x40+9);
- write_date(0x30+b);
- delay(5);
- write_com(0x80+0x40+10);
- write_date(0x30+s);
- delay(5);
- write_com(0x80+0x40+11);
- write_date(0x30+g);
- delay(5);
- }
- void fenpin()
- {
- if(f>5000000)
- {
- A0=0;
- A1=0;
- A2=0;
- K=10;
- f=K*f;
- }
- else
- {
- A0=0;
- A1=0;
- A2=1;
- K=1;
- f=K*f;
- }
- }
- void main()
- {
- init();
- while(1)
- {
- fenpin();
- display();
- }
- }
- void T0_time()interrupt 1
- {
- count++;
- }
- void T1_time()interrupt 3
- {
- TH1=(65536-45872)/256; //對TH0 TL0賦值
- TL1=(65536-45872)%256; //重裝計數(shù)初值
- num1++; //每過50ms numt加1
- if(num1==20) //如果到了20次,說明1秒時間到
- {
- num1=0; //清0
- f=count*65536+(TH0*256+TL0);
- TH0=0;
- TL0=0;
- count=0;
- }
- TR1=1;
- }
- 3.2軟件各模塊設(shè)計
- 3.2.1顯示模塊:
- void display()
- {
- bw=f/1000000;
- sw=f%1000000/1000000;
- w=f%1000000%100000/10000;
- q=f%1000000%100000%10000/1000;
- b=f%1000000%100000%10000%1000/100;
- s=f%1000000%100000%10000%1000%100/10;
- g=f%1000000%100000%10000%1000%100%10;
- write_com(0x80+0x40+5);
- write_date(0x30+bw);
- delay(5);
- write_com(0x80+0x40+6);
- write_date(0x30+sw);
- delay(5);
- write_com(0x80+0x40+7);
- write_date(0x30+w);
- delay(5);
- write_com(0x80+0x40+8);
- write_date(0x30+q);
- delay(5);
- write_com(0x80+0x40+9);
- write_date(0x30+b);
- delay(5);
- write_com(0x80+0x40+10);
- write_date(0x30+s);
- delay(5);
- write_com(0x80+0x40+11);
- write_date(0x30+g);
- delay(5);
- }
- 3.2.2定時和計數(shù)模塊:
- void T0_time()interrupt 1
- {
- count++;
- }
- void T1_time()interrupt 3
- {
- TH1=(65536-45872)/256; //對TH0 TL0賦值
- TL1=(65536-45872)%256; //重裝計數(shù)初值
- num1++; //每過50ms numt加1
- if(num1==20) //如果到了20次,說明1秒時間到
- {
- num1=0; //清0
- f=count*65536+(TH0*256+TL0);
- TH0=0;
- TL0=0;
- count=0
- }
- TR1=1;
- }
- 其中T0計數(shù),T1定時。
- 3.2.3延時模塊:
- void delay(uint z)
- {
- uint i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- 3.2.4液晶1602初始化模塊:
- void write_com(uchar com)
- {
- lcdrs=0; //選擇寫命令模式
- P0=com; //將要寫的命令字送到數(shù)據(jù)總線上
- delay(5); //稍微延時以待數(shù)據(jù)穩(wěn)定
- lcden=1; //使能端給一高脈沖
- delay(5); //稍微延時
- lcden=0; //將使能端置0以完成高脈沖
- }
- voidwrite_date(uchar date)
- {
- lcdrs=1;
- P0=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- uchar num;
- lcden=0;
- write_com(0x38); //設(shè)置16×2顯示,5×7點陣,8位數(shù)據(jù)接口
- write_com(0x0c); //設(shè)置開顯示,不顯示光標
- write_com(0x06); //寫一個字符后地址指針加1
- write_com(0x01); //顯示清0,數(shù)據(jù)指針清0
- write_com(0x80); //設(shè)置顯示初始坐標
- for(num=0;num<10;num++) //顯示frequency
- {
- write_date(table[num]);
- delay(5);
- }
- write_com(0x80+0x40+3); //寫出頻率f
- write_date('f');
- delay(5);
- write_com(0x80+0x40+4); //寫出頻率=
- write_date('=');
- delay(5);
- write_com(0x80+0x40+12); //寫出頻率單位Hz
- write_date('H');
- delay(5);
- write_com(0x80+0x40+13);
- write_date('z');
- delay(5);
- }
- 3.2.5分頻模塊:
- void fenpin()
- {
- if(f>5000000)
- { A0=0;
- A1=0;
- A2=0;
- K=10;
- f=K*f;
- }
- else
- { A0=0;
- A1=0;
- A2=1;
- K=1;
- f=K*f;
- }
- }
- 3.2.6主函數(shù)模塊:
- void main()
- { init();
- TMOD=0X15; //設(shè)置定時器0和1工作方式1
- TH1=(65536-45872)/256; //對TH0 TL0賦值
- TL1=(65536-45872)%256; //使定時器50ms中斷一次
- TH0=0;
- TL0=0;
- EA=1; //開總中斷
- TR0=1; //啟動定時器0 開始計時
- TR1=1; //啟動計數(shù)器1
- PT0=1; //計數(shù)優(yōu)先
- ET0=1; //開定時器0中斷
- ET1=1; //開定時器1中斷
- while(1)
- { fenpin();
- display();
- }
- }
復制代碼
|