1、51单片机频率计设计LCD显示1 /单片机89C51的数字频率计C程序:#include #include #include #include float f; /频率float p; /周期float sj;float mk; /脉宽 char idata buff20;char xs=0; /设置闸门时间结束后是否显示结果的标志位unsigned char m=0,n=0,yichu=0,fenpin; /m定时中断次数 n计数中断次数 yichu判断是定时器还是sbit B153=P24;sbit A153=P23;sbit P35=P35;unsigned char LCD_Wait(
2、void);void LCD_Write(bit style, unsigned char input);void LCD_SetDisplay(unsigned char DisplayMode);void LCD_SetInput(unsigned char InputMode);void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void C51_Initial();void Delay(unsigned int t);void display(fl
3、oat f);void cepin();void panduan();void Mkdisplay(float mk);void ccpin();/* 模块名称: LCD1602显示程序 * */*端口定义 */sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn= P22;sfr DBPort= 0x80; /P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/*内部等待函数*/unsigned char LCD_Wait(void) LcdRs=0; /寄存器选择输入端 1:数据 0:指令 LcdRw=1; _nop_(); /RW:为
4、0:写状态;为1:读状态; LcdEn=1; _nop_(); /使能输入端,读状态,高电平有效;写状态,下降沿有效 LcdEn=0; return DBPort; /*向LCD写入命令或数据*/#define LCD_COMMAND 0 / Command#define LCD_DATA 1 / Data#define LCD_CLEAR_SCREEN 0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style; LcdRw=0; _n
5、op_(); DBPort=input; _nop_();/注意顺序 LcdEn=1; _nop_();/注意顺序 LcdEn=0; _nop_(); LCD_Wait(); /*设置显示模式*/#define LCD_SHOW 0x04 /显示开#define LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标#define LCD_NO_CURSOR 0x00 /无光标 #define LCD_FLASH 0x01 /光标闪动#define LCD_NO_FLASH 0x00 /光标不闪动 void LCD_SetDisplay(unsigne
6、d char DisplayMode) LCD_Write(LCD_COMMAND, 0x08|DisplayMode); /*设置输入模式*/#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 / default #define LCD_MOVE 0x01 / 画面可平移#define LCD_NO_MOVE 0x00 /defaultvoid LCD_SetInput(unsigned char InputMode) LCD_Write(LCD_COMMAND, 0x04|InputMode);/*初始化LCD*/void LCD_Initial(
7、) LcdEn=0; LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/*LCD*/void GotoXY(unsigned char x, unsigned char y)if(y=0) LCD_Writ
8、e(LCD_COMMAND,0x80|x);if(y=1) LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str) while(*str!=0) LCD_Write(LCD_DATA,*str); str+; /*89c51初始化*/ void C51_Initial() sj=1000000.00; TMOD=0x51; / 01010001 T1为计数器,T0为定时器 EA=1; ET0=1; ET1=1; EX0=1; PX0=1; /外部中断0设置为高优先级 IT0=0; /电平触发方式/*ms延时子程序*/
9、void Delay(unsigned int t) /t随着数值越大,误差趋于平衡.unsigned char i; while(t-) for(i=0;i999400.00) if(f1040.00) sprintf(buff,Freque %4.2fkHz,(f/1000.00); else if(f0.06) sprintf(buff,Freque %3.2fHz,f); GotoXY(0,1); Print(buff);/*显示周期*/void Pdisplay(float p) if(p999400.00) if(p9950.00) sprintf(buff,Perio %4.1fms ,(p/1000.00); else if(p0.248) sprintf(buff,Perio %3.2fus ,p); else sprintf(buff,error(Time or F),p); GotoXY(0,1); Print(buff); /*显示脉宽*/void Mkdisplay(float mk) if(mk499700.00) if(p4975.00) sprintf(buff,Maikua %4.1fms,(mk/1000.00); else if(p0.124) sprintf(buff,Maikua %3.2fus,mk); else sprintf(
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1