如何修改程序使单片机工作周期缩短至一秒内

#include "reg51.h"
#include
#include //打开头文件
#define uint8 unsigned char
#define uint16 unsigned int
#define uchar unsigned char
#define uint unsigned int //宏定义

uint16 cnt2ms; //10ms计数器
uint8 cnt1s; //1秒计数器

//电阻--------------------------------
#define Z1 13700053.00
#define Z2 3685279.00

float RZ=0;
unsigned long RX=0;
unsigned long RX2=0;
unsigned long RX3=0;
unsigned long RX4=0;
unsigned long RX5=0;
unsigned long RX6=0;
unsigned long RX7=0;
unsigned long RX8=0;
unsigned long RX9=0;

//电感--------------------------------
float LZ=0;
#define C1 0.0461

//电容--------------------------------
float CZ=0;
float CX=0;
#define R1 24874

uint8 KL=0; //
unsigned int Pulsecnt=0; //脉冲个数
unsigned int Pulsenum; //脉冲个数
uint8 start=0; //
uint16 PulseTime; //10ms计数器
uint16 Pulse; //10ms计数器
bit flag=0;
uint8 CH=0; //
unsigned long x;
void Init_Extint(void);
void TimerInitProc();

void Init_System(void);
void Display(uint8 chose_dat, uint8 dat);
void ShowDisp(uint8 tPulsenum, uint8 tPulsecnt, uint8 tcnt1s);
void DelayMs(uint8 Ms);
uint8 Pulse_FLAG=0;
uint8 Pulse_5=0;

/********************************LCD液晶**************************************/
#define LCD_Data P0 //LCD的数据口
sbit LCD_BF=LCD_Data^7; //LCD忙信号位
sbit LCD_RS=P2^5;
sbit LCD_RW=P2^6;
sbit LCD_EN=P2^7;

#define LCD_GO_HOME 0x02 //AC=0,光标、画面回HOME位

//输入方式设置
#define LCD_AC_AUTO_INCREMENT 0x06 //数据读、写操作后,AC自动增一
#define LCD_AC_AUTO_DECREASE 0x04 //数据读、写操作后,AC自动减一
#define LCD_MOVE_ENABLE 0x05 //数据读、写操作,画面平移
#define LCD_MOVE_DISENABLE 0x04 //数据读、写操作,画面不动

//设置显示、光标及闪烁开、关
#define LCD_DISPLAY_ON 0x0C //显示开
#define LCD_DISPLAY_OFF 0x08 //显示关
#define LCD_CURSOR_ON 0x0A //光标显示
#define LCD_CURSOR_OFF 0x08 //光标不显示
#define LCD_CURSOR_BLINK_ON 0x09 //光标闪烁
#define LCD_CURSOR_BLINK_OFF 0x08 //光标不闪烁

//光标、画面移动,不影响DDRAM
#define LCD_LEFT_MOVE 0x18 //LCD显示左移一位
#define LCD_RIGHT_MOVE 0x1C //LCD显示右移一位
#define LCD_CURSOR_LEFT_MOVE 0x10 //光标左移一位
#define LCD_CURSOR_RIGHT_MOVE 0x14 //光标右移一位

//工作方式设置
#define LCD_DISPLAY_DOUBLE_LINE 0x38 //两行显示
#define LCD_DISPLAY_SINGLE_LINE 0x30 //单行显示
/*定义子程序*/
void LCD_ClrAll(void); //清屏
void Judge_LCD_busy(void); //检测是否忙碌
void LCD_Write(uchar WriteData); //写控制字
void LCD_write_data(uchar LCD_data); //写数据显示
void LCD_cursor(uchar x); //光标起始地址
void LCD_printc(unsigned char lcd_data) ; //输出一个字符
void LCD_prints(unsigned char *lcd_string);//输出字符串

/*LCD1602忙碌判断子程序*/
void Judge_LCD_busy(void) //判断LCD1602是否忙状态
{
while(1)
{
LCD_EN=0;
LCD_RS=0;
LCD_RW=1;
LCD_Data=0xff;
LCD_EN=1; //EN 是 1—0 使能
if(!LCD_BF)break; //LCD_BF=1表示忙碌,需要等待。
}
LCD_EN=0;
}
/******LCD清屏***************/
void LCD_ClrAll(void)
{

Judge_LCD_busy(); //判断是否忙碌
LCD_RS=0;
LCD_RW=0;
LCD_Data=0x01;
LCD_EN=1;
LCD_EN=0;

}
/*******LCD写数据定义各种模式*********/
void LCD_Write(uchar WriteData) //写指令到LCD
{
Judge_LCD_busy();
LCD_RS=0;
LCD_RW=0;

P0=WriteData; //把WriteData的数据送到数据口
LCD_EN=1;
LCD_EN=0;
}
/********LCD显示数据***********/
void LCD_write_data(uchar LCD_data) //输出一个字节数据到LCD
{
Judge_LCD_busy();
LCD_RS=1;
LCD_RW=0;

P0=LCD_data;
LCD_EN=1;
LCD_EN=0;

}
/****光标位置的确定***/
void LCD_cursor(uchar x) //LCD光标定位到x处
{
LCD_Write(0x80+x); //第一行地址是0x80
}
/*输出一个字符*/
void LCD_printc(unsigned char lcd_data)
{
LCD_write_data(lcd_data);
}

