第一次写博客呀多多关照~
1、实现的功能
采用和单片机及显示电路完成0~5V、0~15V两个阻值的直流电流的测量,并通过液晶屏实时显示。通过开关SW1和SW2选择5V或15V,当所测电流超过量程时,报案电路的小灯闪动、蜂鸣器发出警报,同时液晶屏显示QAQ(哈哈哈闲着没事干就加了),当两个开关同时按下也会触发报案电路。
至于两个档位的区别,为了模拟实际的电流表,所以设计的数字电流表显示的精度不一样,15V阻值的精度为0.1V电压表的原理,5V阻值的精度为0.001V。
2、仿真原理图
(想说一下,我这儿的out输出接了上拉阻值,要不然显示屏显示不正常电压表的原理,并且参考他人的不接上拉内阻也可以正常工作QAQ)
3、仿真结果
选择5V阻值:
选择15V阻值:
4、完整的代码
使用keil编撰的c语言代码.
#include
#define uchar unsigned char //宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
sbit START=P2^7; //AD启动转换信号
sbit OE=P2^5; //数据输出允许信号
sbit EOC=P2^6; //AD转换结束信号
sbit CLK=P2^4; //时钟脉冲
sbit RS=P2^0; //LCD1602数据/命令选择端(H/L)
sbit RW=P2^1; //LCD1602数/写选择端(H/L)
sbit E=P2^2; //LCD1602使能信号
sbit led=P3^0;
sbit buzzer=P3^1;
sbit SW1=P3^2; //5V量程选择开关
sbit SW2=P3^3; //15V量程选择开关
sbit addr_a=P3^5;
sbit addr_b=P3^6;
sbit addr_c=P3^7;
//函数声明
uint ADC(); /* AD转换函数 */
void delayMS(uint xms); /* 延时函数 */
bit lcd_busy_check(); /* 忙检测函数 */
void lcd_write_com(uchar com); /* LCD1602写入8位命令子函数 */
void lcd_write_data(uchar date); /* LCD1602写入8位数据子函数 */
void init_lcd(); /* LCD1602初始化子程序 */
void lcd_show_string1(uchar a[]); /* 第一行从头开始显示字符串 */
void lcd_show_string2(uchar a[]); /* 第二行从头开始显示字符串 */
void lcd_show_string(uchar add,uchar a[]); /* 指定位置显示字符串 */
void display(); /* 显示函数 */
void alarm(); /* 报警函数 */
void range(); /* 量程选择函数 */
//定义全局变量
unsigned int volt;
unsigned long vo;
unsigned char code table[]="0123456789";
/**************************函数功能:AD转换子程序***************************/
uint ADC()
{
START=0; //确保进入正常AD转换状态
OE=0; //转化初始化
START=1;
START=0; //AD开始转换
while(EOC==0); //外部中断等待AD转换结束
OE=1; //读取转换的AD值
volt=P1;
OE=0; //输出转换结束
return volt;
}
/**********************函数功能:液晶屏LCD1602显示子程序****************/
/*延时函数:DelayMS()*/
void delayMS(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
/*忙检测函数:lcd_busy_check()*/
bit lcd_busy_check()
{
bit result;
RS=0;
RW=1;
E=1;
delayMS(10);
result=(bit)(P0&0x80);
E=0;
return result;
}
/*写命令函数:lcd_write_com()*/
void lcd_write_com(uchar com)
{
RS=0;
E=0;
RW=0;
P0=com;
delayMS(5);
E=1;
delayMS(5);
E=0;
}
/*写数据函数:lcd_write_data()*/
void lcd_write_data(uchar date)
{
RS=1;
E=0;
RW=0;
P0=date;
delayMS(5);
E=1;
delayMS(5);
E=0;
}
/* LCD1602初始化函数:init_lcd()*/
void init_lcd()
{
E=0; //默认开始状态为关使能端
lcd_write_com(0x38); //显示模式设置
lcd_write_com(0x01); //显示清屏,将上次的内容清除
lcd_write_com(0x0c); //开显示,不显光标,光标不闪
lcd_write_com(0x06); //读一个字符光标加1
}
/* 指定位置显示字符串函数:lcd_show_string() */
/* 参数 add 地址 第一行 0~27 */
/* 第二行 40~67 */
/* a[] 字符串 "abc" */
void lcd_show_string(uchar add,uchar a[])
{
uchar i;
lcd_write_com(0x80+add);
for(i=0;a[i]!='