首页资源分类嵌入式处理器51内核 > 51单片机同时驱动ICL7135采集数据,并在1602显示数据

51单片机同时驱动ICL7135采集数据,并在1602显示数据

已有 445025个资源

下载专区

上传者其他资源

    文档信息举报收藏

    标    签:C51ICL71351602

    分    享:

    文档简介

    利用7135驱动两片ICL7135采集数据,并在1602上显示采集的数据

    文档预览

    //OUT- IN- IN+ OUT+ #include //#include "STC89.H" #include #include #define uchar unsigned char #define uint unsigned int //1602管脚 sbit LCM_RS=P3^7; sbit LCM_RW=P3^5; sbit LCM_E=P3^6;//定义接口 //74HC164管脚 sbit A_B=P3^0; sbit CP=P3^1; //74HC165管脚 sbit Data=P1^0; //接收位定义 sbit CLK=P1^1; //时钟位定义 sbit Lock=P1^4; //转载/移位位定义 //sbit D5 = P1^6;//7135 D5 /* 7135 74HC165 B8 H B4 G B2 F B1 E D4 D D3 C D2 B D1 A D5 */ #define LCM_Data P1//数据接口 void LCM_WriteData(uchar WDLCM); void LCM_WriteCommand(uchar WCLCM,BuysC); uchar LCM_ReadData(void); uchar LCM_ReadStatus(void); void LCM_Init(void); void DisplayOneChar(uchar X, uchar Y, uchar DData); void DisplayListChar(uchar X, uchar Y, uchar code *DData); void Delay5Ms(void); void Delay400Ms(void); void Delay(unsigned int x); void ToASCII(signed int x);//输入有符号整数,变更为预备显示的六位ASCII码 void displayASCII(uchar X, uchar Y,signed int Z); unsigned char series_P_165(); unsigned char series_I_165(); signed int AD(); uchar ASCII[6]={0x00,0x00,0x00,0x00,0x00,0x00}; uchar BCD[6]={0X00,0X00,0X00,0X00,0X00,0x00};//D1 D2 D3 D4 D5 POL ,POL=0负 POL=1正 uchar code types[] = {"YBS-DQ"}; uchar L4; //uchar pol=0; void main(void) { unsigned char var,var1,ad_over; //unsigned int ii=0; signed int var_si; //Delay400Ms();//启动等待,等LCM讲入工作状态 LCM_Init();//LCM初始化 //Delay5Ms();//延时片刻(可不要) DisplayListChar(5,0,types); Delay400Ms(); LCM_WriteCommand(0x01,1);//显示清屏 CLK=0; while(1) { var_si = AD(); displayASCII(7,0,var_si); } } /****************************读ICL7135数据函数**************************/ /*函数原型:signed int AD() /*函数功能:读ICL7135数据 /*输入参数:无 /*输出参数:signed int x /*调用模块: /*建立时间:2014/03/29 /*作者:杨建华 /**********************************************************************/ signed int AD() { unsigned char D_OVER=0;//转换标记 signed int x; unsigned char var,var1,L4,ad_over; P1 |= 0X80; while(1) { if(P1^6 == 1) { var = series_P_165(); L4 = var << 4; L4 = L4 >> 4;//D4 D3 D2 D1 if(L4 == 0) { var = series_P_165(); ad_over = var >> 4; BCD[4] = ad_over; break; } } } while(1) { CLK=0; var = series_P_165(); var1 = var<<4; var1 = var1>>4; if(var1 == 0x08) { var = series_P_165(); ad_over = var >> 4; BCD[3] = ad_over; break; } } while(1) { CLK=0; var = series_P_165(); var1 = var<<4; var1 = var1>>4; if(var1 == 0x04) { var = series_P_165(); ad_over = var >> 4; BCD[2] = ad_over; break; } } while(1) { CLK=0; var = series_P_165(); var1 = var<<4; var1 = var1>>4; if(var1 == 0x02) { var = series_P_165(); ad_over = var >> 4; BCD[1] = ad_over; break; } } while(1) { CLK=0; var = series_P_165(); var1 = var<<4; var1 = var1>>4; if(var1 == 0x01) { var = series_P_165(); ad_over = var >> 4; BCD[0] = ad_over; break; } } x = (signed int)(BCD[4]*10000+BCD[3]*1000+BCD[2]*100+BCD[1]*10+BCD[0]); if(P1 & 0X80) { x=x; } else { x=x*(-1); } return x; } /****************************读75hc165数据函数**************************/ /*函数原型:unsigned char series_P_165() /*函数功能:读75hc165数据 /*输入参数:无 /*输出参数:unsigned char /*调用模块: /*建立时间:2014/03/29 /*作者:杨建华 /**********************************************************************/ unsigned char series_P_165() { uchar i; uchar BYTE=0; //最终接收到得字符 Lock=0; //将165外部端口数据装入内部寄存器 _nop_(); Lock=1; //抬高为移位准备 for(i=0;i<8;i++) { BYTE<<=1; // 1 CLK=0; //时钟低 _nop_(); BYTE|=Data; //先接收高位 CLK=1; //时钟高,上升沿下一个数据移出 _nop_(); // 5 } return BYTE; //返回接收字符 } /****************************读75hc165数据函数**************************/ /*函数原型:unsigned char series_I_165() /*函数功能:读75hc165数据 /*输入参数:无 /*输出参数:unsigned char /*调用模块: /*建立时间:2014/03/29 /*作者:杨建华 /**********************************************************************/ unsigned char series_I_165() { uchar i; uchar BYTE=0; //最终接收到得字符 Lock=0; //将165外部端口数据装入内部寄存器 _nop_(); Lock=1; //抬高为移位准备 for(i=0;i<8;i++) { BYTE<<=1; // 1 CLK=0; //时钟低 _nop_(); BYTE|=Data; //先接收高位 CLK=1; //时钟高,上升沿下一个数据移出 _nop_(); // 5 } return BYTE; //返回接收字符 } /****************************1602A写数据函数**************************/ /*函数原型:void ToASCII(signed int x) /*函数功能:1602A写数据 /*输入参数:要写入的数据 /*输出参数:ASCII[] /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void ToASCII(signed int x) { unsigned int a = 0; unsigned char w4,w3,w2,w1,w0; if(x<0) { ASCII[0] = 0x2d; } else { ASCII[0] = 0x20; } a = abs(x); w4 = a/10000; w3 = (a%10000)/1000; w2 = ((a%10000)%1000)/100; w1 = (((a%10000)%1000)%100)/10; w0 = (((a%10000)%1000)%100)%10; ASCII[1] = w4+0x30; ASCII[2] = w3+0x30; ASCII[3] = w2+0x30; ASCII[4] = w1+0x30; ASCII[5] = w0+0x30; } void displayASCII(uchar X, uchar Y,signed int Z) { unsigned char i=0; ToASCII(Z); for(i=0;i<6;i++) { Y &= 0x1; X &= 0xF;//限制X不能大于15,Y不能大于1 if (Y) X |= 0x40;//当要显示第二行时地址码+0x40; X |= 0x80;// 算出指令码 LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码 LCM_WriteData(ASCII[i]); X += 1; } } /****************************1602A写数据函数**************************/ /*函数原型:void LCM_WriteData(uchar WDLCM) /*函数功能:输入有符号整数,变更为预备显示的六位ASCII码 /*输入参数:要变更的数据 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void LCM_WriteData(uchar WDLCM) { uint m; //LCM_ReadStatus();//检测忙 Delay(5); //LCM_Data = WDLCM; Delay(5); LCM_RS = 1; Delay(5); LCM_RW = 0; Delay(5); for(m=0;m<8;m++) { if((WDLCM&0x01)==0x01) A_B=1; else A_B=0; CP=0; Delay(5); CP=1; Delay(5); CP=0; Delay(5); WDLCM=WDLCM>>1; //先将指令移位转换为串行数据 } LCM_E = 0;//若晶振速度太高可以在这后加小的延时 Delay(5); LCM_E = 1; Delay(5); } /****************************1602A写指令函数**************************/ /*函数原型:void LCM_WriteCommand(uchar WCLCM,BuysC) /*函数功能:1602A写指令 /*输入参数:要写入的指令 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void LCM_WriteCommand(uchar WCLCM,BuysC)//BuysC为0时忽略忙检测 { uint m; //if (BuysC) LCM_ReadStatus();//根据需要检测忙 Delay(5); //LCM_Data = WCLCM; Delay(5); LCM_RS = 0; Delay(5); LCM_RW = 0; Delay(5); for(m=0;m<8;m++) { if((WCLCM&0x01)==0x01) A_B=1; else A_B=0; CP=0; Delay(5); CP=1; Delay(5); CP=0; Delay(5); WCLCM=WCLCM>>1; //先将指令移位转换为串行数据 } LCM_E = 0; Delay(5); LCM_E = 1; Delay(5); } /****************************1602A读数据函数**************************/ /*函数原型:uchar LCM_ReadData(void) /*函数功能:1602A读数据 /*输入参数:无 /*输出参数:1602A返回的数据 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ uchar LCM_ReadData(void) { LCM_RS = 1; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; return(LCM_Data); } /****************************1602A读状态函数**************************/ /*函数原型:uchar LCM_ReadData(void) /*函数功能:1602A读状态 /*输入参数:无 /*输出参数:1602A返回的状态 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ uchar LCM_ReadStatus(void) { LCM_Data = 0xFF; LCM_RS = 0; LCM_RW = 1; LCM_E = 0; LCM_E = 0; LCM_E = 1; while (LCM_Data & 0x80);//检测忙信号 return(LCM_Data); } /****************************1602A初始化函数**************************/ /*函数原型:void LCM_Init(void) /*函数功能:1602A初始化 /*输入参数:无 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void LCM_Init(void) { LCM_Data = 0; LCM_WriteCommand(0x38,0);//三次显示模式设置,不检测忙信号 Delay5Ms(); LCM_WriteCommand(0x38,0); Delay5Ms(); LCM_WriteCommand(0x38,0); Delay5Ms(); LCM_WriteCommand(0x38,1);//显示模式设置,开始要求每次检测忙信号 LCM_WriteCommand(0x08,1);//关闭显示 LCM_WriteCommand(0x01,1);//显示清屏 LCM_WriteCommand(0x06,1);// 显示光标移动设置 LCM_WriteCommand(0x0C,1);// 显示开及光标设置 } /******************1602A按指定位置显示一个字符函数**********************/ /*函数原型:void DisplayOneChar(uchar X, uchar Y, uchar DData) /*函数功能:1602A按指定位置显示一个字符 /*输入参数:X坐标 Y坐标 要显示的字符 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void DisplayOneChar(uchar X, uchar Y, uchar DData) { Y &= 0x1; X &= 0xF;//限制X不能大于15,Y不能大于1 if (Y) X |= 0x40;//当要显示第二行时地址码+0x40; X |= 0x80;// 算出指令码 LCM_WriteCommand(X, 0);//这里不检测忙信号,发送地址码 LCM_WriteData(DData); } /*******************1602A按指定位置显示一串字符函数*********************/ /*函数原型:void DisplayListChar(uchar X, uchar Y, uchar code *DData) /*函数功能:1602A按指定位置显示一个字符 /*输入参数:X坐标 Y坐标 要显示字符串的首地址 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void DisplayListChar(uchar X, uchar Y, uchar code *DData) { uchar ListLength; ListLength = 0; Y &= 0x1; X &= 0xF;//限制X不能大于15,Y不能大于1 while (DData[ListLength]>0x20)//若到达字串尾则退出 { if (X <= 0xF)//X坐标应小于0xF { DisplayOneChar(X, Y, DData[ListLength]);//显示单个字符 ListLength++; X++; } } } /********************5ms延时函数************************/ /*函数原型:void Delay5Ms(void) /*函数功能:5ms延时 /*输入参数:无 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void Delay5Ms(void) { unsigned int TempCyc = 5552; while(TempCyc--); } /********************400ms延时延时函数************************/ /*函数原型:void Delay400Ms(void) /*函数功能:400ms延时延时 /*输入参数:无 /*输出参数:无 /*调用模块: /*建立时间:2014/03/28 /*作者:杨建华 /**********************************************************************/ void Delay400Ms(void) { uchar TempCycA = 5; unsigned int TempCycB; while(TempCycA--) { TempCycB=7269; while(TempCycB--); }; } /********************延时函数************************/ /*函数原型:void Delay(unsigned int x) /*函数功能:延时 /*输入参数:unsigned int x /*输出参数:无 /*调用模块: /*建立时间:2014/3/28 /*作者:杨建华 /**********************************************************************/ void Delay(unsigned int x) { while(x--); }

    Top_arrow
    回到顶部
    EEWORLD下载中心所有资源均来自网友分享,如有侵权,请发送举报邮件到客服邮箱bbs_service@eeworld.com.cn 或通过站内短信息或QQ:273568022联系管理员 高员外,我们会尽快处理。