找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2718|回复: 0
打印 上一主题 下一主题
收起左侧

51单片机+ADC0804的电池过压欠压报警Proteus仿真电路+程序

[复制链接]
跳转到指定楼层
楼主
基于51单片机的电池过压欠压报警电路仿真、程序源码
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. #define lcm P1
  6. sbit p_csl=P0^4;
  7. sbit p_csr=P0^3;
  8. sbit p_di=P0^2;
  9. sbit p_rw=P0^1;
  10. sbit p_e=P0^0;
  11. sbit p_rst=P0^7;
  12. sbit ad_INTR=P2^4;
  13. sbit ad_RD=P2^5;
  14. sbit ad_WR=P2^6;
  15. sbit beep = P2^0;   //蜂鸣器IO口定义
  16. sbit jidianqi=P2^1;
  17. uchar code HZ[];
  18. uchar code Ez[];
  19. uint shi,ge,xiao1,xiao2,xiao3,get,get_l;
  20. uint dianya;//电压实际是浮点数,这个电压实际是指AD转化完成后得到的二进制数据,电压的范围定位0到15V//那么得到的真实电压应该是dianya*15整除255得到整数部分,对255取余再乘100对255取余,得到小数部分
  21. /*****函数声明********/
  22. void delay(uint k);
  23. void wcode(uchar c,uchar csl,uchar csr);
  24. void wdata(uchar c,uchar csl,uchar csr);
  25. void set_statrline(uchar i);
  26. void set_xy(uchar x,uchar y);
  27. void dison_off(uchar o);
  28. void reset();
  29. void lcd_init(void);
  30. void lw(uchar x,uchar y,uchar dd);//写数据函数
  31. void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb);//显示汉字
  32. void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb);
  33. void data_change(uint x);//数据转化将AD得到的数据按位转化为数字方便显示
  34. void Tdelay(unsigned int i);
  35. void get0804();       
  36. //延时
  37. void Tdelay(unsigned int i)
  38. {
  39. while(i--);
  40. }
  41. void get0804()       
  42. {
  43.         ad_WR=0;
  44.         Tdelay(5) ;
  45.         ad_INTR=0;
  46.         Tdelay(5) ;
  47.         ad_INTR=1;
  48.         Tdelay(5) ;
  49.         ad_WR=1;
  50.         Tdelay(5);
  51.         P1=0xff ;
  52.         ad_WR=0;
  53.         Tdelay(5);
  54.         ad_RD=0;
  55.         Tdelay(30);
  56.     get=P3;
  57.         Tdelay(5);
  58.         ad_RD=1;
  59.         Tdelay(5);
  60.         ad_WR=1;       
  61.         }
  62. void delay(uint k)
  63. {        uint i;
  64.     for(;k>0;k--)
  65.          {        for(i=0;i<124;i++)
  66.               {;}
  67.           }
  68. }
  69. //
  70. //LCM忙判断
  71. void lcd_busy(void)
  72. {        p_di=0;
  73.     p_rw=1;
  74.     /*lcm=0xff;
  75.     while(1)
  76.      {  p_e=1;
  77.         if(lcm<0x80)
  78.          break;
  79.         p_e=0;
  80.      }
  81.     p_e=0;*/
  82. }
  83. //写指令到LCM
  84. void wcode(uchar c,uchar csl,uchar csr)
  85. {        p_csl=csl;
  86.     p_csr=csr;
  87.     lcd_busy();
  88.     p_di=0;
  89.     p_rw=0;
  90.     lcm=c;//将变量C赋予LCM
  91.     p_e=1;
  92.     p_e=0;
  93. }
  94. //写数据到LCM子函数
  95. void wdata(uchar c,uchar csl,uchar csr)        //c表示的是要写的数据8个二进制位
  96. {        p_csl=csl;
  97.     p_csr=csr;
  98.     lcd_busy();
  99.     p_di=1;
  100.     p_rw=0;
  101.     lcm=c;//将变量C赋予LCM
  102.     p_e=1;
  103.     p_e=0;
  104. }
  105. //设定起始行
  106. void set_startline(uchar i)
  107. {        i=0xc0+i;
  108.     wcode(i,1,1);
  109. }
  110. //定位X方向,Y方向
  111. void set_xy(uchar x,uchar y)
  112. {        x=x+0x40;
  113.     y=y+0xb8;
  114.     wcode(x,1,1);
  115.     wcode(y,1,1);
  116. }
  117. //屏幕开启、关闭
  118. void dison_off(uchar o)
  119. {        o=o+0x3e;  //o为1为开,为0是关
  120.     wcode(o,1,1);
  121. }
  122. //复位子函数
  123. void reset()
  124. {//delay(1000);
  125.            p_rst=0;
  126.     delay(20);
  127.     p_rst=1;
  128.    delay(20);
  129. }
  130. //LCM初始化
  131. void lcd_init(void)
  132. {        uchar x,y;
  133.     reset();
  134.    
  135.     dison_off(0);
  136.     for(y=0;y<8;y++)
  137.      { for(x=0;x<128;x++)
  138.          lw(x,y,0);
  139.       }
  140.     dison_off(1);
  141.     set_startline(0);
  142. }
  143. //写数据到LCM
  144. void lw(uchar x,uchar y,uchar dd) //先定位,再写入数据
  145. {    if(x>=64)
  146.      { set_xy(x-64,y);
  147.        wdata(dd,0,1);//写右半屏   
  148.       }
  149.      else
  150.           { set_xy(x,y);
  151.             wdata(dd,1,0);
  152.           }
  153. }
  154. //显示汉字子函数
  155. void disp_Hz(uchar xx,uchar yy,uchar n,uchar fb)//xx为该行第xx个字,共8字,yy为第几行,共8行,n为字库中第N个字。
  156. {        uchar i,dx;
  157.    
  158.     for(i=0;i<16;i++)
  159.          {        dx=HZ[2*i+n*32]; //2*i为选择偶数行,因其为列扫描  一个字在X方向应该是16个像素,因为用的是整列16个从上到下编码每一列占两个字符
  160.            if(fb)
  161.                   dx=255-dx;//反白显示
  162.                 lw(xx*16+i,yy,dx);
  163.                 dx=HZ[(2*i+1)+n*32];
  164.                 if(fb)
  165.                  dx=255-dx;
  166.                 lw(xx*16+i,yy+1,dx);
  167.           }
  168. }
  169. void disp_Ez(uchar xx,uchar yy,uchar n,uchar fb)//显示数字或英语
  170. {  uchar i,dx;
  171.     for(i=0;i<8;i++)
  172.      {        dx=Ez[2*i+n*16];
  173.             if(fb)
  174.                   dx=255-dx;
  175.                 lw(xx*8+i,yy,dx);//
  176. dx=Ez[(2*i+1)+n*16];
  177.                 if(fb)
  178.                  dx=255-dx;
  179.                 lw(xx*8+i,yy+1,dx);
  180.           }
  181. }
  182. void filter()//限幅滤波
  183. {
  184.         int x;
  185.         x=get-get_l;
  186.         if(x>10 & x<-10) dianya=get_l;
  187.         else dianya=get;
  188.         get_l=get;       
  189. }
  190. void data_change(uint x)
  191. {
  192.         uint i,j;
  193.         i=(x*15)/255;
  194.         j=((x*15)%255)*200/51;//本来应该是 ((x*15)%255)*1000/255  会出现溢出
  195.         shi=i/10;
  196.         ge=i%10;
  197.         xiao1=j/100;
  198.         xiao2=j%100/10;
  199.         xiao3=j%100%10;
  200. }
  201. /*****主函数****/
  202. void main()
  203. {        uchar loop,j;//
  204.     uchar fb=0;
  205.   lcd_init();
  206.     delay(300);
  207.         for(loop=0;loop<8;loop++)//行1
  208.           { disp_Hz(loop,0,loop,fb);
  209.     }
  210.         //dianya=111;
  211.     while(1)
  212.      {
  213.                          get0804();
  214.                         filter();
  215.       data_change(dianya);
  216.                         fb=0;
  217.                         if(shi)
  218.                                   disp_Ez(4,4,shi,fb);
  219.                         else
  220.                                    disp_Ez(4,4,12,fb);
  221.                     disp_Ez(5,4,ge,fb);
  222.                         disp_Ez(6,4,10,fb);
  223.                         disp_Ez(7,4,xiao1,fb);
  224.                         disp_Ez(8,4,xiao2,fb);
  225.                         disp_Ez(9,4,xiao3,fb);
  226.                         disp_Ez(10,4,11,fb);
  227.                        
  228.                         if(dianya<=204)
  229.                         {
  230.                                 beep=~beep;
  231.                                 jidianqi=~jidianqi;
  232.                                
  233.                                 j++;
  234.                                 if(j<5)
  235.                                 {
  236.                                         fb=0;
  237.                                 }
  238.                                 if(j>=5)
  239.                                 {
  240.                                         fb=1;
  241.                                         if(j==10) j=0;
  242.                                 }
  243.                                 for(loop=0;loop<8;loop++)//行1
  244.                                   { disp_Hz(loop,6,loop+8,fb);
  245.                         }
  246.                         }
  247.                         else
  248.                         {
  249.                                 fb=0;
  250.                                 for(loop=0;loop<16;loop++)//行1
  251.                               { disp_Ez(loop,6,12,fb);
  252.                     }
  253.                                                 beep=1;
  254.                                                 jidianqi=0;
  255.                                                
  256.                         }
  257.      }
  258. }
  259. uchar code HZ[]=
  260. {
  261. 0x00,0x00,0x40,0x40,0x42,0x44,0x44,0x44,
  262. 0x58,0x44,0x40,0x44,0x40,0x44,0x7F,0x44,
  263. 0x40,0x44,0x40,0x44,0x50,0x44,0x48,0x44,
  264. 0xC6,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,/*"当",0*/
  265. 0x08,0x00,0x08,0x00,0xE8,0xFF,0x29,0x09,
  266. 0x2E,0x49,0x28,0x89,0xE8,0x7F,0x08,0x00,
  267. 0x08,0x00,0xC8,0x0F,0x0C,0x40,0x0B,0x80,
  268. 0xE8,0x7F,0x08,0x00,0x08,0x00,0x00,0x00,/*"前",1*/
  269. 0x12,0x00,0x12,0x00,0x12,0xFA,0x52,0xAA,
  270. 0x77,0xAB,0x52,0xAB,0xD2,0xAA,0xDA,0xFA,
  271. 0x52,0xAA,0x52,0xAA,0x37,0xAA,0x92,0xAA,
  272. 0x12,0xFB,0x12,0x06,0x12,0x00,0x00,0x00,/*"蓄",2*/
  273. 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
  274. 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
  275. 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
  276. 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"电",3*/
  277. 0x10,0x04,0x60,0x04,0x02,0x7E,0xCC,0x01,
  278. 0x80,0x00,0x80,0x00,0xFC,0x3F,0x40,0x40,
  279. 0x20,0x40,0xFF,0x4F,0x10,0x40,0x08,0x44,
  280. 0xF8,0x47,0x00,0x40,0x00,0x78,0x00,0x00,/*"池",4*/
  281. 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
  282. 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
  283. 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
  284. 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"电",5*/
  285. 0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40,
  286. 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
  287. 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44,
  288. 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*"压",6*/
  289. 0x00,0x00,0x00,0x00,0x00,0x36,0x00,0x36,
  290. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  291. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  292. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*":",7*/
  293. 0x00,0x00,0x00,0x00,0xF8,0x1F,0x88,0x08,
  294. 0x88,0x08,0x88,0x08,0x88,0x08,0xFF,0x7F,
  295. 0x88,0x88,0x88,0x88,0x88,0x88,0x88,0x88,
  296. 0xF8,0x9F,0x00,0x80,0x00,0xF0,0x00,0x00,/*"电",0*/
  297. 0x00,0x80,0x00,0x60,0xFE,0x1F,0x02,0x40,
  298. 0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
  299. 0xFA,0x7F,0x82,0x40,0x82,0x40,0x82,0x44,
  300. 0x82,0x58,0x82,0x40,0x02,0x40,0x00,0x00,/*"压",1*/
  301. 0x40,0x00,0x40,0x40,0x42,0x20,0xCC,0x1F,
  302. 0x00,0x20,0x08,0x40,0x48,0x40,0x88,0x41,
  303. 0x08,0x40,0x08,0x48,0x08,0x50,0xFF,0x4F,
  304. 0x08,0x40,0x08,0x40,0x08,0x40,0x00,0x00,/*"过",2*/
  305. ……………………

  306. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


所有资料51hei提供下载:
电池过压欠压报警电路proteus文件.rar (176.29 KB, 下载次数: 38)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表