久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4605|回復(fù): 2
收起左側(cè)

ATmeg16單片機(jī)+LCD12864溫度檢測(cè)顯示程序(并行控制,不帶字庫(kù))

[復(fù)制鏈接]
ID:114509 發(fā)表于 2018-12-17 16:45 | 顯示全部樓層 |閱讀模式
LCD12864溫度檢測(cè)顯示程序(ATmega16)
制作出來(lái)的實(shí)物圖如下:

LCD12864

LCD12864


單片機(jī)源程序如下:
  1. /*---------------------------------------------------------------
  2. ATmega64并行控制不帶字庫(kù)的12864程序
  3. ---------------------------------------------------------------
  4. 實(shí)驗(yàn)內(nèi)容:LCD12864
  5. ---------------------------------------------------------------

  6. 硬件連接:
  7. LCD12864         --------        ATmega64

  8. 1.GND            --------        GND
  9. 2.VCC            --------        VCC
  10. 3.V0             --------        NC
  11. 4.RS(CS)         --------        PB0
  12. 5.R/W(SID)       --------        PB1
  13. 6.E(SCLK)        --------        PB2
  14. 7.D0             --------        PA0
  15. 8.D1             --------        PA1
  16. 9.D2             --------        PA2
  17. 10.D3            --------        PA3
  18. 11.D4            --------        PA4
  19. 12.D5            --------        PA5
  20. 13.D6            --------        PA6
  21. 14.D7            --------        PA7
  22. 15.PSB           --------        VCC
  23. 16.NC            --------        NC
  24. 17.RST           --------        VCC
  25. 18.NC            --------        NC
  26. 19.LED+          --------        VCC
  27. 20.LED-          --------        GND

  28. 編譯燒寫(xiě)該程序到ATmega64
  29. 上電,如果操作正確,這時(shí)您可以看到顯示的內(nèi)容了
  30. ---------------------------------------------------------------*/
  31. //頭文件定義
  32. #include<iom16v.h>
  33. #include<macros.h>
  34. //#include<string.h>
  35. //#include <stdio.h>
  36. //#include<stdlib.h>
  37. //宏定義
  38. #define uchar unsigned char
  39. #define uint unsigned int
  40. //LCD12864液晶顯示(數(shù)據(jù)線端口)
  41. #define rs_h PORTB |= BIT(PB0)//數(shù)據(jù)/命令選擇
  42. #define rs_l PORTB &=~BIT(PB0)
  43. #define rw_h PORTB |= BIT(PB1)//讀/寫(xiě)選擇
  44. #define rw_l PORTB &=~BIT(PB1)
  45. #define en_h PORTB |= BIT(PB2)//使能信號(hào)
  46. #define en_l PORTB &=~BIT(PB2)
  47. //溫度18b20(數(shù)據(jù)線端口)
  48. #define tmp (PINB&BIT(PB3))
  49. #define temp_h PORTB |= BIT(PB3)
  50. #define temp_l PORTB &=~BIT(PB3)
  51. #define temp_o DDRB |= BIT(PB3)
  52. #define temp_i DDRB &=~BIT(PB3)
  53. //數(shù)組定義
  54. /*
  55. unsigned char dis1[]={"黃俊華,啊蠢。"};
  56. unsigned char dis2[]={"曾志成,啊成。"};
  57. unsigned char dis3[]={"梁毓毅,啊毓。"};
  58. unsigned char dis4[]={"柳藝明,啊明。"};

  59. unsigned char dis1[]={"溫度檢測(cè)"};
  60. unsigned char dis2[]={"℃"};
  61. */

  62. //溫度18b20(變量定義)
  63. unsigned char dat1=0x00;//保存讀出的溫度 L
  64. unsigned char dat2=0x00;//保存讀出的溫度 H
  65. unsigned long int dat=0;//保存讀出的溫度 XS
  66. unsigned char flag=0;//錯(cuò)誤標(biāo)志位
  67. unsigned char keyvalue=0;//返回值變量
  68. unsigned char tempH=30;//溫度H
  69. unsigned char tempL=20;//溫度L
  70. //按鍵定義
  71. unsigned char key1=0;
  72. unsigned char key2=0;
  73. //unsigned char key3=0;
  74. //unsigned char key4=0;

  75. //**********************************************************************//
  76. //*************************      IO 端口定義      **********************//
  77. //**********************************************************************//

  78. void IO_init(void)
  79. {         
  80.          DDRA = 0XFF;
  81.          DDRB = 0XFF;
  82.          //DDRC = 0XFF;
  83.          //DDRD = 0XFF;
  84.         //PORTA = 0X00;
  85.         //PORTB = 0X00;
  86.         //PORTC = 0X00;
  87.         //PORTD = 0X00;
  88. }

  89. //**********************************************************************//
  90. //*************************      延時(shí)函數(shù)         **********************//
  91. //**********************************************************************//

  92. void delayms(uint z)          //8M晶振下,延時(shí)1ms
  93. {
  94.         uint x,y;
  95.         for(x=z;x>0;x--)
  96.                  for(y=1333;y>0;y--);
  97. }

  98. //**********************************************************************//
  99. //*************************      LCD12864         **********************//
  100. //**********************************************************************//
  101. void LCD_clear(void)//清屏函數(shù)
  102. {
  103.   write_com(0x01);
  104.   delayms(5);
  105. }
  106. void lcd_en(void)        //en端產(chǎn)生一個(gè)高電平脈沖,控制LCD寫(xiě)時(shí)序
  107. {
  108.         delayms(5);//延時(shí)5ms
  109.         en_h;
  110.     delayms(5);//延時(shí)5ms
  111.     en_l;
  112. }
  113. void write_com(uchar com)//向LCD12864寫(xiě)命令
  114. {
  115.         rs_l;
  116.         rw_l;
  117.         en_h;
  118.         delayms(5);//延時(shí)5ms
  119.         PORTA=com;
  120.         lcd_en();//寫(xiě)入命令
  121. }
  122. void write_dat(uchar dat)//向LCD12864寫(xiě)數(shù)據(jù)
  123. {
  124.         rs_h;
  125.         rw_l;
  126.         en_h;
  127.         delayms(5);//延時(shí)5ms
  128.         PORTA=dat;
  129.         lcd_en();//寫(xiě)入數(shù)據(jù)
  130. }
  131. void LCD_init(void)//LCD顯示屏初始化函數(shù)
  132. {
  133.         write_com(0x30);//設(shè)置8位數(shù)據(jù)總線,DB7~DB0;
  134.         delayms(5);//延時(shí)5ms
  135.         write_com(0x0c);//開(kāi)顯示,光標(biāo)不顯示;
  136.         delayms(5);//延時(shí)5ms
  137.         write_com(0x01);//清屏
  138.         delayms(5);//延時(shí)5ms
  139. }
  140. void LCD_pos(uchar x,uchar y)//字符顯示初始地址設(shè)置
  141. {
  142.         uchar pos;
  143.         if(x==0)//第一行顯示
  144.         {
  145.                  x=0x80;
  146.         }
  147.         else if(x==1)//第二行顯示
  148.         {
  149.                  x=0x90;
  150.         }
  151.         else if(x==2)//第三行顯示
  152.         {
  153.                  x=0x88;
  154.         }
  155.         else if(x==3)//第四行顯示
  156.         {
  157.                  x=0x98;
  158.         }
  159.         pos=x+y;
  160.         write_com(pos);
  161. }
  162. void LCD_write_str(uchar x,uchar y,uchar *s)//在第X行Y列開(kāi)始顯示,指針*S所指向的字符串
  163. {
  164.         LCD_pos(x,y);//設(shè)置初始字符顯示地址
  165.         while(*s)//逐次寫(xiě)入顯示字符,直到最后一個(gè)字符"/0"
  166.         {
  167.                  write_dat(*s);//寫(xiě)入當(dāng)前字符并顯示
  168.                 s++;//地址指針加1,指向下一個(gè)待寫(xiě)字符
  169.         }
  170. }
  171. void LCD_write_char(uchar x,uchar y,uchar Wdata)//在第X行Y列開(kāi)始顯示W(wǎng)data所對(duì)應(yīng)的單個(gè)字符
  172. {
  173.         LCD_pos(x,y);//設(shè)置初始字符顯示地址
  174.         write_dat(Wdata);//寫(xiě)入當(dāng)前字符并顯示
  175. }

  176. //**********************************************************************//
  177. //*************************         18B20         **********************//
  178. //**********************************************************************//

  179. void Ds18b20_reset(void)//DS18B20初始化
  180. {
  181.         uint count;
  182.         temp_o;
  183.         temp_l;
  184.         for(count=700;count>0;count--);//延時(shí)480us
  185.         temp_h;
  186.         temp_i;//不須配置PORT內(nèi)部上拉電阻,MCU輸入輸出自動(dòng)切換
  187.         while((tmp==0x08));//&&(i>0)) i--;
  188.         for(count=700;count>0;count--);//延時(shí)480us
  189. }
  190. void Ds18b20_write(uchar dat)//向DS18B20寫(xiě)一個(gè)字節(jié)
  191. {
  192.         uchar count;
  193.         uchar i;
  194.         temp_o;
  195.         for(i=8;i>0;i--)
  196.         {
  197.                 temp_l;
  198.                 for(count=2;count>0;count--);
  199.                 //temp_h;//不能有此語(yǔ)句
  200.                 if(dat&0x01==0x01)
  201.                         temp_h;
  202.                 else
  203.                         temp_l;
  204.                 for(count=120;count>0;count--);//延時(shí)60us
  205.                 temp_h;
  206.                 dat>>=1;       
  207.         }       
  208. }
  209. uchar Ds18b20_read(void)//從DS18B20讀一個(gè)字節(jié)
  210. {
  211.         uchar i,datt;
  212.         uchar count;
  213.         for(i=8;i>0;i--)
  214.         {
  215.                 datt>>=1;
  216.                 temp_o;
  217.                 temp_l;
  218.                 for(count=2;count>0;count--);
  219.                 temp_h;//此語(yǔ)句必須有,參考datasheet的P15
  220.                 for(count=1;count>0;count--);
  221.                 temp_i;
  222.                 if(tmp==0x08)
  223.                         datt|=0x80;
  224.                 for(count=120;count>0;count--);        //延時(shí)60us
  225.         }
  226.         return datt;
  227. }
  228. void temp_display(void)//溫度顯示
  229. {
  230.         Ds18b20_reset();//DS18B20初始化
  231.         Ds18b20_write(0xcc);//跳過(guò)ROM
  232.         Ds18b20_write(0x44);//發(fā)送溫度轉(zhuǎn)換命令
  233.         delayms(1000);//延時(shí)1s,等待溫度轉(zhuǎn)換完成
  234.         Ds18b20_reset();//DS18B20初始化
  235.         Ds18b20_write(0xcc);//跳過(guò)ROM
  236.         Ds18b20_write(0xbe);//發(fā)送讀溫度寄存器命令
  237.         dat1=Ds18b20_read();//讀溫度值的低字節(jié)
  238.         dat2=Ds18b20_read();//讀溫度值的高字節(jié)
  239.        
  240.         if(dat2>=240)//dat2溫度值的高字節(jié)為1時(shí)為負(fù)溫度
  241.         {
  242.                 dat=(~(dat2*256+dat1)+1)*0.625;//負(fù)溫度:取反加一,保留一位小數(shù)
  243.                 flag=1;
  244.         }
  245.         else
  246.         {
  247.                 dat=(dat2*256+dat1)*0.625;
  248.                 flag=0;
  249.         }
  250. /*******************************************************   正負(fù)溫度顯示   **/
  251.         if(flag==1)//負(fù)溫度顯示
  252.         {
  253.                 LCD_write_str(0,0,"18B20 溫度檢測(cè)");  //字符:18B20 溫度檢測(cè)
  254.                 LCD_write_str(1,0,"負(fù)溫度:");                       //字符:負(fù)溫度
  255.                 LCD_write_str(1,6,"℃");                          //符號(hào):℃
  256.                 LCD_write_char(1,4,0x30+dat/100);
  257.                 LCD_write_char(1,5,0x30+dat%100/10);
  258.         }
  259.         if(flag==0)//正溫度顯示
  260.         {          
  261.                 LCD_write_str(0,0,"18B20 溫度檢測(cè)");  //字符:18B20 溫度檢測(cè)
  262.                 LCD_write_str(1,0,"正溫度:");                //字符:正溫度
  263.                 LCD_write_str(1,6,"℃");                          //符號(hào):℃
  264.                 LCD_write_char(1,4,0x30+dat/100);
  265.                 LCD_write_char(1,5,0x30+dat%100/10);
  266.         }
  267. }
  268. void tempH_Setting(void)//最高溫度設(shè)置顯示
  269. {
  270.         LCD_write_str(0,1,"18B20 (高)");          //字符:18B20 高溫度設(shè)置
  271.         LCD_write_str(1,0,"溫度設(shè)置:");                  //字符:高溫度設(shè)置
  272.         LCD_write_str(1,7,"℃");                          //符號(hào):℃
  273.         LCD_write_char(1,5,0x30+tempH%100/10);
  274.         LCD_write_char(1,6,0x30+tempH%10);
  275. }
  276. void tempL_Setting(void)//最低溫度設(shè)置顯示
  277. {
  278.         LCD_write_str(0,1,"18B20 (低)");          //字符:18B20 低溫度設(shè)置
  279.         LCD_write_str(1,0,"溫度設(shè)置:");                  //字符:18B20 低溫度設(shè)置
  280.         LCD_write_str(1,7,"℃");                          //符號(hào):℃
  281.         LCD_write_char(1,5,0x30+tempL%100/10);
  282.         LCD_write_char(1,6,0x30+tempL%10);
  283. }
  284. void temp_police(void)//溫度報(bào)警
  285. {
  286.         if(dat/10>=tempH)//最高檢測(cè)溫度>=設(shè)定溫度:D1燈亮
  287.         {
  288.                  PORTC&=~BIT(0);
  289.                 LCD_write_str(3,0,"D1: 亮");            
  290.         }
  291.         else//反之:燈滅
  292.         {
  293.                  PORTC|= BIT(0);
  294.                 LCD_write_str(3,0,"D1: 滅");
  295.         }
  296.        
  297.         if(dat/10<=tempL)//最低檢測(cè)溫度<=設(shè)定溫度:D2燈亮
  298.         {
  299.                  PORTC&=~BIT(1);
  300.                 LCD_write_str(3,4,"D2: 亮");
  301.         }
  302.         else//反之:燈滅
  303.         {
  304.                  PORTC|= BIT(1);
  305.                 LCD_write_str(3,4,"D2: 滅");
  306.         }       
  307. }
  308. //**********************************************************************//
  309. //***************************      按鍵掃描     ************************//
  310. //**********************************************************************//

  311. uchar keys(void)
  312. {
  313.         if(!(PIND&BIT(0)))//溫度顯示
  314.         {
  315.                 delayms(20);
  316.                 if(!(PIND&BIT(0)))
  317.                 {
  318.                         LCD_clear();//LCD清屏
  319.                         keyvalue=0;
  320.                         while(!(PIND&BIT(0)));//等待按鍵抬起
  321.                 }
  322.         }
  323.         if(!(PIND&BIT(1)))//最高、最低溫度設(shè)置選擇
  324.         {
  325.                 delayms(20);
  326.                 if(!(PIND&BIT(1)))
  327.                 {
  328.                         LCD_clear();//LCD清屏
  329.                         key1=key1+1;
  330.                         switch(key1)
  331.                         {
  332.                                  case 1:
  333.                                            tempH_Setting();//最高溫度設(shè)置顯示
  334.                                            temp_police();//溫度報(bào)警
  335.                                            //temp_display();//溫度顯示
  336.                                            keyvalue=1;//按鍵最高溫度返回值:1
  337.                                 break;
  338.                                 case 2:
  339.                                            tempL_Setting();//最低溫度設(shè)置顯示
  340.                                            temp_police();//溫度報(bào)警
  341.                                            //temp_display();//溫度顯示
  342.                                            keyvalue=2;//按鍵最低溫度返回值:2
  343.                                            key1=0;//按鍵清零
  344.                                 break;
  345.                         }
  346.                         while(!(PIND&BIT(1)));//等待按鍵抬起
  347.                 }
  348.         }
  349.         if(!(PIND&BIT(2)))//溫度加
  350.         {
  351.                 delayms(20);
  352.                 if(!(PIND&BIT(2)))
  353.                 {
  354.                         if(keyvalue==1)
  355.                         {
  356.                                  tempH++;
  357.                                 if(tempH>=100)
  358.                                 {
  359.                                          tempH=100;
  360.                                 }
  361.                                 tempH_Setting();//最高溫度設(shè)置顯示
  362.                                 temp_police();//溫度報(bào)警
  363.                                 //temp_display();//溫度顯示
  364.                         }
  365.                         else if(keyvalue==2)
  366.                         {
  367.                                  tempL++;
  368.                                 if(tempL>=100)
  369.                                 {
  370.                                          tempL=100;
  371.                                 }
  372.                                 tempL_Setting();//最低溫度設(shè)置顯示
  373.                                 temp_police();//溫度報(bào)警
  374.                                 //temp_display();//溫度顯示
  375.                         }
  376.                         //while(!(PIND&BIT(2)));//等待按鍵抬起
  377.                 }
  378.         }
  379.         if(!(PIND&BIT(3)))//溫度減
  380.         {
  381.                 delayms(20);
  382.                 if(!(PIND&BIT(3)))
  383.                 {
  384.                         if(keyvalue==1)
  385.                         {
  386.                                  tempH--;
  387.                                 if(tempH<=10)
  388.                                 {
  389.                                          tempH=10;
  390.                                 }
  391.                                 tempH_Setting();//最高溫度設(shè)置顯示
  392.                                 temp_police();//溫度報(bào)警
  393.                                 //temp_display();//溫度顯示
  394.                         }
  395.                         else if(keyvalue==2)
  396.                         {
  397.                                  tempL--;
  398.                                 if(tempL<=10)
  399.                                 {
  400.                                          tempL=10;
  401.                                 }
  402.                                 tempL_Setting();//最低溫度設(shè)置顯示
  403.                                 temp_police();//溫度報(bào)警
  404.                                 //temp_display();//溫度顯示
  405.                         }
  406.                         //while(!(PIND&BIT(3)));//等待按鍵抬起
  407.                 }
  408.         }
  409. }

  410. //**********************************************************************//
  411. //***************************      主函數(shù)       ************************//
  412. //**********************************************************************//

  413. void main()
  414. {
  415.         uchar i;
  416.         IO_init();//端口初始化
  417.         LCD_init();//LCD顯示屏初始化函數(shù)
  418.         while(1)
  419.         {
  420.                 keys();//按鍵掃描
  421.                 if(keyvalue==0)
  422.                 {
  423.                          temp_display();//溫度顯示
  424.                         temp_police();//溫度報(bào)警
  425.                 }
  426.         }
  427. }
