基于51单片机的8路电压采集与液晶显示.docx
- 文档编号:10980075
- 上传时间:2023-02-24
- 格式:DOCX
- 页数:13
- 大小:16.27KB
基于51单片机的8路电压采集与液晶显示.docx
《基于51单片机的8路电压采集与液晶显示.docx》由会员分享,可在线阅读,更多相关《基于51单片机的8路电压采集与液晶显示.docx(13页珍藏版)》请在冰豆网上搜索。
基于51单片机的8路电压采集与液晶显示
此程序分三部分,一是主程序,二是1602显示程序,三是ad08采样程序,附protues仿真图。
//*************************************************************************************************
//**<程序名>:
多路数字电压表采集
//**<功能>:
使用LCD1602显示被检测电压,精度为
0.05V,范围是0~5V。
//**<版本说明>:
这是第3版,使用LCD显示。
//**<作者>:
xx
//**<修改>:
xx
//**<完成时间>:
2011年11月18日
//*************************************************************************************************
//*头文件及宏定义
#include"includes.h"
#include 51.h> #defineTIME0H0x3C #defineTIME0L0xB0 //#defineabcP1 //****************************全局变量******************************//***************************************************************************unsignedcharuc_Clock=0;//定时器0中断计数 bitb_DATransform=0; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//把电压显示在LCD //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>voidvShowVoltage(unsignedintuiNumber){unsignedcharucaNumber[3],ucCount; if(uiNumber>999) uiNumber=999; ucaNumber[0]=uiNumber/100;//把计算数字的每个位存入数组。 ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10; ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1]; for(ucCount=0;ucCount<3;ucCount++){vShowOneChar(ucaNumber[ucCount]+48);//从首位到末位逐一输出。 if(ucCount==0) vShowOneChar('.');}} //************************************************************************************************* //*主函数 //************************************************************************************************* voidmain() {unsignedintm,g,k; unsignedcharabc; //for(m=0;m<8;m++) //{ //<<<<<<<<<<<<<<<<<设置定时器0>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>TMOD=0x01;//定时器0,模式1。 TH0=TIME0H; TL0=TIME0L; TR0=1; ET0=1;//启动定时器。 //开定时器xx。 EA=1;//开总xx vdInitialize(); vWriteCMD(0x84);//写入显示起始地址(第二行第一个位置) vShowChar("Voltage: "); vWriteCMD(0xC9); vShowChar("(V)"); while (1){abc=0x00; for(m=0;m<8;m++){P1=abc; abc++; if(b_DATransform==1){b_DATransform=0; vWriteCMD(0x80); vShowVoltage(m); vWriteCMD(0xC4); vShowVoltage(uiADTransform()); for(g=0;g<1000;g++) for(k=0;k<120;k++);}}}} //<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<定时器0中断函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>voidTime0()interrupt1{if(uc_Clock==0){uc_Clock=5; b_DATransform=1;}else uc_Clock--; TH0=TIME0H;//恢复定时器0。 TL0=TIME0L;}//***********************延时程序*********************************************//voidadelay() //{ //unsignedinti,k; //for(i=0;i<1000;i++) //for(k=0;k<120;k++); //} //<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<<<<<<< 51.h> #defineSTARTP3_4//ATART,ALE接口。 0->1->0: 启动AD转换。 #defineEOCP3_3//转换完毕由0变 1. #defineOUTPORTP2 //#defineabcP1 与十位之间。 unsignedintuiADTransform(){unsignedintuiResult; //unsignedcharabc; //for(m=0;m<8;m++) //abc=0x00; //P1=abc; START=1;//启动AD转换。 START=0; while(EOC==0);//等待转换结束。 //AD转换函数,返回转换结果。 //转换结果是3位数,小数点在百位uiResult=OUTPORT;//出入转换结果。 uiResult=(100*uiResult)/51;//处理运算结果。 //abc++; returnuiResult;}//******************************************************************* //******************SMC1602驱动程序************************* //*************************************************************************//<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<头文件及宏定义>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>#include"SM C1602.h" //<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<把1个命令写入LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>voidvWriteCMD(unsignedcharucCommand){vDelay();//先延时。 LCDE=1;//然后把LCD改为写入命令状态。 LCDRS=0; LCDRW=0; LCDPORT=ucCommand;//再输出命令。 LCDE=0;//最后执行命令。 }//<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<<<把1个数据写入LCD>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>voidvWriteData(unsignedcharucData){vDelay();//先延时。 LCDE=1;//然后把LCD改为写入数据状态。 LCDRS=1; LCDRW=0; LCDPORT=ucData;//再输出数据。 LCDE=0;//最后显示数据。 }voidvShowOneChar(unsignedcharucChar){switch(ucChar){case'': vWriteData(0x20);break; case'! ': vWriteData(0x21);break; case'"': vWriteData(0x22);break; case'#': vWriteData(0x23);break; case'$': vWriteData(0x24);break; case'%': vWriteData(0x25);break; case'&': vWriteData(0x26);break; case'>': vWriteData(0x27);break; case'(': vWriteData(0x28);break; case')': vWriteData(0x29);break; case'*': vWriteData(0x20);break; case'+': vWriteData(0x2A);break; case'-': vWriteData(0x2D);break; case'/': vWriteData(0x2F);break; case'=': vWriteData(0x3D);break; case'<': vWriteData(0x3E);break; case'? ': vWriteData(0x3F);break; case'.': vWriteData(0x2E);break; case': ': vWriteData(0x3A);break; case'0': vWriteData(0x30);break; case'1': vWriteData(0x31);break; case'2': vWriteData(0x32);break; case'3': vWriteData(0x33);break; case'4': vWriteData(0x34);break; case'5': vWriteData(0x35);break; case'6': vWriteData(0x36);break; case'7': vWriteData(0x37);break; case'8': vWriteData(0x38);break; case'9': vWriteData(0x39);break; case'A': vWriteData(0x41);break; case'B': vWriteData(0x42);break; case'C': vWriteData(0x43);break; case'D': vWriteData(0x44);break; case'E': vWriteData(0x45);break; case'F': vWriteData(0x46);break; case'G': vWriteData(0x47);break; case'H': vWriteData(0x48);break; case'I': vWriteData(0x49);break; case'J': vWriteData(0x4A);break; case'K': vWriteData(0x4B);break; case'L': vWriteData(0x4C);break; case'M': vWriteData(0x4D);break; case'N': vWriteData(0x4E);break; }case'O': vWriteData(0x4F);break; case'P': vWriteData(0x50);break; case'Q': vWriteData(0x51);break; case'R': vWriteData(0x52);break; case'S': vWriteData(0x53);break; case'T': vWriteData(0x54);break; case'U': vWriteData(0x55);break; case'V': vWriteData(0x56);break; case'W': vWriteData(0x57);break; case'X': vWriteData(0x58);break; case'Y': vWriteData(0x59);break; case'Z': vWriteData(0x5A);break; case'a': vWriteData(0x61);break; case'b': vWriteData(0x62);break; case'c': vWriteData(0x63);break; case'd': vWriteData(0x64);break; case'e': vWriteData(0x65);break; case'f': vWriteData(0x66);break; case'g': vWriteData(0x67);break; case'h': vWriteData(0x68);break; case'i': vWriteData(0x69);break; case'j': vWriteData(0x6A);break; case'k': vWriteData(0x6B);break; case'l': vWriteData(0x6C);break; case'm': vWriteData(0x6D);break; case'n': vWriteData(0x6E);break; case'o': vWriteData(0x6F);break; case'p': vWriteData(0x70);break; case'q': vWriteData(0x71);break; case'r': vWriteData(0x72);break; case's': vWriteData(0x73);break; case't': vWriteData(0x74);break; case'u': vWriteData(0x75);break; case'v': vWriteData(0x76);break; case'w': vWriteData(0x77);break; case'x': vWriteData(0x78);break; case'y': vWriteData(0x79);break; case'z': vWriteData(0x7A);break; default: break;}voidvShowChar(unsignedcharucaChar[]){unsignedcharucCount; for(ucCount=0;;ucCount++){vShowOneChar(ucaChar[ucCount]); if(ucaChar[ucCount+1]=='\0') break;}} //<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> //<<<<<<<<<<<<<<<<<<<<<<<<延时函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> voidvDelay(){unsignedintuiCount; for(uiCount=0;uiCount<250;uiCount++);}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 电压 采集 液晶显示