| 
 
| #include<reg52.h> #define uchar unsigned char
 #define uint unsigned int
 typedef unsigned char uint8;              //数据类型宏定义
 typedef unsigned int  uint16;
 sbit  lcden=P2^5;                              //LCD1602使能端
 sbit  lcdrs=P1^0;                              //LCD1602数据命令选择端
 sbit  lcdrw=P1^1;                             //LCD1602读写选择端
 sbit  lcdbusy=P0^7;                                 //繁忙检测位
 sbit  pulse=P3^4;                       //脉冲输入端
 
 uint i,kop,z,zhuan,num;
 uint  num=0;
 
 uchar display[]={"speed  =r/sec"};    // 定义显示参数
 void delayms(uchar);                 //声明延时子函数
 /*延时函数*/
 void delayms(uchar xms)
 {
 uchar l,n;
 for(l=xms;l>0;l--)
 for(n=110;n>0;n--);
 }
 /*繁忙检测函数*/
 void wait(void)
 {
 P0=0xFF;
 do
 {
 lcdrs=0;
 lcdrw=1;
 lcden=0;
 lcden=1;
 }
 while (lcdbusy==1);
 lcden=0;
 }
 
 
 /*向LCD1602写命令*/
 void write_cmd(uint8 cmd)
 {
 wait();
 lcden=0;
 P0=cmd;
 lcdrs=0;
 lcdrw=0;
 lcden=1;
 lcden=0;
 }
 /*向LCD1602写数据*/
 void write_dat(uint8 dat)
 {
 wait();
 lcden=0;
 P0=dat;
 lcdrs=1;
 lcdrw=0;
 lcden=1;
 lcden=0;
 }
 /*发送字符串到LCD1602*/
 void write_string(uint8 addr_start, uint8 *p)
 {
 write_cmd(addr_start);
 while (*p != '\0')
 {
 write_dat(*p++);
 }
 }
 
 /*LCD显示函数*/
 void displaytolcd()
 {
 write_cmd(0x80);                                  //向LCD1602写命令80H
 for (i=0;i<sizeof(display)-1;i++)                //循环要传输的字符个数次,每一次传输一个字符
 {
 write_dat(display[i]);
 delayms(5);
 }
 }
 
 
 /*数据处理函数*/
 void disp_count()
 {
 display[6]=(zhuan/1000+'0');                    //转换转速的千位
 display[7]=(zhuan/100%10+'0');                //转换转速的百位
 display[8]=(zhuan/10%10+'0');                //转换转速的十位
 display[9]=(zhuan%10+'0');                  //转换转速的个位
 }
 
 
 /*定时时间到,获取计数器值*/
 void Timer_0(void) interrupt 3
 {
 TH1=(65536-50000)/256;                                                   //T1定时器装入初值,定时50ms
 TL1=(65536-50000)%256;
 num++;
 if(num==20)                                  //50*20=1S
 {
 num=0;
 kop=TH0;                                   //计数器计入脉冲,每来一个矩形脉冲计数值加1
 kop=kop<<8;
 kop=kop+TL0;
 kop=kop/5;
 zhuan=kop;
 disp_count();
 displaytolcd();
 TH0=0;
 TL0=0;                                    //计数器清零
 }
 }
 /*初始函数*/
 void LCD1602()
 {
 lcdrw=0;                           //只写
 write_cmd(0x38);                  //设置16x2显示,5x7点阵,8位数据接口
 delayms(5);
 write_cmd(0x0c);                                  //设置开显示,不显示光标
 delayms(5);
 write_cmd(0x06);                                  //写一个字符后地址指针加1
 delayms(5);
 write_cmd(0x01);                                  //显示清0,数据指针清0
 delayms(5);
 }
 
 /*定时器初始函数*/
 void init()
 {
 TMOD=0x15;                                                                                   //T0为计数器,T1为定时器,都工作方式为1
 TH1=(65536-50000)/256;                                //50ms定时 定时器1
 TL1=(65536-50000)%256;
 TH0=0x00;
 TL0=0x00;                                                                                          //T0计数器初值
 EA=1;                                                //开总中断
 ET0=1;                                              //开计数器0中断
 ET1=1;                                                                                          //开定时器1中断
 TR0=1;                                              //启动计数器0
 TR1=1;                                                                                          //启动定时器0
 }
 
 
 
 
 void main()
 {
 LCD1602();
 init();
 while(1)
 {
 disp_count();
 displaytolcd();
 }
 }
 | 
 |