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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4630|回復: 2
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
LCD12864溫度檢測顯示程序(ATmega16)
制作出來的實物圖如下:


單片機源程序如下:
  1. /*---------------------------------------------------------------
  2. ATmega64并行控制不帶字庫的12864程序
  3. ---------------------------------------------------------------
  4. 實驗內容: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. 編譯燒寫該程序到ATmega64
  29. 上電,如果操作正確,這時您可以看到顯示的內容了
  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液晶顯示(數據線端口)
  41. #define rs_h PORTB |= BIT(PB0)//數據/命令選擇
  42. #define rs_l PORTB &=~BIT(PB0)
  43. #define rw_h PORTB |= BIT(PB1)//讀/寫選擇
  44. #define rw_l PORTB &=~BIT(PB1)
  45. #define en_h PORTB |= BIT(PB2)//使能信號
  46. #define en_l PORTB &=~BIT(PB2)
  47. //溫度18b20(數據線端口)
  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. //數組定義
  54. /*
  55. unsigned char dis1[]={"黃俊華,啊蠢。"};
  56. unsigned char dis2[]={"曾志成,啊成。"};
  57. unsigned char dis3[]={"梁毓毅,啊毓。"};
  58. unsigned char dis4[]={"柳藝明,啊明。"};

  59. unsigned char dis1[]={"溫度檢測"};
  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;//錯誤標志位
  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. //*************************      延時函數         **********************//
  91. //**********************************************************************//

  92. void delayms(uint z)          //8M晶振下,延時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)//清屏函數
  102. {
  103.   write_com(0x01);
  104.   delayms(5);
  105. }
  106. void lcd_en(void)        //en端產生一個高電平脈沖,控制LCD寫時序
  107. {
  108.         delayms(5);//延時5ms
  109.         en_h;
  110.     delayms(5);//延時5ms
  111.     en_l;
  112. }
  113. void write_com(uchar com)//向LCD12864寫命令
  114. {
  115.         rs_l;
  116.         rw_l;
  117.         en_h;
  118.         delayms(5);//延時5ms
  119.         PORTA=com;
  120.         lcd_en();//寫入命令
  121. }
  122. void write_dat(uchar dat)//向LCD12864寫數據
  123. {
  124.         rs_h;
  125.         rw_l;
  126.         en_h;
  127.         delayms(5);//延時5ms
  128.         PORTA=dat;
  129.         lcd_en();//寫入數據
  130. }
  131. void LCD_init(void)//LCD顯示屏初始化函數
  132. {
  133.         write_com(0x30);//設置8位數據總線,DB7~DB0;
  134.         delayms(5);//延時5ms
  135.         write_com(0x0c);//開顯示,光標不顯示;
  136.         delayms(5);//延時5ms
  137.         write_com(0x01);//清屏
  138.         delayms(5);//延時5ms
  139. }
  140. void LCD_pos(uchar x,uchar y)//字符顯示初始地址設置
  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列開始顯示,指針*S所指向的字符串
  163. {
  164.         LCD_pos(x,y);//設置初始字符顯示地址
  165.         while(*s)//逐次寫入顯示字符,直到最后一個字符"/0"
  166.         {
  167.                  write_dat(*s);//寫入當前字符并顯示
  168.                 s++;//地址指針加1,指向下一個待寫字符
  169.         }
  170. }
  171. void LCD_write_char(uchar x,uchar y,uchar Wdata)//在第X行Y列開始顯示Wdata所對應的單個字符
  172. {
  173.         LCD_pos(x,y);//設置初始字符顯示地址
  174.         write_dat(Wdata);//寫入當前字符并顯示
  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--);//延時480us
  185.         temp_h;
  186.         temp_i;//不須配置PORT內部上拉電阻,MCU輸入輸出自動切換
  187.         while((tmp==0x08));//&&(i>0)) i--;
  188.         for(count=700;count>0;count--);//延時480us
  189. }
  190. void Ds18b20_write(uchar dat)//向DS18B20寫一個字節
  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;//不能有此語句
  200.                 if(dat&0x01==0x01)
  201.                         temp_h;
  202.                 else
  203.                         temp_l;
  204.                 for(count=120;count>0;count--);//延時60us
  205.                 temp_h;
  206.                 dat>>=1;       
  207.         }       
  208. }
  209. uchar Ds18b20_read(void)//從DS18B20讀一個字節
  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;//此語句必須有,參考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--);        //延時60us
  225.         }
  226.         return datt;
  227. }
  228. void temp_display(void)//溫度顯示
  229. {
  230.         Ds18b20_reset();//DS18B20初始化
  231.         Ds18b20_write(0xcc);//跳過ROM
  232.         Ds18b20_write(0x44);//發送溫度轉換命令
  233.         delayms(1000);//延時1s,等待溫度轉換完成
  234.         Ds18b20_reset();//DS18B20初始化
  235.         Ds18b20_write(0xcc);//跳過ROM
  236.         Ds18b20_write(0xbe);//發送讀溫度寄存器命令
  237.         dat1=Ds18b20_read();//讀溫度值的低字節
  238.         dat2=Ds18b20_read();//讀溫度值的高字節
  239.        
  240.         if(dat2>=240)//dat2溫度值的高字節為1時為負溫度
  241.         {
  242.                 dat=(~(dat2*256+dat1)+1)*0.625;//負溫度:取反加一,保留一位小數
  243.                 flag=1;
  244.         }
  245.         else
  246.         {
  247.                 dat=(dat2*256+dat1)*0.625;
  248.                 flag=0;
  249.         }
  250. /*******************************************************   正負溫度顯示   **/
  251.         if(flag==1)//負溫度顯示
  252.         {
  253.                 LCD_write_str(0,0,"18B20 溫度檢測");  //字符:18B20 溫度檢測
  254.                 LCD_write_str(1,0,"負溫度:");                       //字符:負溫度
  255.                 LCD_write_str(1,6,"℃");                          //符號:℃
  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 溫度檢測");  //字符:18B20 溫度檢測
  262.                 LCD_write_str(1,0,"正溫度:");                //字符:正溫度
  263.                 LCD_write_str(1,6,"℃");                          //符號:℃
  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)//最高溫度設置顯示
  269. {
  270.         LCD_write_str(0,1,"18B20 (高)");          //字符:18B20 高溫度設置
  271.         LCD_write_str(1,0,"溫度設置:");                  //字符:高溫度設置
  272.         LCD_write_str(1,7,"℃");                          //符號:℃
  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)//最低溫度設置顯示
  277. {
  278.         LCD_write_str(0,1,"18B20 (低)");          //字符:18B20 低溫度設置
  279.         LCD_write_str(1,0,"溫度設置:");                  //字符:18B20 低溫度設置
  280.         LCD_write_str(1,7,"℃");                          //符號:℃
  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)//溫度報警
  285. {
  286.         if(dat/10>=tempH)//最高檢測溫度>=設定溫度: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)//最低檢測溫度<=設定溫度: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)))//最高、最低溫度設置選擇
  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();//最高溫度設置顯示
  334.                                            temp_police();//溫度報警
  335.                                            //temp_display();//溫度顯示
  336.                                            keyvalue=1;//按鍵最高溫度返回值:1
  337.                                 break;
  338.                                 case 2:
  339.                                            tempL_Setting();//最低溫度設置顯示
  340.                                            temp_police();//溫度報警
  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();//最高溫度設置顯示
  362.                                 temp_police();//溫度報警
  363.                                 //temp_display();//溫度顯示
  364.                         }
  365.                         else if(keyvalue==2)
  366.                         {
  367.                                  tempL++;
  368.                                 if(tempL>=100)
  369.                                 {
  370.                                          tempL=100;
  371.                                 }
  372.                                 tempL_Setting();//最低溫度設置顯示
  373.                                 temp_police();//溫度報警
  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();//最高溫度設置顯示
  392.                                 temp_police();//溫度報警
  393.                                 //temp_display();//溫度顯示
  394.                         }
  395.                         else if(keyvalue==2)
  396.                         {
  397.                                  tempL--;
  398.                                 if(tempL<=10)
  399.                                 {
  400.                                          tempL=10;
  401.                                 }
  402.                                 tempL_Setting();//最低溫度設置顯示
  403.                                 temp_police();//溫度報警
  404.                                 //temp_display();//溫度顯示
  405.                         }
  406.                         //while(!(PIND&BIT(3)));//等待按鍵抬起
  407.                 }
  408.         }
  409. }

  410. //**********************************************************************//
  411. //***************************      主函數       ************************//
  412. //**********************************************************************//

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

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


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:455368 發表于 2018-12-26 13:47 | 只看該作者
謝謝分享
回復