復(fù)制代碼

所有資料51hei提供下載:
LCD12864(ATmeg16).zip (58.13 KB, 下載次數(shù): 38)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:455368 發(fā)表于 2018-12-26 13:47 | 顯示全部樓層
謝謝分享
回復(fù)

使用道具 舉報(bào)

ID:229361 發(fā)表于 2018-12-28 16:38 | 顯示全部樓層
謝謝樓主分享
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 婷婷在线网站 | 国产一区二区三区免费 | 欧美一区二区三区国产精品 | 超碰在线人 | 亚洲精品一 | 久久里面有精品 | 麻豆一区一区三区四区 | 亚洲精品电影在线观看 | 久久久影院| 国产中文字幕av | 日韩高清在线观看 | 国产在线对白 | 国产在线不卡 | 国产精品福利在线观看 | 91精品福利 | 国产ts人妖一区二区三区 | 一级毛片网 | 一级黄色在线 | 中文字幕第十五页 | 中文字幕在线观看一区 | 亚洲欧美日韩精品久久亚洲区 | 在线免费观看黄色 | 亚洲视频免费在线看 | av黄色在线播放 | 久久99国产精一区二区三区 | 国产美女在线精品免费 | 国产99热在线 | 一区二区视频在线观看 | 久久久精品网站 | 色999日韩 | 国产高清精品一区二区三区 | 国产美女在线看 | 日韩免费一区二区 | 久久久久1 | 日本一区二区在线视频 | 日韩在线小视频 | av在线免费观看网址 | 91影院在线观看 | 欧美一级片中文字幕 | 国产中的精品av涩差av | 三级视频在线观看电影 |