找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3584|回复: 0
收起左侧

[原创]开源带开机动画的大屏幕双热电偶仿真与单片机程序

[复制链接]
ID:405708 发表于 2018-10-10 20:35 | 显示全部楼层 |阅读模式
单片机大屏幕双热电偶仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
220817e7exuwgbu0x1kbba.png

CONN-DIL36
微信截图_20181009215105.png

微信图片_20181009214741.png

单片机源程序如下:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. typedef unsigned char uint8;
  4. typedef unsigned int  uint16;
  5. typedef unsigned long uint32;
  6. bit flag;

  7. sbit MAX_SO=P1^0;
  8. sbit MAX_SCK=P1^1;
  9. sbit MAX_CS1=P1^2;
  10. sbit MAX_CS2=P1^3;
  11. int dat1;
  12. #define  LCD_CUR_POS                0x21        /* 光标位置设置(只有设置到有效显示地址并打开显示时才看到) */
  13. #define  LCD_CGR_POS                0x22        /* CGRAM偏置地址设置(可以增加自已的符号) */
  14. #define  LCD_ADR_POS                0x24        /* 地址指针位置(设置读写操作指针) */

  15. #define  LCD_TXT_STP                0x40        /* 文本区首址(从此地址开始向屏幕左上角显示字符) */
  16. #define  LCD_TXT_WID                0x41        /* 文本区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */
  17. #define  LCD_GRH_STP                0x42        /* 图形区首址(从此地址开始向屏幕左上角显示点) */
  18. #define  LCD_GRH_WID                0x43        /* 图形区宽度(设置显示宽度,N/6或N/8,其中N为x轴的点数) */

  19. #define  LCD_MOD_OR                        0x80        /* 显示方式:逻辑或 */
  20. #define  LCD_MOD_XOR                0x81        /* 显示方式:逻辑异或 */
  21. #define  LCD_MOD_AND                0x82        /* 显示方式:逻辑与 */
  22. #define  LCD_MOD_TCH                0x83        /* 显示方式:文本特征 */

  23. #define  LCD_DIS_SW                        0x90        /* 显示开关:D0=1/0,光标闪烁启用/禁用 */
  24.                                                                         /*                          D1=1/0,光标显示启用/禁用 */
  25.                                                                         /*                         D2=1/0,文本显示启用/禁用(打开后再使用) */
  26.                                                                         /*                         D3=1/0,图形显示启用/禁用(打开后再使用) */
  27.                                                                                                                
  28. #define  LCD_CUR_SHP                0xA0        /* 光标形状选择:0xA0-0xA7表示光标占的行数 */

  29. #define  LCD_AUT_WR                        0xB0        /* 自动写设置 */
  30. #define  LCD_AUT_RD                        0xB1        /* 自动读设置 */
  31. #define  LCD_AUT_OVR                0xB2        /* 自动读/写结束 */

  32. #define  LCD_INC_WR                        0xC0        /* 数据一次写,地址加1 */
  33. #define  LCD_INC_RD                        0xC1        /* 数据一次读,地址加1 */
  34. #define  LCD_DEC_WR                        0xC2        /* 数据一次写,地址减1 */
  35. #define  LCD_DEC_RD                        0xC3        /* 数据一次读,地址减1 */
  36. #define  LCD_NOC_WR                        0xC4        /* 数据一次写,地址不变 */
  37. #define  LCD_NOC_RD                        0xC5        /* 数据一次读,地址不变 */

  38. #define  LCD_SCN_RD                        0xE0        /* 屏读 */

  39. #define  LCD_SCN_CP                        0xE8        /* 屏拷贝 */

  40. #define  LCD_BIT_OP                        0xF0        /* 位操作:D0-D2--定义D0-D7位,D3--1为置位,0为清除 */
  41. uint8 const code BMP[]=
  42. {
  43. 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

  44. …………
  45. …………
  46. …………限于本文篇幅 余下代码请从51黑下载附件…………

  47. {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x00,0x31,0x80,0x61,0x80,0x60,0xC0,0x60,0xC0,0x60,0xC0,0x31,0xC0,0x1F,0xC0,0x00,0xC0,0x01,0x80,0x61,0x80,0x63,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x00,0x00},/*"9",9*/

  48. };
  49. uint8 xdata                 LCD_Command _at_ 0xfdff;
  50. uint8 xdata                        LCD_Data        _at_ 0xfcff;

  51. void  LCD_Write_Command(uint8 dat)
  52. {
  53.         while(!(0xfe|LCD_Command));
  54.         LCD_Command=dat;
  55. }
  56. void LCD_Write_Data(uint8 dat)
  57. {
  58.         while(!(0xfd|LCD_Command));
  59.         LCD_Data=dat;
  60. }
  61. #define LCD_Read_Command()                                                                          LCD_Command
  62. #define LCD_Read_Data()                                                                                    LCD_Data

  63. void LCD_Write_Command3(uint8 command,uint8 dat1,uint8 dat2)
  64. {
  65.         LCD_Write_Data(dat1);
  66.         LCD_Write_Data(dat2);
  67.         LCD_Write_Command(command);
  68. }

  69. void LCD_Write_Command1(uint8 command,uint8 dat1)
  70. {
  71.         LCD_Write_Data(dat1);
  72.         LCD_Write_Command(command);
  73. }



  74. void LCD_Initialize()
  75. {
  76.         LCD_Write_Command3(LCD_TXT_STP,0x00,0x00);
  77.         LCD_Write_Command3(LCD_TXT_WID,32,0x00);
  78.         LCD_Write_Command3(LCD_GRH_STP,0x00,0x00);
  79.         LCD_Write_Command3(LCD_GRH_WID,32,0x00);
  80.         LCD_Write_Command(LCD_MOD_OR);
  81.         LCD_Write_Command(LCD_DIS_SW|0x08);
  82. }

  83. void  LCD_FillAll(uint8 dat)
  84. {  uint32  i;

  85.    LCD_Write_Command3(LCD_ADR_POS, 0x00, 0x00);                        // 置地址指针
  86.    LCD_Write_Command(LCD_AUT_WR);                                                // 自动写
  87.    for(i=0;i<240*128;i++)
  88.    {  
  89.    LCD_Write_Data(dat);
  90.    }
  91.    LCD_Write_Command(LCD_AUT_OVR);                                                // 自动写结束
  92.    LCD_Write_Command3(LCD_ADR_POS,0x00,0x00);                        // 重置地址指针
  93. }

  94. void  LCD_UpdatePoint(uint32 x, uint32 y,uint8 dat)
  95. {  uint32  addr;

  96.    /* 找出目标地址 */
  97.    addr = y*(256>>3) + (x>>3);
  98.    LCD_Write_Command3(LCD_ADR_POS, addr&0xFF, addr>>8);        // 置地址指针
  99.    
  100.    /* 输出数据 */
  101.    LCD_Write_Command1(LCD_INC_WR, dat);
  102. }
  103. void Disp_LCD_HZ(uint16 x,uint16 y,uint16 xsize,uint16 ysize,uint8 *dat)
  104. {
  105.         uint32 i,j;
  106.         for(j=0;j<ysize;j++)
  107.         {
  108.                 for(i=0;i<xsize;)
  109.                 {
  110.                         LCD_UpdatePoint(i+x,j+y,*dat);
  111.                         dat++;
  112.                         i+=8;
  113.                 }
  114.         }
  115. }
  116. void Disp_LCD(uint8 *dat)
  117. {
  118.         uint32 i,j;
  119.         for(j=0;j<255;j++)
  120.         {
  121.                 for(i=0;i<255;)
  122.                 {
  123.                         LCD_UpdatePoint(i,j,*dat);
  124.                         dat++;
  125.                         i+=8;
  126.                 }
  127.         }
  128. }
  129. void Delay()
  130. {
  131.         uint32 i,j;
  132.         for(i=0;i<512;i++)
  133.         for(j=0;j<22;j++);
  134. }



  135. void MAX_Init()
  136. {
  137.         MAX_SCK=0;
  138.         MAX_SCK=0;
  139.         MAX_CS1=0;
  140.         MAX_CS2=0;
  141.         MAX_CS1=1;
  142.         MAX_CS2=1;
  143.         MAX_SO=1;
  144. }

  145. int MAX_Read_Temp()
  146. {
  147.         static char i;
  148.         static int temp=0;
  149.         for(i=0;i<16;i++)
  150.         {
  151.                 temp|=MAX_SO;
  152.                 temp<<=1;
  153.                 MAX_SCK=1;
  154.                 _nop_();
  155.                 MAX_SCK=0;
  156.         }
  157.         if(temp&0x04)flag=1;
  158.         else flag=0;
  159.         MAX_CS1=1;
  160.         MAX_CS2=1;
  161.         return temp>>3;
  162. }

  163. void Disp_Temp(uint8 type)
  164. {
  165.         int dat;
  166.         if(type==2){MAX_CS1=0;MAX_CS2=1;}
  167.         else
  168.         {MAX_CS1=1;MAX_CS2=0;}
  169.         dat=MAX_Read_Temp();
  170.         dat*=10;
  171.         dat/=4;
  172.         dat1=dat;
  173. //        if(flag){
  174. //        print(0,"     ERROR TEMP");
  175. //        print(0x40,"            ");
  176. //        }
  177. //        else
  178. //        {
  179. //        print(5,"            ");
  180. //        print(0,temp_value);
  181. //        print(0x40,"TEMP OUT ");
  182. //        }
  183. }
  184.        

  185. void main()
  186. {
  187.         uint8 i;
  188.         LCD_Initialize();
  189.         MAX_CS1=0;MAX_CS2=0;
  190.         MAX_Init();
  191.         Disp_LCD(BMP);
  192.         for(i=0;i<9*15;i++)
  193.         {
  194.                 Disp_LCD_HZ(64+i,204,14,12,INIT);
  195.                  Delay();
  196.                 i+=15;
  197.         }
  198.         Disp_LCD(BMP1);

  199.         Disp_LCD_HZ(0,0,20,20,HZK[0]);
  200.         Disp_LCD_HZ(22,0,20,20,HZK[1]);
  201.         Disp_LCD_HZ(2*22,0,20,20,HZK[2]);
  202.         Disp_LCD_HZ(3*22,0,20,20,HZK[3]);
  203.         Disp_LCD_HZ(4*22,0,20,20,HZK[4]);
  204.         Disp_LCD_HZ(5*22,0,20,20,HZK[5]);

  205.    
  206.         Disp_LCD_HZ(0,22,20,20,HZK[7]);
  207.         Disp_LCD_HZ(22,22,20,20,HZK[1]);
  208.         Disp_LCD_HZ(2*22,22,20,20,HZK[2]);
  209.         Disp_LCD_HZ(3*22,22,20,20,HZK[3]);
  210.         Disp_LCD_HZ(4*22,22,20,20,HZK[4]);
  211.         Disp_LCD_HZ(5*22,22,20,20,HZK[5]);

  212.         while(1)
  213.         {

  214.         Disp_Temp(1);
  215.         if(flag)
  216.         {
  217.             Disp_LCD_HZ(6*22,0,20,20,HZK[8]);
  218.             Disp_LCD_HZ(7*22,0,20,20,HZK[9]);
  219.         }
  220.         else
  221.         {
  222.                 Disp_LCD_HZ(7*22+22,0,20,20,HZK[6]);
  223.                 Disp_LCD_HZ(6*22+20,0,10,20,NUM[((dat1/10)%10)]);
  224.                 Disp_LCD_HZ(6*22+10,0,10,20,NUM[((dat1/100)%10)]);
  225.                 Disp_LCD_HZ(6*20,0,10,20,NUM[((dat1/1000)%10)]);
  226.         }
  227.         Disp_Temp(2);
  228.         if(flag)
  229.         {
  230.             Disp_LCD_HZ(6*22,22,20,20,HZK[8]);
  231.             Disp_LCD_HZ(7*22,22,20,20,HZK[9]);
  232.         }
  233.         else
  234.         {
  235.                 Disp_LCD_HZ(7*22+22,22,20,20,HZK[6]);
  236.                 Disp_LCD_HZ(6*22+20,20,10,20,NUM[((dat1/10)%10)]);
  237.                 Disp_LCD_HZ(6*22+10,20,10,20,NUM[((dat1/100)%10)]);
  238.                 Disp_LCD_HZ(6*20,20,10,20,NUM[((dat1/1000)%10)]);
  239.         }

  240.        
  241. //                else
  242. //                print(0,temp_value);
  243. //                Disp_Temp(2);
  244. //                if(flag)print(0x40,"NOP          ");
  245. //                else
  246. //                print(0x40,temp_value);
  247.         }
  248. }
复制代码
0.png

所有资料51hei提供下载:
temp.rar (190.82 KB, 下载次数: 31)

评分

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

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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