找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23|回复: 0
打印 上一主题 下一主题
收起左侧

基于单片机的数字电压表

[复制链接]
跳转到指定楼层
楼主
ID:878163 发表于 2021-1-16 17:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <reg52.h>                                 
#include<intrins.h>
#include <string.h>
#define uint unsigned int
#define uchar unsigned char
sbit adcs=P3^2;                    //端口定义
sbit adwr=P3^6;
sbit adrd=P3^7;
sbit RS = P3^5;
sbit RW = P3^6;
sbit E= P3^4;
uint Result_ADC0804;        //转换结果变量
uchar Display_Buffer[2][16] ={{"CurrentVoltage:"},{"(CH)=0.00V"}};    //函数声明
uchar Get_Value_ADC0804();               //获取指定通道A/D转换结果
void Refesh_Disp_Buffer();            //刷新显示缓冲
void LCD_Busy_Check();                     //忙检查
void LCD_Write_Command(uchar cmd); //向lcd写入命令
void Write_LCD_Data(uchar dat);    //向lcd写入数据
void Initialize_LCD1602();              //液晶初始化函数
void LCD_Display(uchar str[]);        //在lcd上显示字符串
void DelayMS(uint X);                     //延时
uchar Read_State();                          //读取lcd的状态
void main()                       //主程序
{uchar j;
Initialize_LCD1602();     //液晶初始化函数
while(1)                 //循环显示
{
for(j=0;j<2;j++)     
{
Get_Value_ADC0804();   //A/D转换
Refesh_Disp_Buffer();  //刷新显示缓冲
if (j==0)
{
LCD_Write_Command(0x80);              //写lcd命令,设置从第0行位置开始显示
LCD_Display(Display_Buffer[j]);  //在lcd上显示字符串
}
else
{
LCD_Write_Command(0xC0);             //写命令,设置从第1行位置开始显示
LCD_Display(Display_Buffer[j]); //在lcd上显示字符串
}
}}}
uchar Get_Value_ADC0804() //获取指定通道的A/D转换结果
{adcs=0;                                  //片选信号输入端,低电平有效
adwr=0;                                 //开始写入信号
_nop_();_nop_();              //2个机器周期,将写入的模拟信号转换为数字信号         
adwr=1;                                    //关闭写入
DelayMS(1);                                   //延时
adrd=0;                                    //输出信号
_nop_();_nop_();              //2个机器周期,将转换的信号输出到P1端口
Result_ADC0804=P1;                 //将输出的信号赋给Result_ADC0804
adrd=1;                                    //关闭输出
DelayMS(1);                                   //延时
adcs=1;                                    
}
void Refesh_Disp_Buffer()                    //刷新显示脉冲
{
uint t=(Result_ADC0804*500.0)/255;   //将A/D输出的结果转换为2进制数
Display_Buffer[1][5] = t/100+'0';   //显示个位
Display_Buffer[1][7] = t/10%10+'0';     //显示十分位
Display_Buffer[1][8] = t%10+'0';   //显示百分位
}
void DelayMS(uint X)                      //延时程序
{
uchar i;
while(X--)
for(i=0;i<120;i++);                        //延时10us
}
uchar Read_State()                           //读取lcd的状态
{uchar state;
RS=0;                                                
RW=1;
E=1;                                                  //RS=0,RW=1,E=1 读状态
state=P0;                                          //输出D0~D7
DelayMS(1);
E=0;
DelayMS(1);
return state;
}
void LCD_Busy_Check()                       //忙等待
{while(Read_State()&&0x80!=0x80);
DelayMS(1);
}
void LCD_Write_Command(uchar cmd)            //向lcd写入命令
{
LCD_Busy_Check();                        //忙等待
RS=0;                  
RW=0;               
P0=cmd;                                            //将命令赋给P0端口
E=1;                                            //RS=0,RW=0,E=1 写指令            
E=0;
}
void Write_LCD_Data(uchar dat)                //向lcd写入数据
{
LCD_Busy_Check();
RS=1;                        
RW=0;
P0=dat;
E=1;                                                           //RS=1,RW=0,E=1 写数据
DelayMS(1);
E=0;
}
void Initialize_LCD1602()                       //lcd初始化
{
LCD_Write_Command(0x38);DelayMS(1);             //功能设置,数据长度为8位,双行显示,5*7点阵
LCD_Write_Command(0x0C);DelayMS(1);            //显示开,关光标
LCD_Write_Command(0x06);DelayMS(1);             //字符进入模式:屏幕不动,字符后移
LCD_Write_Command(0x01);DelayMS(1);             //清屏
}
void LCD_Display(uchar str[])                    //在lcd上显示字符串
{
uchar k;
for(k=0;k<=strlen(str);k++)
{
Write_LCD_Data(str[k]);                            //依次在lcd上显示字符串
DelayMS(1);
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表