基于51单片机的电池过压欠压报警电路protues仿真
生活随笔
收集整理的這篇文章主要介紹了
基于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仿真的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sscanf与正则表达式
- 下一篇: go语言中的方法method