- #include"reg52.h"
- #define ucharunsigned char
- #define uintunsigned int
- sbit lcdrs=P1^0; //液晶数据命令选择端
- 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; //将要写的命令字送到数据总线上
- delay(5); //稍微延时以待数据稳定
- 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); //设置16×2显示,5×7点阵,8位数据接口
- write_com(0x0c); //设置开显示,不显示光标
- write_com(0x06); //写一个字符后地址指针加1
- write_com(0x01); //显示清0,数据指针清0
- write_com(0x80); //设置显示初始坐标
- 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; //设置定时器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; //启动计数器1
- PT0=1; //计数优先
- 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; //重装计数初值
- 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软件各模块设计
- 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定时和计数模块:
- void T0_time()interrupt 1
- {
- count++;
- }
- void T1_time()interrupt 3
- {
- TH1=(65536-45872)/256; //对TH0 TL0赋值
- TL1=(65536-45872)%256; //重装计数初值
- 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计数,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; //将要写的命令字送到数据总线上
- delay(5); //稍微延时以待数据稳定
- 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); //设置16×2显示,5×7点阵,8位数据接口
- write_com(0x0c); //设置开显示,不显示光标
- write_com(0x06); //写一个字符后地址指针加1
- write_com(0x01); //显示清0,数据指针清0
- write_com(0x80); //设置显示初始坐标
- 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主函数模块:
- void main()
- { init();
- TMOD=0X15; //设置定时器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; //启动计数器1
- PT0=1; //计数优先
- ET0=1; //开定时器0中断
- ET1=1; //开定时器1中断
- while(1)
- { fenpin();
- display();
- }
- }
复制代码
|