基于stc89c52单片机设计电压表程序

所需积分/C币:50 2018-08-12 20:03:07 272KB PDF
1
收藏 收藏
举报

目前单片机渗透到生活中的各个领域,广泛用于智能仪表、家用电器、医 疗设备、工业控制等诸多领域。本文使用单片机设计电压表, 具有开机后密码解锁,测量 0-5v 电压,以及输出 0-5v 间电压的功能。对该电压 表的设计使用了模块化的设计特点,主要用到了 C51 系列型号为 STC89C52RC 单 片机的矩阵键盘模块、AD/DA 转换模块、LCD 显示模块。该电压表相比于一般的 电压表,特点是体现了人机界面交互,即使用密码解锁后方可使用,与此同时, 进行电压输出时,可旋转变压器改变输出值。
unsigned char for(=0<8++)/*要传送的数据长度为8位树 f(c<<i)&0x80)da=1;/判断发送位 else sda=o nop sc|=1 置时钟线为高,通知被控器开始接收数据位 ; nop_0: /保证时钟高电平周期大于4μs nop o nop_o nop( sc|=0 nop_o nop_0 sda=1: /*8位发送完后释放数据线,准备接收应答位 nop_o nop_o nop_o op_0 p if(sda==1ack=0; else ack=1 /判断是否接收到应答信号* nop nop_o 字节数据接收函数 函数原型: UCHAR2 C_RCVByte( 功能 用来接收从器件传来的数据并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 大六大大士大大★★★★★★大大★大大大大水大大大大★大大★大大大大大x大大大大大头x大实x大实大x大 unsigned char 2C_Rcv Byte unsigned char retc=O, i da=1: /置数据线为翰入方式 for(=0;<8;1++) lop_0 scl=O /置时钟线为低,准备接收数据位* nop o p0; /时钟低电平周期大于475+ no no ppp Sc=1 /置时钟线为高使数据线上数据有效 nop_o nop_0 retc=retc<<1 f(sda=1)retc=retc+1;/读数据位接收的数据位放入retc中x pp_O n oo pp_0 nop_o return(retc 女★大★大★★★大★大★火★大★大★大★★★大★大★大文大x大x★大文★x头x大大大士★大★大★士★头★★★ 应答子函数 函数原型: void ack|2c(bita) 功能 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) 大大大大大大大大十大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大大 void Ack_12c(bit a i(a==0)da=0 /在此发出应答或非应答信号* else sda=1 /0为发出应答,1为非应答信号* p_0 p_0 no p_0; nop_o /时钟低电平周期大于4us*/ nop_o 0; sc|=0: /*清时钟线,住|2C总线以便继续接收 nop_o ★★大为大大★火★火大大大大★大大大太火X大x大x大x大X大x大x大x大X大X大大大大大大大大★火大★ *函数名 Pcf8591 DaConversion 函数功能 PCF8591的输出端输出模拟量 *翰入 adr(器件地址), channel(转换通道), value(转换的数值) k输出 无 k大*大*★★大★大★大★★★大★*大大大*大**大大 bit Pcf8591_Da Conversion(unsigned char addr, unsigned char channel, unsigned char val) Start_12co ∥/启动总线 2C_ Send Byte(addr); 发送器件地址 f(ack==O)return(O) 12C_Send Byte(0x40 channel) /发送控制字节 t(ack==return(O) 12C- Send byte val) ∥/发送DAC的数值 flack==return(o) Stop 12c0 结束总线 return(1) 大★★计★★大★大★★★★大★★★大★大计大大★大xx大实太x大x大x大x大x大x大x大大大★大大头★★ 函数名 Pct8591 Send Byte 函数功能 写入一个控制命令 k输入 adr(器件地址), channel(转换通道) 输出 无 大六大十★大大★大大大★大大大★★大★大大大大★大大大大大大大★大大大大 bit PCF8591_ Send Byte(unsigned char addr, unsigned char channel) rt_12 c0 /启动总线 12C_Send Byteladdr) ∥/发送器件地址 if(ack==return(o) 12C_ Send Byte(0x40 channel) ∥/发送控制字节 if(ack==return(o) Stop_12 c0 结束总线 return(1) ★★★★★大★大★★★★大★大大★★大大★大★大★★大x大x大x大文大x大x大x大x大x大x大大火大大大★★★大★ 函数名 PCF8591 RcV Byte 函数功能 读取一个转换值 输入 输出 dat 大大★★大★★★★大★★大大★★大★大★★★★大★★大大大大大大大大大大大大大大大大★大大大x大x大x大x大★大实 unsigned char PCF8591_RcvByte(unsigned char addr) unsigned char dat Start 12c(; 启动总线 12C_Send Byte(addr+1); ∥发送器件地址 if(ack==Return(O) dat=12C_Rcv Byte O /读取数据0 Ack_12c(1; 送非应答信号 Stop_ 12co ∥结束总线 return(dat) /大木大★大大大大大★大大才大大大x大x大x大x大xx大x大大才★大大大大大大★大★大大/ 1602液晶屏相关函数 /★大大大大大大大大xxxx大xx大x大x大x大x大大才大大大大★才才大才/ void Delay Us(unsigned char us)//delay us unsigned char uscnt uscnt=us>>1; /* Crystal frequency in 12MHz*/ hile(--uscnt) 女★★★★★★★★★★★★★★★文文★大大文★x头文★x文★★★★★★★★/ void DelayS(unsigned char ms) //delay Ms hile(--ms) DelayS(250) DelayS(250) DelayS(250 DelayS(250): void Write Command (unsigned char c) DelayMs(5); //short delay before operation E=0 rs rw p0; E=1; Data=c E=0 /**大*大*★★**★* x*x*x*x*x*x*x*x*x大x void WriteData(unsigned char c) DelayMs(5); //short delay before operation E=0: rs=1 rW=0; nop_o E=1; Data=c E=0 /大六★大大大大大大大大大大大大六大大x六大★大★大★大★大六★大大★★大 void Show Char(unsigned char pos, unsigned char c) unsigned char p if (p p=pos+0xb0;/是第二行则命令代码高4位为0x 你=p00×30/足第二行则命令代码高4位为0×8 rite Command(p); //write command Write Data(c); //write data ★★★★★★★★★★★★★★★★★★★★★★★★*★*★文★文★文★文★文★文★文★文★文★文★★★★★★女★女*女*女*女*女★女★★女★ void Show String(unsigned char line, char *+ptr) unsigned char I =line<<4 for(=016++) Show Char(+,(ptr+);/循环显示16个字符 ★★★★★★大★大★★★★★★大★大★★★★★大大x大x大文大x大x大x大x大文大x大x大大★大★大★★★大★★★女大★★ void InitLcdo Delay Ms(15) Write Command(0x 38); //display mode Write Command(0x38); //display mode ommand(0x 38); //display mo WriteCommand(o×06);//显示光标移动位置 Writecommand(0×0c;显示开及光标设置 WriteCommand(0×01);/显示清屏 oid disp(void) FirstLine 2]='l FirstLine44]=N: FirstLine b3= FirstLine 6= FirstLine 9]=0+TempData2; FirstLine [11]=0+TempData3 FirstLine[10]= FirstLine [13]=V SecondLine[2]='o Second[4]=T dLine 3='l SecondLine[6]= SecondLine g=0+TempData[6 SecondLine[11]=0+TempData[71 Second[ l0 SecondLine[13]=v Show String(o, FirstLine Show String(1, SecondLine) 延时程序 void mDelayunsigned char j unsigned int i for (j>o j for(=0<125+ void delayuint xms)∥廷迟Xms for(i=xms; i>0; --) r(j=112」>0j--); void display()∥数码管显示函数 if(table l==0)&(table[2]==1)&(table3==2)&(table 4==3)) flag =1; void keyscan4x40 uchar temp, key, /第一行扫描∥ P3=0×fe;/1111110让P3.0口输出低 temp=P3 temp=temp&0xf0/1110000位与操作屏蔽后四位 if(temp!=0×0) delay(10) temp=P3 temp=temp&O×fo if(temp!=0×f0) temp=P3 switch(temp) case0xee:/11101110S1被按下 key=0 break case uxde /11011110S2被按下 key=1 break case Oxbe /10111110S3被按下 break case Ox7e /01111110S4被按下 break while(temp!=Oxf temp=P3 temp=temp&O×f0 tableinil=key n|+ if(ini>4 onetlag /1第二行扫描 P3=0xfd;//11101让P31口输出低 temp=P3 temp=temp&0xf0;/1110000位与操作屏蔽后四位 f(temp!=0×f0) delay (10) temp=P3 temp=temp& Oxfo f(temp!=0×f( temp=P3 h(temp) case0xed://11101101S5被按下 key=4 break case Odd /11011101S6被按下 key break case oxid 10111101S7被按下 break case Oxid //01111101S8被按下 key=7

...展开详情
试读 14P 基于stc89c52单片机设计电压表程序
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
    最新推荐
    基于stc89c52单片机设计电压表程序 50积分/C币 立即下载
    1/14
    基于stc89c52单片机设计电压表程序第1页
    基于stc89c52单片机设计电压表程序第2页
    基于stc89c52单片机设计电压表程序第3页

    试读结束, 可继续读2页

    50积分/C币 立即下载 >