找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机+LCD12864数字电压表设计 含源代码、proteus仿真工程文件

[复制链接]
跳转到指定楼层
楼主
附件包括数字电压表的单片机源代码
proteus仿真工程文件
都是自己在网上找的资料,请大家多多指教

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. //---库函数声明及相关定义---//
  2. #include <reg51.h>
  3. #include <intrins.h>
  4. #define unint unsigned int
  5. #define unchar unsigned char
  6. #define Databus P1 /*液晶数据总线*/
  7. sbit RS=P3^3;      /*数据\指令 选择*/
  8. sbit RW=P3^4;      /*读\写 选择*/
  9. sbit EN=P3^2;      /*读\写使能*/
  10. sbit cs1=P3^6;     /*片选1*/
  11. sbit cs2=P3^7;     /*片选2*/


  12. sbit clock=P0^4;//时钟线
  13. sbit dout=P0^2;//数据输出端
  14. sbit cs=P0^3;//片选(低电平有效)


  15. sbit        DQ=P0^2;//ds18b20与单片机连接口
  16. float f_temp;//浮点型温度值   
  17. unsigned int tvalue;//温度值
  18. unsigned char tflag;      
  19. unsigned int temp=0;
  20. unsigned char SegBuf[4]={0};

  21. /********************************/
  22. /* 定义中文字库    */
  23. /********************************/
  24. unchar code Hzk[]={
  25.         0x40,0x20,0x10,0x0C,0xE3,0x22,0x22,0x22,0xFE,0x22,0x22,0x22,0x22,0x02,0x00,0x00, //年//0
  26.         0x04,0x04,0x04,0x04,0x07,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,
  27.         0x00,0x00,0x00,0x00,0x00,0xFF,0x11,0x11,0x11,0x11,0x11,0xFF,0x00,0x00,0x00,0x00,//月//1
  28.         0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x01,0x01,0x21,0x41,0x3F,0x00,0x00,0x00,0x00,
  29.         0x00,0x00,0x00,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0xFE,0x00,0x00,0x00,0x00,//日//2
  30.         0x00,0x00,0x00,0x3F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x3F,0x00,0x00,0x00,0x00,
  31.         0x00,0x00,0x00,0xBE,0x2A,0x2A,0x2A,0xEA,0x2A,0x2A,0x2A,0x2A,0x3E,0x00,0x00,0x00,//星//3
  32.         0x00,0x48,0x46,0x41,0x49,0x49,0x49,0x7F,0x49,0x49,0x49,0x49,0x49,0x41,0x40,0x00,
  33.         0x00,0x04,0xFF,0x54,0x54,0x54,0xFF,0x04,0x00,0xFE,0x22,0x22,0x22,0xFE,0x00,0x00,//期//4
  34.         0x42,0x22,0x1B,0x02,0x02,0x0A,0x33,0x62,0x18,0x07,0x02,0x22,0x42,0x3F,0x00,0x00,
  35.         0x00,0xFC,0x44,0x44,0x44,0xFC,0x10,0x90,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x00,//时//5
  36.         0x00,0x07,0x04,0x04,0x04,0x07,0x00,0x00,0x03,0x40,0x80,0x7F,0x00,0x00,0x00,0x00,
  37.         0x80,0x40,0x20,0x98,0x87,0x82,0x80,0x80,0x83,0x84,0x98,0x30,0x60,0xC0,0x40,0x00,//分//6
  38.         0x00,0x80,0x40,0x20,0x10,0x0F,0x00,0x00,0x20,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,
  39.         0x12,0x12,0xD2,0xFE,0x91,0x11,0xC0,0x38,0x10,0x00,0xFF,0x00,0x08,0x10,0x60,0x00,//秒//7
  40.         0x04,0x03,0x00,0xFF,0x00,0x83,0x80,0x40,0x40,0x20,0x23,0x10,0x08,0x04,0x03,0x00,

  41. 0x00,0x40,0x42,0x42,0x42,0x42,0x42,0xFE,0x42,0x42,0x42,0x42,0x42,0x42,0x40,0x00,//天//8
  42. 0x00,0x80,0x40,0x20,0x10,0x08,0x06,0x01,0x02,0x04,0x08,0x10,0x30,0x60,0x20,0x00,
  43. 0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,//一//9
  44. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  45. 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x06,0x04,0x00,0x00,0x00,//二//10
  46. 0x00,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x18,0x10,0x00,
  47. 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00,//三//11
  48. 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,
  49. 0x00,0xFE,0x02,0x02,0x02,0xFE,0x02,0x02,0xFE,0x02,0x02,0x02,0x02,0xFE,0x00,0x00,//四//12
  50. 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x22,0x7F,0x00,0x00,
  51. 0x00,0x02,0x82,0x82,0x82,0x82,0xFE,0x82,0x82,0x82,0xC2,0x82,0x02,0x00,0x00,0x00,//五//13
  52. 0x20,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x20,0x20,0x3F,0x20,0x20,0x30,0x20,0x00,
  53. 0x10,0x10,0x10,0x10,0x10,0x91,0x12,0x1E,0x94,0x10,0x10,0x10,0x10,0x10,0x10,0x00,//六//14
  54. 0x00,0x40,0x20,0x10,0x0C,0x03,0x01,0x00,0x00,0x01,0x02,0x0C,0x78,0x30,0x00,0x00,

  55. 0x00,0x40,0x42,0x44,0x4C,0x40,0x40,0x7F,
  56.       0x40,0x40,0x48,0x44,0xE6,0x40,0x00,0x00,
  57.       0x00,0x40,0x44,0x44,0x44,0x44,0x44,0x44,
  58.       0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,//当//15

  59. 0x08,0x08,0xE8,0x29,0x2A,0x2E,0xE8,0x08,
  60.       0x08,0xCC,0x0A,0x0B,0xE8,0x0C,0x08,0x00,
  61.       0x00,0x00,0xFF,0x09,0x49,0x89,0x7F,0x00,
  62.       0x00,0x0F,0x40,0x80,0x7F,0x00,0x00,0x00,//前//16

  63. 0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48,//电//17
  64.       0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00,
  65.       0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42,
  66.       0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00,

  67. 0x00,0x00,0xFE,0x02,0x82,0x82,0x82,0x82,
  68.       0xFE,0x82,0x82,0x82,0xC3,0x82,0x00,0x00,
  69.       0x40,0x30,0x0F,0x40,0x40,0x40,0x40,0x40,
  70.       0x7F,0x40,0x42,0x44,0x4C,0x60,0x40,0x00,//压//18


  71. 0x00,0x00,0x00,0x00,0x7F,0x49,0x49,0x49,
  72.       0x49,0x49,0x7F,0x00,0x00,0x80,0x00,0x00,
  73.       0x01,0x81,0x41,0x21,0x1D,0x21,0x41,0x7F,
  74.       0x89,0x89,0x8D,0x89,0x81,0xC1,0x41,0x00,//是//19

  75. 0x00,0x00,0x00,0x00,0x80,0xC0,0xC0,0x80,
  76.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  77.       0x00,0x00,0x00,0x00,0x31,0x7B,0x7B,0x31,
  78.       0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//://20

  79. 0x80,0x40,0x20,0xF8,0x27,0x20,0x20,0x20,//伏//21
  80.       0x20,0xFF,0x20,0x24,0x28,0x38,0x20,0x00,
  81.       0x00,0x00,0x00,0xFF,0x80,0x40,0x20,0x18,
  82.       0x06,0x01,0x06,0x18,0x60,0xC0,0x40,0x00


  83.                          };
  84. /****************************************/
  85. /* 定义ASCII字库8列*16行    */
  86. /****************************************/
  87. unchar code Ezk[]={
  88. /*此字体下对应的点阵为:宽x高=8x16   --*/
  89. /*-- 宋体12; 此字体下对应的点阵为:宽x高=8x16   --*/
  90.         0x00,0x00,0xF0,0xF8,0x08,0x68,0xF8,0xF0,0x00,0x00,0x07,0x0F,0x0B,0x08,0x0F,0x07, //0
  91.         0x00,0x20,0x20,0x30,0xF8,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x00,0x00,  //1
  92.         0x00,0x30,0x38,0x08,0x88,0xF8,0x70,0x00,0x00,0x0C,0x0E,0x0B,0x09,0x08,0x08,0x00, //        2
  93.         0x00,0x30,0x38,0x88,0x88,0xF8,0x70,0x00,0x00,0x06,0x0E,0x08,0x08,0x0F,0x07,0x00, //3
  94.         0x00,0x00,0xF8,0xF8,0x00,0xE0,0xE0,0x00,0x00,0x03,0x03,0x02,0x02,0x0F,0x0F,0x02,//4
  95.         0x00,0xF8,0xF8,0x88,0x88,0x88,0x08,0x00,0x00,0x08,0x08,0x08,0x0C,0x07,0x03,0x00,//5
  96.         0x00,0xC0,0xE0,0x78,0x58,0xC8,0x80,0x00,0x00,0x07,0x0F,0x08,0x08,0x0F,0x07,0x00,//6
  97.         0x00,0x08,0x08,0x88,0xE8,0x78,0x18,0x00,0x00,0x00,0x0E,0x0F,0x01,0x00,0x00,0x00,//7
  98.         0x00,0x70,0xF8,0xC8,0x88,0xF8,0x70,0x00,0x00,0x07,0x0F,0x08,0x09,0x0F,0x07,0x00,//8
  99.         0x00,0xF0,0xF8,0x08,0x08,0xF8,0xF0,0x00,0x00,0x00,0x09,0x0D,0x0F,0x03,0x01,0x00,//9


  100.                 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // - -//10
  101.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  102.         0x00,0x80,0x80,0xE0,0xE0,0x80,0x80,0x00,  // -+-//11
  103.         0x00,0x00,0x00,0x03,0x03,0x00,0x00,0x00,

  104.         0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00,  // ---//12
  105.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  106.         0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,  // -.-//13
  107.         0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x00
  108. };



  109. /*状态检查,LCD是否忙*/
  110. void CheckState()   
  111. {
  112.    unchar dat;       /*状态信息,判断是否忙*/
  113.    RS=0;             /*数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令数据*/
  114.    RW=1;             /*R/W=“H” ,E=“H”数据被读到DB7∽DB0*/
  115.    do{
  116.       Databus=0x00;
  117.       EN=1;          /*EN下降源*/
  118.       _nop_();       /*一个时钟延时*/
  119.       dat=Databus;
  120.       EN=0;
  121.       dat=0x80 & dat;/*仅当第7位为0时才可操作(判别busy信号)*/
  122.       }while(!(dat==0x00));
  123. }
  124. /*写命令到LCD中*/
  125. SendCommandToLCD(unchar com)
  126. {
  127.    CheckState();/*状态检查,LCD是否忙*/
  128.    RS=0;        /*向LCD发送命令。RS=0写指令,RS=1写数据*/
  129.    RW=0;        /*R/W=“L” ,E=“H→L”数据被写到 IR 或 DR */
  130.    Databus=com; /*com :命令*/
  131.    EN=1;        /*EN下降沿*/
  132.    _nop_();
  133.    _nop_();
  134.    EN=0;
  135. }
  136. /*设置页 0xb8是页的首地址*/
  137. void SetLine(unchar page)   
  138. {
  139.         page=0xb8|page; /*1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页*/
  140.         SendCommandToLCD(page);
  141. }
  142. /*设定显示开始行,0xc0是行的首地址*/
  143. void SetStartLine(unchar startline)        
  144. {
  145.         startline=0xc0|startline;    /*1100 0000*/
  146.         SendCommandToLCD(startline); /*设置从哪行开始:0--63,一般从0 行开始显示*/
  147. }
  148. /*设定列地址--Y 0-63 ,0x40是列的首地址*/
  149. void SetColumn(unchar column)   
  150. {
  151.         column=column &0x3f; /*column最大值为64,越出 0=<column<=63*/
  152.         column= 0x40|column; /*01xx xxxx*/
  153.         SendCommandToLCD(column);
  154. }
  155. /*开关显示,0x3f是开显示,0x3e是关显示*/
  156. void SetOnOff(unchar onoff)   
  157. {
  158.     onoff=0x3e|onoff; /*0011 111x,onoff只能为0或者1*/
  159.     SendCommandToLCD(onoff);
  160. }


  161. /*写显示数据 */
  162. void WriteByte(unchar dat)
  163. {
  164.    CheckState();/*状态检查,LCD是否忙*/
  165.    RS=1;        /*RS=0写指令,RS=1写数据*/
  166.    RW=0;        /*R/W=“L” ,E=“H→L”数据被写到 IR 或 DR */
  167.    Databus=dat;    /*dat:显示数据*/
  168.    EN=1;        /*EN下降沿*/
  169.    _nop_();
  170.    _nop_();
  171.    EN=0;
  172. }
  173. /*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/
  174. void SelectScreen(unchar screen)      
  175. {               
  176.    switch(screen)
  177.    {
  178.      case 0: cs1=0;/*全屏*/
  179.              _nop_(); _nop_(); _nop_();
  180.              cs2=0;
  181.              _nop_(); _nop_(); _nop_();
  182.              break;
  183.      case 1: cs1=0;/*左屏*/
  184.              _nop_(); _nop_(); _nop_();
  185.              cs2=1;
  186.              _nop_(); _nop_(); _nop_();
  187.              break;
  188.      case 2: cs1=1;/*右屏*/
  189.              _nop_(); _nop_(); _nop_();
  190.              cs2=0;
  191.              _nop_(); _nop_(); _nop_();
  192.              break;
  193.    }
  194. }
  195. /*清屏screen: 0-全屏,1-左屏,2-右*/
  196. void ClearScreen(unchar screen)   
  197. {   
  198.         unchar i,j;
  199.         SelectScreen(screen);   
  200.         for(i=0;i<8;i++)          /*控制页数0-7,共8页*/
  201.         {
  202.                 SetLine(i);
  203.                 SetColumn(0);
  204.                 for(j=0;j<64;j++)    /*控制列数0-63,共64列*/
  205.                 {
  206.                 WriteByte(0x00); /*写点内容,列地址自动加1*/
  207.                 }
  208.         }            
  209. }

  210. /*初始化LCD*/
  211. void InitLCD()   
  212. {
  213.     CheckState();
  214.     SelectScreen(0);
  215.     SetOnOff(0);    /*关显示*/
  216.     SelectScreen(0);
  217.     SetOnOff(1);    /*开显示*/
  218.     SelectScreen(0);
  219.     ClearScreen(0); /*清屏*/
  220.     SetStartLine(0);/*开始行:0*/
  221. }
  222. /*--------------------------显示全角汉字-----------------------*/
  223. /*选屏参数,pagr选页参数,column选列参数,number选第几汉字输出*/
  224. /*ss=1右屏2左屏,pagr=0,2,4,6第0~3行,column=0~3汉子出现的列,number选第几汉字输出*/
  225. void Display(unchar ss,unchar page,unchar column,unchar number)
  226. {
  227.     unchar i;  
  228.     SelectScreen(ss);
  229.     column=column&0x3f;
  230.     SetLine(page);     /*写上半页*/
  231.     SetColumn(column); /*控制列*/
  232.     for(i=0;i<16;i++) /*控制16列的数据输出*/
  233.     {
  234.         WriteByte(Hzk[i+32*number]);/*i+32*number汉字的前16个数据输出*/
  235.     }
  236.     SetLine(page+1);   /*写下半页*/
  237.     SetColumn(column); /*控制列*/
  238.     for(i=0;i<16;i++) /*控制16列的数据输出*/
  239.     {
  240.         WriteByte(Hzk[i+32*number+16]);/*i+32*number+16汉字的后16个数据输出*/
  241.     }
  242. }
  243. /*---------------------显示半角汉字和数字和字母----------------------*/
  244. /*选屏参数,pagr选页参数,column选列参数,number选第几汉字输出*/
  245. void Displayen(unchar ss,unchar page,unchar column,unchar number)
  246. {
  247.     unchar i;
  248.     SelectScreen(ss);
  249.     column=column&0x3f;
  250.     SetLine(page);   /*写上半页*/
  251.     SetColumn(column);
  252.     for(i=0;i<8;i++)
  253.     {
  254.         WriteByte(Ezk[i+16*number]);
  255.     }
  256.     SetLine(page+1); /*写下半页*/
  257.     SetColumn(column);
  258.     for(i=0;i<8;i++)
  259.     {
  260.         WriteByte(Ezk[i+16*number+8]);
  261.     }
  262. }
  263. //---显示缓冲填充函数---//*
  264. void convert(unint n)         
  265. {
  266.         n=n*100;
  267.         n=n/51;
  268.         SegBuf[2] =n%10;
  269.         SegBuf[1] =n/10%10;
  270.         SegBuf[0] =n/100%10;


  271. }
  272. //---549延时函数---//
  273. void delay549(unint t)
  274. {   
  275.         while(t--);
  276. }
  277. //---采集549数据函数---//
  278. unchar read_549()//数据得采集
  279. {
  280.         unint i;
  281.         unchar k=0x00;//定义一个变量k,将在dout上采集的到的数据装进K
  282.         for(i=0;i<8;i++)
  283.         {
  284.                 k<<=1;//左移一位
  285.                 k|=dout;
  286.                 clock=1;//高电平期间采集dout线上的数据
  287.                 _nop_();
  288.                 clock=0;
  289.                 delay549(10);
  290.         }
  291.         return k;//返回值
  292. }

  293. //---读取549AD数据函数---//
  294. unchar shuchu_549()//数据得读取
  295. {
  296.         unchar date;
  297.         cs=1;   
  298.         clock=1;
  299.         cs=0;//片选低电平时数据有效
  300.         _nop_();
  301.         _nop_();
  302.         date=read_549();//将read_549()函数中采集到的数据付给变量date
  303.         cs=1;//片选拉高,表示数据读取完毕
  304.         delay549(50);
  305.         return date;//返回值
  306. }
  307. /*主函数*/
  308. void main()
  309. {
  310.         unchar ADCDat;
  311.     InitLCD();      /*初始12864*/
  312.     ClearScreen(0); /*清屏*/
  313.     SetStartLine(0);/*显示开始行*/


  314.     while(1)
  315.     {  
  316.          ADCDat=shuchu_549();
  317.         convert(ADCDat);        //转换显示码

  318.         Display(2,0,0*16,15);//当
  319.         Display(2,0,1*16,16);//前
  320.         Display(2,0,2*16,17);//电
  321.         Display(2,0,3*16,18);//压
  322.         Display(1,0,0*16,19);//是
  323.         Display(1,0,1*16,20);//:

  324.         Displayen(2,2,0*8,SegBuf[0]);
  325.         Displayen(2,2,1*8,13);               
  326.         Displayen(2,2,2*8,SegBuf[1]);

  327.         Displayen(2,2,3*8,SegBuf[2]);


  328.         Display(2,2,2*16,21);//伏


  329.     }
  330. }
