📄 51
字号:
{
SDA = 1;
SCL = 1;
tdata =tdata<<1; //左移一位
if(SDA == 1)
tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
else
tdata = tdata&0xfe; // 否则数据的最后一位置0
SCL = 0;
}
return(tdata);
}
//-------------------------------------------------------------------
// 函数名称: ADC_PCF8591
// 入口参数: controlbyte控制字
// 函数功能: 连续读入4路通道的A/D转换结果到receivebuf
//-------------------------------------------------------------------
void ADC_PCF8591(uchar controlbyte)
{
uchar idata receive_da,i=0;
iic_start();
IICSendByte(PCF8591_WRITE); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
IICSendByte(controlbyte); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
iic_start(); //重新发送开始命令
IICSendByte(PCF8591_READ); //控制字
check_ACK();
if(askflag == 1)
{
SystemError = 1;
return;
}
IICreceiveByte(); //空读一次,调整读顺序
slave_ACK(); //收到一个字节后发送一个应答位
while(i<4)
{
receive_da=IICreceiveByte();
receivebuf[i++]=receive_da;
slave_ACK(); //收到一个字节后发送一个应答位
}
slave_NOACK(); //收到最后一个字节后发送一个非应答位
iic_stop();
}
//液晶刷新
void lcd_flash(void)
{
unsigned char i = 0;
lcd_pos(0); //设置显示位置为第一行的第1个字符
while(dis4[i] != '\0')
{ //显示字符
lcd_wdat(dis4[i]);
i++;
}
lcd_pos(0x40); //设置显示位置为第二行第1个字符
i = 0;
while(dis5[i] != '\0')
{
lcd_wdat(dis5[i]); //显示字符
i++;
}
}
//********************************************************
//函数功能:定时器T0的相关程序
//*******************************************************
#define T0start() TR0 = 1; //启动定时器T0开始运行
#define T0off() TR1 = 0; //关闭T0定时器
#define T2start() TR2 = 1; //开启T2计数器
#define T2off() TR2 = 0; //关闭T2计数器
//unsigned int x;
unsigned char num;
//t0初始化
void intt0init()
{
TMOD = 0x01; //使用定时器T0
TH0 = (65536-50000)/256; //将定时器计时时间设定为50毫秒 //=50000微秒=50毫秒
TL0 = (65536-50000)%256;
EA = 1; //开启总中断
ET0 = 1; //定时器T0中断允许
T0start();
T2start();
}
//t0中断
void interserve(void ) interrupt 1 using 1
{
T0off(); //关闭定时器T0 50MS一次中断
EA = 0;
num++;
if(num == 40) //够20次中断,即1秒钟进行一次检测结果采样 // 1.086*2 0.59us
{
T2off(); //开启计数器T2
if(ov_flage == 1){
x = freq;
x += 0xffff; //
}else{
x = freq;
}
ov_flage = 0; //溢出标志位清0
freq = 0; //频率清0
num = 0;
TH2 = 0x00; //重新给计数器T0赋初值
TL2 = 0x00;
}
TH0 = (65536-50000)/256; //重新给计数器T0赋初值
TL0 = (65536-50000)%256;
EA = 1;
T0start(); //开启定时器T0
T2start(); //开启计数器T2
}
//----------------------------------------------------------------------
//定时器中断2
void INTT2init(void)
{
C_T2 = 1; //选择信号输入
EXEN2 = 0;
CP_RL2 = 0;
ET2 = 1; //开启定时器2中断
TH2 = 0x00; //重新给计数器T0赋初值
TL2 = 0x00;
}
//计数器溢出中断
void intt2(void ) interrupt 5 using 3
{
T2off();
TF2 = 0; //清除中断标志位
EXF2 = 0; //清除捕获标志位
// x++;
ov_flage = 0x01; //置位溢出标志位
// TH2 = 0xFF; //重新给计数器T0赋初值
// TL2 = 0xFB;
// TR2 = 1;
}
//----------------------------------------------------------------------
//外部中断输入
void INT0init(void)
{
EA=1; //开放总中断
EX0=1; //允许使用外中断
IT0=1; //选择负跳变来触发外中断
}
void int0(void) interrupt 0 using 0 //外中断0的中断编号为0
{
freq++;
}
//-------------------------------------------------------------------
void fre_value(unsigned int data1)
{
dis[0] = data1%10;// + 0x30;
dis[0] += 0x30;
dis[1] = data1%100;
dis[1] /= 10;
dis[1] += 0x30;
dis[2] = data1%1000;
dis[2] /= 100;
dis[2] += 0x30;
dis[3] = data1/1000;
//dis[3] = 0;
dis[3] += 0x30;
}
//-------------------------------------------------------------------
// 函数名称: main
// 函数功能: 主程序
//-------------------------------------------------------------------
main()
{
// uchar l;
// uchar buffer;
unsigned long buf;
unsigned int buf1;
// EXEN2 = 1;
PT0 = 1; // 外部中断设置为高优先级
// PX0 = 1; // 外部中断设置为高优先级
lcd_init(); //初始化LCD
lcd_pos(0); //设置显示位置为第一行的第1个字符
lcd_flash();
intt0init(); //定时器T0初始化
INTT2init(); //定时器T2初始化
INT0init();
EA = 1;
T0start(); //开启定时器T0
while(1)
{
EA = 0;
iicInit(); //I2C总线初始化
ADC_PCF8591(0x04);
if(SystemError == 1) //有错误,重新来
{
iicInit(); //I2C总线初始化
ADC_PCF8591(0x04);
}
EA = 1;
// lcd_flash();
// for(l=0;l<4;l++)
// {
delay(200); //刷新速率 延迟
show_value(receivebuf[0]);
if(PIN == 0){
buf1 = (dis[2]-0x30)*100;
buf1 += (dis[1]-0x30)*10;
buf1 += (dis[0]-0x30);
buf1 *= 2;
if(buf1 > 999)
{
buf1 = 999;
}
fre_value(buf1); //
}
lcd_pos(0x08);
lcd_wdat(dis[2]); //整数位显示
lcd_pos(0x0A);
lcd_wdat(dis[1]); //
lcd_pos(0x0b);
lcd_wdat(dis[0]); //
if((x > 999)&&(x<9999))
{
// buf = x*2;
buf = x;
buf /=10;
fre_value(buf); //
lcd_pos(0x4a);
lcd_wdat(dis[2]); //整数位显示
lcd_pos(0x4b);
lcd_wdat('.'); //第一位小数显示
lcd_pos(0x4c);
lcd_wdat(dis[1]); //第二位小数显示
lcd_pos(0x4d);
lcd_wdat(dis[0]); //第二位小数显示
lcd_pos(0x4e);
lcd_wdat('K'); //第二位小数显示
lcd_pos(0x4f);
lcd_wdat('H'); //第二位小数显示
}else if(x>9999)
{
if(x >100000)
{
x = 0;
}
// buf = x*2;
buf = x;
buf /= 100;
fre_value(buf); //
lcd_pos(0x4a);
lcd_wdat(dis[2]); //整数位显示
lcd_pos(0x4b);
lcd_wdat(dis[1]); //第二位小数显示
lcd_pos(0x4c);
lcd_wdat('.'); //第一位小数显示
lcd_pos(0x4d);
lcd_wdat(dis[0]); //第二位小数显示
lcd_pos(0x4e);
lcd_wdat('K'); //第二位小数显示
lcd_pos(0x4f);
lcd_wdat('H'); //第二位小数显示
}
else{
fre_value(x); //
lcd_pos(0x4a);
lcd_wdat(dis[2]); //整数位显示
lcd_pos(0x4B);
lcd_wdat(dis[1]); //第二位小数显示
lcd_pos(0x4C);
lcd_wdat(dis[0]); //第二位小数显示
lcd_pos(0x4D);
lcd_wdat('H'); //第二位小数显示
lcd_pos(0x4E);
lcd_wdat('Z'); //第二位小数显示
lcd_pos(0x4F);
lcd_wdat(' '); //第二位小数显示
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -