基于51单片机的电压表
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电路原理图程序清单:
//*******************************头文件及宏定义************************** *
#include
#define TIME0H 0x3C
#define TIME0L 0xB0
#define uchar unsigned char
#define uint unsigned int
//******************端口设置********** #define OUTPORT P2 //ADC0809数据接口
#define LCDPORT P0 //LCD数据接口sbit SET=P1^3; //定义调整键sbit DEC=P1^4; //定义减少键sbit ADD=P1^5; //定义增加键uchar x=0; //计数器
sbit LCDRS=P3^5;// 寄存器选择信号sbit LCDRW=P3^6; //读写信号sbit LCDE=P3^7; //片选信号sbit LED1=P1^0; //下限提示灯sbit LED2=P1^1; //上限提示灯sbit START=P3^4;//ATART,ALE接口。0->1->0:启动AD转换。sbit EOC=P3^3; //转换完毕由0变1. sbit alarmflag=P1^2;
sbit CLK=P3^2;
//********************************全局变量***************************** unsigned int shangxian=300; //上限报警温度,默认值为38 unsigned int xiaxian=200; //下限报警温度,默认值为38 unsigned char uc_Clock=0;//定时器0中断计数bit b_DATransform=0; //启动adc0809转换时间到标志,为1是启动A/D转换bit lowflag; //下限标志bit highflag; //上限标志uchar set_st=0; //状态标志bit shanshuo_st; //闪烁间隔标志//******************************函数声明***************************** void vDelay(); // 延时函数
void vWriteCMD(unsigned char ucCommand);//把一个命令写入LCD函数void vWriteData(unsigned char ucData); //把一个数据写入LCD函数void vShowOneChar(unsigned char ucChar);//把一个字符写入LCD函数void vShowChar(unsigned char ucaChar[]); //把一组字符写入LCD函数void vShowVoltage(unsigned int uiNumber); //显示函数void vdInitialize(); //LCD初始化函数void Time0(); // 定时器0中断函数unsigned int uiADTransform(); // AD转换函数//*****外部中断0服务程序***** void int0(void) interrupt 0
{
EX0=0; //关外部中断0
if(DEC==0&&set_st==1)
{
vDelay();
do{}
while(DEC==0&&set_st==1); shangxian=shangxian-5;
if(shangxian } else if(DEC==0&&set_st==2) { vDelay(); do{} while(DEC==0&&set_st==2); xiaxian=xiaxian-5; if(xiaxian<0)xiaxian=0; } } //*****外部中断1服务程序***** void int1(void) interrupt 2 { EX1=0; //关外部中断1 if(ADD==0&&set_st==1) { vDelay(); do{} while(ADD==0&&set_st==1); shangxian=shangxian+5; if(shangxian>500)shangxian=500; } else if(ADD==0&&set_st==2) { vDelay(); do{} while(ADD==0&&set_st==2); xiaxian=xiaxian+5; if(xiaxian>shangxian)xiaxian=200; } } //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< { unsigned int uiResult; OUTPORT=0x00; START=1; //启动AD转换。 START=0; while(EOC==0); //等待转换结束。 OUTPORT=0xff; uiResult=OUTPORT; //出入转换结果。 uiResult=(100*uiResult)/51; //处理运算结果。 return uiResult; }