/*输出字符串*/
void LCD_prints(unsigned char *lcd_string)
{
unsigned char i=0;
while(lcd_string[i]!=0x00)
{
LCD_write_data(lcd_string[i]);
i++;
}
}

/*初始化程序*/
void LCD_initial(void) //初始化LCD
{
LCD_Write(LCD_AC_AUTO_INCREMENT|LCD_MOVE_DISENABLE);
LCD_Write(LCD_DISPLAY_ON|LCD_CURSOR_OFF);
LCD_Write(LCD_DISPLAY_DOUBLE_LINE);
LCD_ClrAll();
}

/****延时******/
void delay_1ms(uint x)
{
uint j;
uchar i;
for(j=0;j<x;j++)
{
for(i=0;i<120;i++);
}
}

void Value_to_ASCII(unsigned long value,uchar add)
{
unsigned char temp[] = "0000.000K ";
temp[0] = value/1000000 + 0x30;//数值改成字符,液晶显示需要ASCII码
value = value%1000000;
temp[1] = value/100000 + 0x30;
value = value%100000;
temp[2] = value/10000 + 0x30;
value = value%10000;
temp[3] = value/1000 + 0x30;
value = value%1000;
temp[5] = value/100 + 0x30;
value = value%100;
temp[6] = value/10 + 0x30;
value = value%10;
temp[7] = value + 0x30;

LCD_cursor(add);   //光标起始地址 ,第一行地址是0x00~0x0F,第二行地址是0x40~0x4f
LCD_prints(temp);

}

//--------------------主程序--------------------------------
void main()
{
TMOD=0x51; //设置定时器0,方式1:16位定时器
TH1=0;
TL1=0;
TH0=(65536-2000)/256; //设定定时周期
TL0=(65536-2000)%256;
TR0=1; //打开定时器0
TR1=1; //打开定时器1
ET1=1;
ET0=1;
EA=1; //打开总中断
LCD_initial();
delay_1ms(50);
LCD_initial();
delay_1ms(50);
LCD_cursor(0x00);

LCD_prints("   MEASURE Rx   ");
LCD_cursor(0x45);

while(1)
{
    if(flag==1)
       {
            flag=0;
            x=Pulsenum*65536+TH1*256+TL1;//计算1s内的脉冲个数,频率=脉冲个数

                RZ=(Z1/x);//测量100到1000
                RX=RZ-1000;
                RX=RX>>1;
                if(RX>=1005){ RX=RX-1005;}else{RX=0;}
                if(x==0){RX=0;RX2=0;RX3=0;RX4=0;RX5=0;RX6=0;RX7=0;RX8=0;RX9=0;}
                if(RX>1000000){RX=1000000; }
                RX2=(RX+RX3+RX4+RX5+RX6+RX7+RX8+RX9)>>3;//求平均提高精度
                RX9=RX8;RX8=RX7;RX7=RX6;RX6=RX5;RX5=RX4;RX4=RX3;RX3=RX;
                //保存上一次的阻值     
                 Value_to_ASCII(RX2,0x44);//更新阻值显示


             cnt2ms=0;
             Pulsenum=0;
             TH1=0;
             TL1=0;
             TR1=1;       
       }
 }

}
/*******************************************************************************

  • 函 数 名: Exti0_interrupt
  • 函数功能: /T0引脚下降沿进入中断
  • 入口参数: 无
  • 返 回: 无 *******************************************************************************/ void T1_interrupt(void) interrupt 3 using 0 { Pulsenum++; //保存测得脉冲值
    } /******************************************************************** 函数功能:定时器/计数器1中断处理 入口参数:null 返 回:null 备 注:null ********************************************************************/ void Timer0IntProc() interrupt 1 using 0 //2ms { TH0=(65536-2000)/256; TL0=(65536-2000)%256; cnt2ms++; if(cnt2ms==497) //1s计时到 { TR1=0; cnt2ms = 0; flag=1; }

}

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问