复制代码

所有资料51hei提供下载:
附件不小心被删除了,大家自己画一下图吧,有画好的朋友,欢迎回帖点高级模式上传附件分享下.


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

使用道具 举报

沙发
ID:102963 发表于 2020-11-3 20:31 | 只看该作者
楼主的数字秒表,怎么液晶显示的电压值呢??
回复

使用道具 举报

板凳
ID:838457 发表于 2020-11-3 20:39 | 只看该作者
songxia8013 发表于 2020-11-3 20:31
楼主的数字秒表,怎么液晶显示的电压值呢??

标题错了,是数字电压表设计
回复

使用道具 举报

地板
ID:838457 发表于 2020-11-3 20:39 | 只看该作者
标题错了 是数字电压表
回复

使用道具 举报

5#
ID:743654 发表于 2020-11-5 09:10 | 只看该作者
附件跟程序也不对啊,牛头不对马嘴
回复

使用道具 举报

6#
ID:91165 发表于 2020-11-5 09:27 | 只看该作者
楼主附件发错了吧
回复

使用道具 举报

7#
ID:316613 发表于 2020-11-12 17:20 | 只看该作者
不对啊
回复

使用道具 举报

8#
ID:848937 发表于 2020-12-6 14:52 | 只看该作者
附件怎么不对,
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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