欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3323|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

關(guān)于單片機(jī)+MAX7219 8位數(shù)碼管顯示的程序如何改為4位數(shù)碼管

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:443131 發(fā)表于 2018-12-20 11:23 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
對(duì)于DS18B20溫度計(jì)報(bào)警功能
  1. #include<reg52.h>     //包含頭文件,一般情況不需要改動(dòng),頭文件包含特殊功能寄存器的定義
  2. #include<math.h>
  3. #include<INTRINS.H>
  4. #define uchar unsigned char
  5. #define uint   unsigned int
  6. /******************************************************************/
  7. /*                    定義端口                                    */
  8. /******************************************************************/
  9. sbit buzzer=P1^0;//蜂鳴器端口
  10. sbit DQ=P1^4;         //ds18b20 端口
  11. sbit key1=P3^4;  //按鍵
  12. sbit key2=P3^5;
  13. sbit key3=P3^6;
  14. sbit key4=P3^7;
  15. /******************************************************************/
  16. /*                    全局變量                                    */
  17. /******************************************************************/
  18. uint temp;//當(dāng)前溫度值
  19. uchar TempH=0,TempL=0;
  20. int temp_max,temp_min;//設(shè)定溫度的最大值和最小值
  21. uchar flag_get,count,num;
  22. uchar tab[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //0~~9段碼
  23. uchar  str[4];//四位數(shù)碼管顯示字符
  24. uchar display_mod;//數(shù)碼管顯示模式
  25. /******************************************************************/
  26. /*                   函數(shù)聲明                                     */
  27. /******************************************************************/
  28. unsigned int ReadTemperature(void);//讀取溫度函數(shù)
  29. void Init_DS18B20(void);//18b20初始化函數(shù)
  30. unsigned char ReadOneChar(void);//18B20讀一個(gè)字節(jié)
  31. void WriteOneChar(unsigned char dat);//18B20寫一個(gè)字節(jié)
  32. void delay(unsigned int i);//短延時(shí)
  33. void delay_ms(uint z);//長延時(shí)
  34. void alarm();//報(bào)警
  35. void keyscan();//鍵盤掃描
  36. /******************************************************************/
  37. /*                    主函數(shù)                                      */
  38. /******************************************************************/
  39. main()
  40. {
  41.         uchar buzzer_delay=0;//蜂鳴器延時(shí)計(jì)數(shù)
  42.         uchar buzzer_work=0;//蜂鳴器開始工作
  43.         display_mod=0;//顯示當(dāng)前溫度
  44.         temp_min=10;//設(shè)置最低溫  
  45.         temp_max=40;//設(shè)置最高溫
  46.         TMOD|=0x01;//定時(shí)器設(shè)置
  47.         TH0=0xef;  //定時(shí)器初值
  48.         TL0=0xf0;
  49.         IE=0x82;//EA=1,ET0=1
  50.         TR0=1;  //開定時(shí)器
  51.         P2=0xff;  
  52.         count=0;
  53.         buzzer=0;
  54.         while(1)
  55.         {
  56.                   keyscan();//獨(dú)立按鍵掃描
  57.                         
  58.                 if(flag_get==1)
  59.                 {   buzzer_delay++;
  60.                         flag_get=0;// 獲取溫度標(biāo)志清零
  61.                         temp=ReadTemperature();//讀溫度值
  62.                 }                        
  63.                 if(display_mod==0)
  64.                 {
  65.                         if(temp&0x8000)
  66.                      {
  67.                              str[0]=0xbf;//負(fù)號(hào)標(biāo)志
  68.                              temp=~temp; //取反加1
  69.                                  temp +=1;
  70.                          }
  71.                         else
  72.                         {
  73.                                 str[0]=0xff;
  74.                         }
  75.                         TempH=temp>>4;
  76.                           TempL=temp&0x0F;
  77.                           TempL=TempL*6/10;//小數(shù)近似處理
  78.                         
  79.                         str[1]=tab[(TempH%100)/10]; //十位溫度
  80.                            str[2]=tab[(TempH%100)%10]&0x7f; //個(gè)位溫度,帶小數(shù)點(diǎn)
  81.                            str[3]=tab[TempL];                        
  82.                 }
  83.                 else if(display_mod==1)//顯示最低溫
  84.                 {
  85.                         str[0]=0xc7;//顯示L
  86.                         str[1]=tab[temp_min/100]; //溫度百位
  87.                            str[2]=tab[(temp_min%100)/10]; //溫度十位
  88.                            str[3]=tab[temp_min%10];//溫度個(gè)位
  89.                 }
  90.                 else if(display_mod==2)//顯示最高溫
  91.                 {
  92.                         str[0]=0x89;//顯示H
  93.                         str[1]=tab[temp_max/100]; //溫度百位
  94.                            str[2]=tab[(temp_max%100)/10]; //溫度十位
  95.                            str[3]=tab[temp_max%10];//溫度個(gè)位        
  96.                 }
  97.                 if(buzzer_delay>5)//為了防止溫度獲取前就會(huì)出現(xiàn)報(bào)警
  98.                 {
  99.                         buzzer_work=1;
  100.                 }
  101.                 if(buzzer_work==1)
  102.                         alarm();
  103.           }
  104. }

  105. /******************************************************************/
  106. /*                  定時(shí)器中斷                                    */
  107. /******************************************************************/
  108. void tim(void) interrupt 1 using 1//中斷,用于數(shù)碼管掃描和溫度檢測間隔
  109. {
  110.         TH0=0xea;//定時(shí)器重裝值
  111.         TL0=0xf0;
  112.         num++;
  113.         if (num==100)
  114.     {
  115.                 num=0;
  116.                   flag_get=1;//獲取溫度標(biāo)志位有效
  117.         }
  118.         count++;
  119.         if(count==1)
  120.            {
  121.                 //P2=0Xfe;
  122.                 P2=0x01;
  123.             P0=str[0];
  124.         }//數(shù)碼管掃描
  125.         if(count==2)
  126.    {
  127.                 if(str[1]==tab[0])
  128.                         str[1]=0xff;//顯示為空
  129.                    //P2=0Xfd;
  130.                 P2=0x02;
  131.             P0=str[1];
  132.         }
  133.         if(count==3)
  134.    {
  135.                 //P2=0Xfb;
  136.                 P2=0x04;
  137.              P0=str[2];
  138.    }
  139.         if(count==4)
  140.    {
  141.                 //P2=0Xf7;
  142.                 P2=0x08;
  143.              P0=str[3];
  144.                 count=0;
  145.    }
  146. }
  147. /******************************************************************/
  148. /*                    長延時(shí)函數(shù)                                  */
  149. /******************************************************************/
  150. void delay_ms(uint z) //長延時(shí)函數(shù)
  151. {
  152.         uint x,y;
  153.         for(x=z;x>0;x--)
  154.                 for(y=110;y>0;y--);
  155. }
  156. /******************************************************************/
  157. /*                    短延時(shí)函數(shù)                                  */
  158. /******************************************************************/
  159. void delay(unsigned int i)//短延時(shí)函數(shù)
  160. {
  161.         while(i--);
  162. }
  163. /******************************************************************/
  164. /*                    初始化                                      */
  165. /******************************************************************/
  166. void Init_DS18B20(void)
  167. {
  168.         /*unsigned char x=0;
  169.         DQ = 1;    //DQ復(fù)位
  170.         delay(8);  //稍做延時(shí)
  171.         DQ = 0;    //單片機(jī)將DQ拉低
  172.         delay(80); //精確延時(shí) 大于 480us
  173.         DQ = 1;    //拉高總線
  174.         delay(10);
  175.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  176.         delay(5);*/
  177.         unsigned char x=0;
  178.         DQ = 1;    //DQ復(fù)位
  179.         delay(8);  //稍做延時(shí)
  180.         DQ = 0;    //單片機(jī)將DQ拉低
  181.         delay(80); //精確延時(shí) 大于 480us
  182.         DQ = 1;    //拉高總線
  183.         delay(14);
  184.         x=DQ;      //稍做延時(shí)后 如果x=0則初始化成功 x=1則初始化失敗
  185.         delay(20);
  186. }
  187. /******************************************************************/
  188. /*                    讀一個(gè)字節(jié)                                  */
  189. /******************************************************************/
  190. unsigned char ReadOneChar(void)
  191. {
  192.         unsigned char i=0;
  193.         unsigned char dat = 0;
  194.         for (i=8;i>0;i--)
  195.         {
  196.                   DQ = 0; // 給脈沖信號(hào)
  197.                   dat>>=1;
  198.                   DQ = 1; // 給脈沖信號(hào)
  199.                   if(DQ)
  200.                            dat|=0x80;
  201.                   delay(5);
  202.         }
  203.         return(dat);
  204. }
  205. /******************************************************************/
  206. /*                 寫一個(gè)字節(jié)                                     */
  207. /******************************************************************/
  208. void WriteOneChar(unsigned char dat)
  209. {
  210.         unsigned char i=0;
  211.         for (i=8; i>0; i--)
  212.         {
  213.           DQ = 0;
  214.           DQ = dat&0x01;
  215.           delay(5);
  216.           DQ = 1;
  217.           dat>>=1;
  218.         }
  219.         delay(5);
  220. }
  221. /******************************************************************/
  222. /*                   讀取溫度                                     */
  223. /******************************************************************/
  224. unsigned int ReadTemperature(void)
  225. {        
  226.         unsigned char a=0;
  227.         unsigned int b=0;
  228.         unsigned int t=0;
  229.         Init_DS18B20();
  230.         WriteOneChar(0xCC); // 跳過讀序號(hào)列號(hào)的操作
  231.         WriteOneChar(0x44); // 啟動(dòng)溫度轉(zhuǎn)換
  232.         delay(200);
  233.         Init_DS18B20();
  234.         WriteOneChar(0xCC); //跳過讀序號(hào)列號(hào)的操作
  235.         WriteOneChar(0xBE); //讀取溫度寄存器等(共可讀9個(gè)寄存器) 前兩個(gè)就是溫度
  236.         a=ReadOneChar();   //低位
  237.         b=ReadOneChar();   //高位
  238.         b<<=8;
  239.         t=a+b;
  240.         return(t);
  241. }
  242. /******************************************************************/
  243. /*              獨(dú)立鍵盤掃描函數(shù)并顯示設(shè)定的溫度                  */
  244. /******************************************************************/
  245. void keyscan()  
  246. {        
  247.         static uchar keynum;//用于切換界面時(shí)按鍵計(jì)數(shù)
  248.         P3=0xff;//拉高P3口,以讀取P3口的值
  249.         if(key4==0)//設(shè)置鍵
  250.         {
  251.                 delay_ms(5);//延時(shí)消抖
  252.                 if(key4==0)
  253.                 {
  254.                         keynum++;
  255.                         keynum%=2;//在0、1間變化
  256.                         if(keynum==1)
  257.                         {
  258.                                 display_mod=1;
  259.                         }
  260.                         else
  261.                         {
  262.                                 display_mod=2;
  263.                         }
  264.                 }
  265.                 while(!key4);//松手檢測
  266.         }
  267.         if(key3==0)//確定鍵
  268.         {
  269.                 delay_ms(5);
  270.                 if(key3==0)
  271.                 {
  272.                         keynum=0;
  273.                         display_mod=0;
  274.                 }
  275.                 while(!key3);
  276.         }
  277.         if(key2==0)//加鍵
  278.         {
  279.                 delay_ms(5);//延時(shí)消抖
  280.                 if(key2==0)
  281.                 {
  282.                         if(display_mod==2)
  283.                         {
  284.                                 temp_max++;
  285.                                 if(temp_max>=99)
  286.                                         temp_max=99;
  287.                         }
  288.                         if(display_mod==1)
  289.                         {
  290.                                 temp_min++;
  291.                                 if(temp_min>=temp_max)
  292.                                         temp_min=temp_max;
  293.                         }
  294.                         
  295.                 }
  296.                 while(!key2);//松手檢測
  297.         }
  298.         if(key1==0)//減鍵
  299.         {
  300.                 delay_ms(5);
  301.                 if(key1==0)
  302.                 {
  303.                         if(display_mod==2)
  304.                         {
  305.                                 temp_max--;
  306.                                 if(temp_max<=temp_min)
  307.                                         temp_max=temp_min;
  308.                         }
  309.                         if(display_mod==1)
  310.                         {
  311.                                 temp_min--;
  312.                                 if(temp_min<=0)
  313.                                         temp_min=0;
  314.                         }
  315.                 }
  316.                 while(!key1);//松手檢測
  317.         }
  318. }
  319. /******************************************************************/
  320. /*                  蜂鳴器報(bào)警程序                                */
  321. /******************************************************************/
  322. void alarm()
  323. {
  324.         if(display_mod==0)//在顯示當(dāng)前溫度時(shí)報(bào)警才會(huì)動(dòng)作
  325.         {
  326.         if(TempH<(temp_min))
  327.         {
  328.                 led1=0;
  329.                 led2=1;
  330.                 buzzer=~buzzer;
  331.         }
  332.         else if(TempH>=(temp_max))
  333.         {
  334.                 led1=1;
  335.                 led2=0;
  336.                 buzzer=~buzzer;
  337.         }
  338.         else
  339.         {
  340.                 led1=1;
  341.                 led2=1;
  342.                 buzzer=0;
  343.         }
  344.         }
  345. }
復(fù)制代碼


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

使用道具 舉報(bào)

沙發(fā)
ID:443131 發(fā)表于 2018-12-20 11:25 | 只看該作者
上傳的程序是四位數(shù)碼管的,怎么修改成MAX7219驅(qū)動(dòng)的8位數(shù)碼管!!
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表