|
单片机数字电流表电压表电路原理图如下:
单片机源程序如下:
- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include<stdio.h>
- #include "1602.h"
- #include "delay.h"
- #include "i2c.h"
- char dis0[16]; //打印数组初始化
- unsigned long time_20ms=0; //定时器计数
- float Volt=0.0; //检测电压
- float Acurrent=0.0; //检测电流
- void Init_Timer0(void); //函数声明
- void uartSendStr(unsigned char *s,unsigned char length);
- void UART_Init(void);
- void uartSendByte(unsigned char dat);
- void main (void)
- {
- unsigned char midvolt,midcur; //电压电流中间变量值
- Init_Timer0(); //定时器0初始化
- UART_Init(); //串口初始化
-
- LCD_Init(); //初始化液晶
- DelayMs(20); //延时有助于稳定
- LCD_Clear();
- sprintf(dis0,"My Designer!! ");//打印
- LCD_Write_String(0,0,dis0);//显示第一行
- sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
- LCD_Write_String(0,1,dis0);//显示第二行
- uartSendStr("reday ok!!",10);
- while (1) //主循环
- {
- midvolt=ReadADC(1); //读取AD检测到的 电压值
- DelayMs(50); //延时有助于稳定
- midcur=ReadADC(0); //读取电流转化后的电压值
- Volt=(float)midvolt*5.13/255*3; //计算出电压 *3表示分压值
- Acurrent=(float)midcur*5.13/255; //计算出电流
-
- if(Acurrent>2.62) //如果电流转换后的电压值超过2.62
- {
- Acurrent=(Acurrent-2.62)/0.185; //电流模块 电压转换计算
- }
- else
- {
- Acurrent=0;
- }
- sprintf(dis0,"V:%3.2fv A:%3.2fA",Volt,Acurrent);//打印电压电流值
- LCD_Write_String(0,1,dis0);//显示第二行
- // uartSendStr(dis0,16); //串口上报
- // uartSendStr("\n",1); //换行
- DelayMs(200); //延时有助于稳定
- }
- }
- void Init_Timer0(void)
- {
- TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
- EA=1; //总中断打开
- ET0=1; //定时器中断打开
- TR0=1; //定时器开关打开
- }
- void Timer0_isr(void) interrupt 1
- {
- TH0=(65536-20000)/256; //重新赋值 20ms
- TL0=(65536-20000)%256;
-
- time_20ms++;
- }
- void UART_Init(void)
- {
- SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
- TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
- TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz
- TL1 = TH1;
- TR1 = 1; // TR1: timer 1 打开
- EA = 1; //打开总中断
- ES = 1; //打开串口中断
- }
- void uartSendByte(unsigned char dat)
- {
- unsigned char time_out;
- time_out=0x00;
- SBUF = dat; //将数据放入SBUF中
- while((!TI)&&(time_out<100)) //检测是否发送出去
- {time_out++;DelayUs2x(10);} //未发送出去 进行短暂延时
- TI = 0; //清除ti标志
- }
- void uartSendStr(unsigned char *s,unsigned char length)
- {
- unsigned char NUM;
- NUM=0x00;
- while(NUM<length) //发送长度对比
- {
- uartSendByte(*s); //放松单字节数据
- s++; //指针++
- NUM++; //下一个++
- }
- }
- void UART_SER (void) interrupt 4 //串行中断服务程序
- {
- if(RI) //判断是接收中断产生
- {
- RI=0; //标志位清零
- }
- if(TI) //如果是发送标志位,清零
- TI=0;
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
|
评分
-
查看全部评分
|