基于51單片機的電池過壓欠壓報警電路仿真、程序源碼
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- #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賦予LCM
- p_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賦予LCM
- p_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;
- }
- /*****主函數****/
- void main()
- { uchar loop,j;//
- uchar fb=0;
- lcd_init();
- delay(300);
- for(loop=0;loop<8;loop++)//行1
- { disp_Hz(loop,0,loop,fb);
- }
- //dianya=111;
- while(1)
- {
- get0804();
- filter();
- data_change(dianya);
- fb=0;
- if(shi)
- disp_Ez(4,4,shi,fb);
- else
- disp_Ez(4,4,12,fb);
- disp_Ez(5,4,ge,fb);
- disp_Ez(6,4,10,fb);
- disp_Ez(7,4,xiao1,fb);
- disp_Ez(8,4,xiao2,fb);
- disp_Ez(9,4,xiao3,fb);
- disp_Ez(10,4,11,fb);
-
- if(dianya<=204)
- {
- beep=~beep;
- jidianqi=~jidianqi;
-
- j++;
- if(j<5)
- {
- fb=0;
- }
- if(j>=5)
- {
- fb=1;
- if(j==10) j=0;
- }
- for(loop=0;loop<8;loop++)//行1
- { disp_Hz(loop,6,loop+8,fb);
- }
- }
- else
- {
- fb=0;
- for(loop=0;loop<16;loop++)//行1
- { disp_Ez(loop,6,12,fb);
- }
- beep=1;
- jidianqi=0;
-
- }
- }
- }
- uchar code HZ[]=
- {
- 0x00,0x00,0x40,0x40,0x42,0x44,0x44,0x44,
- 0x58,0x44,0x40,0x44,0x40,0x44,0x7F,0x44,
- 0x40,0x44,0x40,0x44,0x50,0x44,0x48,0x44,
- 0xC6,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,/*"當",0*/
- 0x08,0x00,0x08,0x00,0xE8,0xFF,0x29,0x09,
- 0x2E,0x49,0x28,0x89,0xE8,0x7F,0x08,0x00,
- 0x08,0x00,0xC8,0x0F,0x0C,0x40,0x0B,0x80,
- 0xE8,0x7F,0x08,0x00,0x08,0x00,0x00,0x00,/*"前",1*/
- 0x12,0x00,0x12,0x00,0x12,0xFA,0x52,0xAA,
- 0x77,0xAB,0x52,0xAB,0xD2,0xAA,0xDA,0xFA,
- 0x52,0xAA,0x52,0xAA,0x37,0xAA,0x92,0xAA,
- 0x12,0xFB,0x12,0x06,0x12,0x00,0x00,0x00,/*"蓄",2*/
- 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
- 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
- 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"電",3*/
- 0x10,0x04,0x60,0x04,0x02,0x7E,0xCC,0x01,
- 0x80,0x00,0x80,0x00,0xFC,0x3F,0x40,0x40,
- 0x20,0x40,0xFF,0x4F,0x10,0x40,0x08,0x44,
- 0xF8,0x47,0x00,0x40,0x00,0x78,0x00,0x00,/*"池",4*/
- 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
- 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
- 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"電",5*/
- 0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40,
- 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
- 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44,
- 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*"壓",6*/
- 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",7*/
- 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
- 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
- 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
- 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"電",0*/
- 0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40,
- 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
- 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44,
- 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*"壓",1*/
- 0x40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F,
- 0x00,0x20,0x08,0x40,0x48,0x40,0x88,0x41,
- 0x08,0x40,0x08,0x48,0x08,0x50,0xFF,0x4F,
- 0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,/*"過",2*/
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
電池過壓欠壓報警電路proteus文件.rar
(176.29 KB, 下載次數: 39)
2020-6-16 11:56 上傳
點擊文件名下載附件
|