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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機溫度測控系統+精度為0.1℃+4位共陽數碼管顯示程序+Proteus仿真

[復制鏈接]
跳轉到指定樓層
樓主
要求基本上是實現的。
溫度測控顯示系統
設計功能要求:
(1) DS18B20為溫度傳感器,實時采樣溫度;溫度測量精度:±0.1℃。
(2) 4位LED數碼管主要用于顯示溫度。
(3) 無任何鍵按下,4位LED數碼管顯示時分,初值顯示09:09。
(4)按鍵K1按下,數碼管顯示本機測量的溫度值。
希望可以得到采納!

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


單片機源程序如下:
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共陽LED段碼表
  6. uchar code tab1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//含小數點共陽段碼 0-9
  7. char displayData[4];
  8. uint shi,fen=9,miao=9,T50ms,tt;//時,分,秒,50ms
  9. uchar bai,sh,ge,a,b,t;
  10. sbit a0=P2^0;//連接P2.0
  11. sbit a1=P2^1;//連接P2.1
  12. sbit a2=P2^2;//連接P2.2
  13. sbit a3=P2^3;//連接P2.3
  14. sbit DQ=P3^7;//連接P3.7

  15. /*void delay(uchar n)//延時5微秒函數
  16. {
  17.         do{
  18.                 _nop_();
  19.                 _nop_();
  20.                 _nop_();
  21.                 n--;
  22.         }
  23.         while(n);
  24. }*/

  25. void delay(uint n)
  26. {
  27.         while(n--);       
  28. }

  29. void init() //初始化子程序
  30. {
  31.         TMOD=0x01;//定時器T0為方式1
  32.         TH0=(65536-50000)/256;//采用方式1,并設置定時器初值,50ms
  33.         TL0=(65536-50000)%256;
  34.         ET0=1;//啟動T0中斷允許
  35.         EA=1;//總中斷允許
  36.         TR0=1;//啟動T0
  37.         EX0=1;//允許外部中斷0中斷
  38.         //PX0=1;//外部中斷0高優先級中斷
  39.         //PT0=1;//定時器T0中斷高優先級中斷
  40. }

  41. void scan()//掃描
  42. {
  43.           displayData[0] = tab[miao%10];
  44.           displayData[1] = tab[(miao/10)%10];
  45.           displayData[2] = tab[fen%10]|0x80;
  46.           displayData[3] = tab[(fen/10)%10];       
  47. }

  48. void display()                //顯示位數
  49. {
  50.         char i;
  51.         for(i=0;i<=3;i++)
  52.         {
  53.                 switch(i)
  54.                 {
  55.                         case 0:a0=0;a1=0;a2=0;a3=1;break;//顯示第0位
  56.                         case 1:a0=0;a1=0;a2=1;a3=0;break;//顯示第1位
  57.                         case 2:a0=0;a1=1;a2=0;a3=0;break;//顯示第2位
  58.                         case 3:a0=1;a1=0;a2=0;a3=0;break;//顯示第3位
  59.                 }
  60.                 if(i==2){
  61.                         P0=(displayData[i]&0x7f);//加小數點
  62.                         }else
  63.                 P0=displayData[i];//發送數據
  64.                         delay(200); //間隔一段時間掃描
  65.                         P0=0xff;//高電位清零
  66.                         }
  67. }

  68. int_DS18b20()//對18b20初始化函數
  69. {
  70.         uchar x=0;
  71.   DQ = 1;    //DQ復位
  72.   delay(8);
  73.   DQ=0;    //釋放DQ
  74.   delay(80); //DS18B20收到信號后延時
  75.   DQ=1;   //讀取DQ
  76.   delay(10);
  77.         x=DQ;
  78.   delay(20);
  79.         return x;
  80. }

  81. void write_byte(uchar dat)//寫時序
  82. {
  83.         uchar i=0;
  84.   for(i=8;i>0;i--){
  85.                 DQ=0;
  86.                 DQ=dat&0x01;//寫1,在15微秒內拉低
  87.                 delay(5);//寫0,拉低60微秒
  88.                 DQ=1;
  89.                 dat>>=1;//右移1位,原數值除以2
  90.         }
  91.         delay(4);
  92. }

  93. read_byte()//讀時序
  94. {
  95.         uchar i=0;
  96.   uchar dat=0;
  97.   for(i=8;i>0;i--){
  98.                 DQ=0;//拉低ds18b20單總線
  99.                 dat>>=1;
  100.     DQ=1;//15微秒內拉釋放總線,等待ds18b20的存在脈沖
  101.     if(DQ)
  102.     dat|=0x80;
  103.     delay(4);
  104.         }
  105.         return (dat);
  106. }
  107.        
  108. void int_()
  109. {
  110.         while(int_DS18b20());
  111.         write_byte(0xcc);//發Skip ROM命令,由于只有一只DS18B20就不需要讀取ROM編碼以及匹配ROM編碼
  112.   write_byte(0x44);//啟動溫度轉換
  113. }

  114. void ReadTemperature()//讀取溫度的函數
  115.   {
  116.     uchar a=0;
  117.     unsigned  b=0;
  118.     unsigned  t=0;
  119.                 int_();
  120.     delay(5);//延時,必要
  121.     int_DS18b20();
  122.     write_byte(0xCC);//跳過讀寫序列號
  123.     write_byte(0xBE);//讀溫度寄存器
  124.     delay(5);
  125.     a=read_byte();//讀取溫度
  126.     b=read_byte();      
  127.     t=b<<4;//取高八位的后三位
  128.     t+=(a&0xf0)>>4;//低八位的高四位加上高八位中后三位的值
  129.     tt=a&0x0f;//小數位
  130.     sh=((b*256+a)>>4);//實際溫度
  131.     ge=tt*0.0625*10;
  132.    }

  133. void wenduxianshi()//溫度顯示的函數
  134. {
  135.          a0=1;
  136.          P0=tab[sh/10];//百
  137.          delay(100);
  138.          a0=0;
  139.          
  140.          a1=1;
  141.          P0=tab[sh%10]+0x80;//十位,+0x80可以顯示小數點后一位
  142.    delay(100);
  143.          a1=0;
  144.       
  145.    a2=1;
  146.          P0=tab[ge%10];//個位
  147.          delay(100);
  148.          a2=0;
  149.          
  150.    a3=1;
  151.          P0=0xc6;// C
  152.          delay(100);
  153.          a3=0;
  154. }

  155. void main()//主函數
  156. {
  157.         init();//初始化程序
  158.         while(1){
  159.                 scan();//掃描
  160.                 display();//顯示
  161.         }
  162. }

  163. void timer0() interrupt 1//timer0中斷服務子程序定是時間為50ms
  164. {
  165.         TH0=(65536-50000)/256;
  166.         TL0=(65536-50000)%256;
  167.         T50ms++;
  168.         if(T50ms==20)//仿分鐘
  169.                 {
  170.                         T50ms=0;
  171.                         miao++;
  172.                         if(miao>=60)
  173.                                 {
  174.                                         miao=miao-60;
  175.                                         fen++;
  176.                                         if(fen>=60)
  177.                                                 {
  178.                                                         fen=fen-60;
  179.                                                         shi++;
  180.                                                 }
  181.                                 }
  182.                 }
  183. }
  184. void timer1() interrupt 0//外部中斷0
  185. {
  186.         uint count=0;
  187.         while(1)
  188.                 {
  189.                         count++;
  190.                         ReadTemperature();
  191.                         wenduxianshi();
  192.                         wenduxianshi();
  193.                         if(count==250)//隔一段時間返回時鐘
  194.                                 {
  195.                                         miao=miao+4;
  196.                                         break;
  197.                                 }
  198.                 }
  199. }
