急急急,求助,谁能给我看一下这个程序

2019-07-18 10:54发布

#include <reg52.h> #include "LCD1602.h"                   //液晶显示头文件 # define uchar unsigned char # define uint unsigned int # define ulong unsigned long sbit Q0=P2^0;                                   //计数器0位 sbit Q1=P2^1;                                   //计数器1位 sbit Q2=P2^2;                                   //计数器2位 sbit Q3=P2^3;                                   //计数器3位 sbit Q4=P2^4;                                   //计数器4位 sbit Q5=P2^5;                                   //计数器5位 sbit Q6=P2^6;                                   //计数器6位 sbit Q7=P2^7;                                   //计数器7位 sbit kaishi=P3^0;                           //频率计数的逻辑开关 sbit qingling=P3^1;                      //计数器清零信号端 sbit s0=P1^3;                                   //待机功能键 sbit s1=P1^4;                                   //测频率功能键 sbit s2=P1^5;                                   //测周期功能键 sbit s3=P1^6;                                   //测占空比功能键 sbit led1=P3^2;                           //功能指示灯 sbit led2=P3^4; sbit led3=P3^6; sbit t1in=P3^3;                           //测占空比信号的输入引脚 uchar i,table[10],q0,q1,q2,q3,q4,q5,q6,q7,table2[9], table1[]={"welcome"},dis[5],T0num,T1num,th1,tl1; uint num,bizhi; ulong pinglv,time1,time0; bit zq=0;                                   //频率周期标志位 void key()                                   //按键扫描程序{if(s0==0)                                   //检测到待机功能键按下{delay(5);if(s0==0){while(!s0);init();write_com(0x80);                  //液晶显示“welcome”for(i=0;i<8;i++){write_data(table1);}while(1){if((s1==0)|(s2==0)|(s3==0))          //如果有别的键按下,退出该功能break;}}}if(s1==0)                                        //频率功能键按下{delay(5);if(s1==0){while(!s1);                                        led1=0;                                        //频率指示灯亮,其余灯灭led2=1;led3=1;zq=0;                                        //处于测量频率功能init();qingling=0;TMOD=0x51;                                //定义T0工作计时模式,T1工作于计数模式TH0=(65536-50000)/256;        //给T0装初值,定时5毫秒中断TL0=(65536-50000)%256;TH1=0;                                        //给T1装初值        TL1=0;ET0=1;                                        //开T0中断ET1=0;                                        //关闭T1中断TR0=1;                                                //T0开始计时TR1=1;                                           //T1开始计数while(1){                                                  //检测到有别的键按下,退出该功能if((s0==0)|(s2==0)|(s3==0))        break;}}}if(s2==0)                                //周期功能键按下{delay(5);if(s2==0){while(!s2);led2=0;                                   //周期指示灯亮,其余灭led1=1;led3=1;zq=1;                                  //处于周期测量功能init();qingling=0;TMOD=0x51;                          //定义T0工作计时模式,T1工作于计数模式TH0=(65536-50000)/256;        //给T0装初值,定时5毫秒中断TL0=(65536-50000)%256;TH1=0;                                        //给T1装初值        TL1=0;ET0=1;                                        //开T0中断ET1=0;                                        //关T1中断TR0=1;                                        //T0开始计时        TR1=1;                                        //T1开始计数while(1){                                        //如果有别的键按下,退出该功能if((s0==0)|(s1==0)|(s3==0))break;}}}if(s3==0)                   //占空比功能键按下{delay(5);if(s3==0);{while(!s3);led3=0;                        //占空比指示灯亮,其余灭led1=1;led2=1;TMOD=0x10;                //T0不工作,T1为定时器模式ET0=0;                        //T0中断关闭ET1=1;                        //打开T1中断TH1=0;                        //给T1装初值TL1=0;init();                   //液晶清屏while(1){while(!t1in);        //确认输入信号处于低电平while(t1in);        //检测到高电平TR1=1;                        //开始计时while(!t1in);        //高电平变低电平tl1=TL1;                //读取T1的值th1=TH1;T1num=T0num;while(t1in);        //再次检测到高电平TR1=0;                          //停止计时time0=T0num*65536+TH1*256+TL1;        //一个周期的时间time1=T1num*65536+th1*256+tl1;        //高电平的时间bizhi=time1*1000/time0;                        //计算占空比dis[0]=bizhi/100+0x30;                        //数据处理dis[1]=bizhi%100/10+0x30;dis[2]=0x2e;dis[3]=bizhi%10+0x30;dis[4]=0x25;write_com(0x80);for(i=0;i<5;i++)                           //数据显示{write_data(dis);}delay(100);                                        //延时T1num=0;th1=0;tl1=0;T0num=0;TH1=0;TL1=0;if((s0==0)|(s1==0)|(s2==0))break;                          //如果检测到有别的键按下,退出该功能}}}}   void main()                //主函数  {  lcdrw=0;                   //液晶处于写模式  init();                   //液晶清屏  write_com(0x80);        //显示“welcome”  for(i=0;i<8;i++)  {write_data(table1);   }                                                  EA=1;                                        //开总中断                                          while(1)  {  key();                           //按键扫描   }  } void T0_time()interrupt 1        //定时器T0中断函数 {  TH0=(65536-50000)/256;        //装初值  TL0=(65536-50000)%256;     num++;if(num==20)                                  //一秒时间到{TR1=0;                                        //停止计数kaishi=0;                                //计数停止TR0=0;                                        //停止计时q0=Q0;                                   //读取计数器的值q1=Q1;q2=Q2;q3=Q3;q4=Q4;q5=Q5;q6=Q6;q7=Q7;pinglv=TH1*65536+TL1*256+q7*128+q6        //计算频率*64+q5*32+q4*16+q3*8+q2*4+q1*2+q0;if(zq==0)                                   //如果处于频率测量{                                                   //频率数据处理table[0]=pinglv/10000000;table[1]=pinglv%10000000/1000000;table[2]=pinglv%1000000/100000;table[3]=pinglv%100000/10000;table[4]=pinglv%10000/1000;table[5]=pinglv%1000/100;table[6]=pinglv%100/10;table[7]=pinglv%10;table[8]='H';table[9]='z';write_com(0x80);for(i=0;i<8;i++)                //显示频率{write_data(table+0x30);}write_data(table[8]);write_data(table[9]);}if(zq==1)                   //处于周期测量{if(pinglv<=1000)  //频率小于等于1000{                                  //周期数据处理table2[0]=10000/pinglv/10000+0x30;table2[1]=10000/pinglv%10000/1000+0x30;table2[2]=10000/pinglv%1000/100+0x30;table2[3]=10000/pinglv%100/10+0x30;table2[4]=0x2e;table2[5]=10000/pinglv%10+0x30;table2[6]=100000/pinglv%10+0x30;table2[7]=0x6d;table2[8]=0x73;}if(pinglv>1000)          //频率大于1000{                                  //周期数据处理table2[0]=0+0x30;table2[1]=10000000/pinglv/1000+0x30;table2[2]=10000000/pinglv%1000/100+0x30;table2[3]=10000000/pinglv%100/10+0x30;table2[4]=0x2e;table2[5]=10000000/pinglv%10+0x30;table2[6]=100000000/pinglv%10+0x30;table2[7]=0x75;table2[8]=0x73;}write_com(0x80);        //显示周期for(i=0;i<9;i++)write_data(table2);}delay(100);TH1=0;                   //给T1装初值TL1=0;TH0=(65536-50000)/256;          //给T0装初值TL0=(65536-50000)%256;num=0;qingling=1;                  //计数器清零delay(10);qingling=0;kaishi=1;                //再次开始测量TR0=1;                        //T0开始计时TR1=1;                   //T1开始计数}}void T1_time()interrupt 3 //定时器T1中断函数{T0num++;}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。