基于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)
|