使用道具 舉報

板凳
ID:229361 發表于 2018-12-28 16:38 | 只看該作者
謝謝樓主分享
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一区二区三区国产 | 日本超碰 | 国产精品波多野结衣 | 久久伊人久久 | 成人国产在线视频 | 羞羞视频在线网站观看 | 91色视频在线观看 | 成人欧美一区二区三区视频xxx | 久久综合久色欧美综合狠狠 | 亚洲一区三区在线观看 | 欧美精品欧美精品系列 | 欧美午夜精品理论片a级按摩 | 国产精品久久久久久高潮 | 日韩超碰在线 | 国产精品久久二区 | 国产精品成av人在线视午夜片 | 蜜桃视频一区二区三区 | 一区二区精品 | 国产精品一区二区三区在线 | 国产日韩欧美二区 | 91av在线视频观看 | 伊人久麻豆社区 | 热re99久久精品国99热观看 | 正在播放国产精品 | 亚洲国产精品一区 | 一区二区三区高清在线观看 | 激情国产| 成人h视频在线 | 亚洲一区二区三区福利 | 国产成人99久久亚洲综合精品 | 午夜精品久久久久久久久久久久久 | 91视频在线看 | 狠狠综合网 | 欧美一区二区三区四区五区无卡码 | 黄色香蕉视频在线观看 | 狠狠夜夜| 国产精品中文字幕在线 | 国产在线视频一区二区 | 毛片网在线观看 | 老牛嫩草一区二区三区av | 国产精品久久久久久久久久久久久久 |