欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

基于51单片机的电池过压欠压报警电路protues仿真

发布时间:2023/12/9 编程问答 22 豆豆
生活随笔 收集整理的这篇文章主要介绍了 基于51单片机的电池过压欠压报警电路protues仿真 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

硬件设计

(末尾附文件)

仿真图:

代码设计

#include <reg52.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int #define lcm P1 sbit p_csl=P0^4; sbit p_csr=P0^3; sbit p_di=P0^2; sbit p_rw=P0^1; sbit p_e=P0^0; sbit p_rst=P0^7; sbit ad_INTR=P2^4; sbit ad_RD=P2^5; sbit ad_WR=P2^6; sbit beep = P2^0; //蜂鸣器IO口定义 sbit jidianqi=P2^1; uchar code HZ[]; uchar code Ez[]; uint shi,ge,xiao1,xiao2,xiao3,get,get_l; uint dianya;//电压实际是浮点数,这个电压实际是指AD转化完成后得到的二进制数据,电压的范围定位0到15V//那么得到的真实电压应该是dianya*15整除255得到整数部分,对255取余再乘100对255取余,得到小数部分 /*****函数声明********/ void delay(uint k); void wcode(uchar c,uchar csl,uchar csr); void wdata(uchar c,uchar csl,uchar csr); void set_statrline(uchar i); void set_xy(uchar x,uchar y); void dison_off(uchar o); void reset(); void lcd_init(void); void lw(uchar x,uchar y,uchar dd);//写数据函数 void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb);//显示汉字 void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb); void data_change(uint x);//数据转化将AD得到的数据按位转化为数字方便显示 void Tdelay(unsigned int i); void get0804(); //延时 void Tdelay(unsigned int i) {while(i--); } void get0804() {ad_WR=0;Tdelay(5) ;ad_INTR=0;Tdelay(5) ;ad_INTR=1;Tdelay(5) ;ad_WR=1;Tdelay(5);P1=0xff ; ad_WR=0;Tdelay(5);ad_RD=0;Tdelay(30);get=P3;Tdelay(5);ad_RD=1;Tdelay(5);ad_WR=1; } void delay(uint k) { uint i;for(;k>0;k--){ for(i=0;i<124;i++){;}} } // //LCM忙判断 void lcd_busy(void) { p_di=0;p_rw=1;/*lcm=0xff;while(1){ p_e=1;if(lcm<0x80)break;p_e=0;}p_e=0;*/ } //写指令到LCM void wcode(uchar c,uchar csl,uchar csr) { p_csl=csl;p_csr=csr;lcd_busy();p_di=0;p_rw=0;lcm=c;//将变量C赋予LCMp_e=1;p_e=0; } //写数据到LCM子函数 void wdata(uchar c,uchar csl,uchar csr) //c表示的是要写的数据8个二进制位 { p_csl=csl;p_csr=csr;lcd_busy();p_di=1;p_rw=0;lcm=c;//将变量C赋予LCMp_e=1;p_e=0; } //设定起始行 void set_startline(uchar i) { i=0xc0+i;wcode(i,1,1); } //定位X方向,Y方向 void set_xy(uchar x,uchar y) { x=x+0x40;y=y+0xb8;wcode(x,1,1);wcode(y,1,1); } //屏幕开启、关闭 void dison_off(uchar o) { o=o+0x3e; //o为1为开,为0是关wcode(o,1,1); } //复位子函数 void reset() {//delay(1000);p_rst=0;delay(20);p_rst=1;delay(20); } //LCM初始化 void lcd_init(void) { uchar x,y;reset();dison_off(0);for(y=0;y<8;y++) { for(x=0;x<128;x++)lw(x,y,0);}dison_off(1);set_startline(0); } //写数据到LCM void lw(uchar x,uchar y,uchar dd) //先定位,再写入数据 { if(x>=64){ set_xy(x-64,y);wdata(dd,0,1);//写右半屏 }else{ set_xy(x,y);wdata(dd,1,0);} } //显示汉字子函数 void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb)//xx为该行第xx个字,共8字,yy为第几行,共8行,n为字库中第N个字。 { uchar i,dx;for(i=0;i<16;i++){ dx=HZ[2*i+n*32]; //2*i为选择偶数行,因其为列扫描 一个字在X方向应该是16个像素,因为用的是整列16个从上到下编码每一列占两个字符if(fb)dx=255-dx;//反白显示lw(xx*16+i,yy,dx);dx=HZ[(2*i+1)+n*32];if(fb)dx=255-dx;lw(xx*16+i,yy+1,dx);} } void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb)//显示数字或英语 { uchar i,dx;for(i=0;i<8;i++){ dx=Ez[2*i+n*16];if(fb)dx=255-dx;lw(xx*8+i,yy,dx);// dx=Ez[(2*i+1)+n*16];if(fb)dx=255-dx;lw(xx*8+i,yy+1,dx);} } void filter()//限幅滤波 {int x;x=get-get_l;if(x>10 & x<-10) dianya=get_l;else dianya=get;get_l=get; } void data_change(uint x) {uint i,j;i=(x*15)/255;j=((x*15)%255)*200/51;//本来应该是 ((x*15)%255)*1000/255 会出现溢出shi=i/10;ge=i%10;xiao1=j/100;xiao2=j%100/10;xiao3=j%100%10; }

.

链接:https://pan.baidu.com/s/1Bf10asnN2QO8I8yJpGT5_Q
提取码:yogv

.

总结

以上是生活随笔为你收集整理的基于51单片机的电池过压欠压报警电路protues仿真的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。