復制代碼

所有資料51hei提供下載:
溫度.rar (23.68 KB, 下載次數: 128)

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

使用道具 舉報

沙發
ID:792521 發表于 2020-6-30 09:23 | 只看該作者
太有幫助了頂!!
回復

使用道具 舉報

板凳
ID:853006 發表于 2020-12-2 12:58 | 只看該作者
用這個源程序生成的.hex能直接燒到實物里么
回復

使用道具 舉報

地板
ID:853006 發表于 2020-12-3 18:32 來自手機 | 只看該作者
數碼管一直不亮是為什么
回復

使用道具 舉報

5#
ID:611568 發表于 2020-12-5 12:48 | 只看該作者
歷害了,學習一下
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线播放国产一区二区三区 | 中文字幕免费视频 | 国产精品美女久久久久久久久久久 | 国产一级视频在线观看 | 黄色一级大片在线免费看产 | 伊人色综合久久天天五月婷 | 日韩精品亚洲专区在线观看 | 97av| 午夜av电影 | 午夜精品久久久久久久99黑人 | 成人精品在线视频 | 精品国产欧美日韩不卡在线观看 | 国产精品久久久久久久久久免费看 | 精品国产一区二区国模嫣然 | 91视频在线观看 | 欧美精品二区 | 看一级毛片视频 | 久久蜜桃av | 欧美另类日韩 | 免费一区 | 日韩久久久久久 | 欧美精品在线播放 | 免费黄色片在线观看 | 日韩视频91 | 亚洲视频免费一区 | 精品久久久久久久久久久久久久 | 久久99精品久久久久久秒播九色 | 99久久成人 | 激情久久网| 午夜免费影视 | 人和拘一级毛片c | 亚洲国产一区二区在线 | 亚洲欧美中文日韩在线v日本 | 亚洲成人高清 | 美女在线一区二区 | 97久久精品午夜一区二区 | 久久人体视频 | 国产成人精品一区二区三区 | 综合久久综合久久 | 黄色片网此 | 日本久久精品视频 |