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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

湖南大學STC-B單片機學習板光照溫度測量程序(AD轉換)

[復制鏈接]
跳轉到指定樓層
樓主
ID:427912 發表于 2018-11-16 21:07 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
可以將光照值和溫度值顯示在數碼管上(AD轉換)

單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. sfr P0M1 = 0x93;
  4. sfr P0M0 = 0x94;
  5. sfr P2M1 = 0x95;
  6. sfr P2M0 = 0x96;
  7. sfr CLK_DIV = 0x97;
  8. //sfr AUXR = 0x8E;

  9. sfr ADC_CONTR = 0xBC;                  //ADC控制寄存器
  10. sfr ADC_RES = 0xBD;                    //ADC高8位結果
  11. sfr ADC_LOW2 = 0xBE;                  //ADC低2位結果
  12. sfr P1ASF = 0x9D;                     //P1口模擬功能控制寄存器

  13. #define ADC_POWER 0x80                //ADC電源控制位
  14. #define ADC_FLAG 0x10                 //ADC完成標志
  15. #define ADC_START 0x08                //ADC起始控制位
  16. #define ADC_SPEEDLL 0x00              //540個時鐘
  17. #define ADC_SPEEDL 0x20               //360個時鐘
  18. #define ADC_SPEEDH 0x40               //180個時鐘
  19. #define ADC_SPEEDHH 0x60              //90個時鐘

  20. sbit LED_SEL = P2^3;
  21. sbit BEEP = P3^4;

  22. unsigned char code LedChar[] = {    //數碼管顯示字符轉換表  0-F
  23.   0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
  24.         0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71
  25. };

  26. unsigned char LedBuff[9] = {        //數碼管顯示緩沖區 + 獨立LED緩沖區
  27.   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
  28. };

  29. int code TempData[]={
  30.         239,197,175,160,150,142,135,129,124,120,116,113,109,107,104,101,  //溫度值對應表
  31.         99, 97, 95, 93, 91, 90, 88, 86, 85, 84, 82, 81, 80, 78, 77, 76,
  32.         75, 74, 73, 72, 71, 70, 69, 68, 67, 67, 66, 65, 64, 63, 63, 62,
  33.         61, 61, 60, 59, 58, 58, 57, 57, 56, 55, 55, 54, 54, 53, 52, 52,
  34.         51, 51, 50, 50, 49, 49, 48, 48, 47, 47, 46, 46, 45, 45, 44, 44,
  35.         43, 43, 42, 42, 41, 41, 41, 40, 40, 39, 39, 38, 38, 38, 37, 37,
  36.         36, 36, 36, 35, 35, 34, 34, 34, 33, 33, 32, 32, 32, 31, 31, 31,
  37.         30, 30, 29, 29, 29, 28, 28, 28, 27, 27, 27, 26, 26, 26, 25, 25,
  38.         24, 24, 24, 23, 23, 23, 22, 22, 22, 21, 21, 21, 20, 20, 20, 19,
  39.         19, 19, 18, 18, 18, 17, 17, 16, 16, 16, 15, 15, 15, 14, 14, 14,
  40.         13, 13, 13, 12, 12, 12, 11, 11, 11, 10, 10, 9, 9, 9, 8, 8, 8, 7,
  41.         7, 7, 6, 6,5, 5, 54,4, 3, 3,3, 2, 2, 1, 1, 1, 0, 0, -1, -1, -1,
  42.         -2, -2, -3, -3, -4, -4, -5, -5, -6, -6, -7, -7, -8, -8, -9, -9,
  43.         -10, -10, -11, -11, -12, -13, -13, -14, -14, -15, -16, -16, -17,
  44.         -18, -19, -19, -20, -21, -22, -23, -24, -25, -26, -27, -28, -29,
  45.         30, -32, -33, -35, -36, -38, -40, -43, -46, -50, -55, -63, 361
  46. };

  47. unsigned char ch = 3;    //ADC通道號
  48. int temp = 0;
  49. unsigned int light = 0;
  50. unsigned char T0RH = 0;      //T0重載值的高字節
  51. unsigned char T0RL = 0;      //T0重載值的低字節
  52. bit beep_flag = 0;         //蜂鳴器運行控制位

  53. void InitADC();
  54. void Delay2ms();
  55. void ConfigTimer0(unsigned int ms);

  56. void main()
  57. {
  58.         P0M0 = 0xFF;
  59.         P0M1 = 0x00;
  60.         P2M0 = 0x08;
  61.         P2M1 = 0x00;
  62.        
  63.         LED_SEL = 0;
  64.        
  65.   InitADC();                //初始化ADC
  66.         IE = 0xA0;                //使能ADC中斷
  67.                                   //開始AD轉換
  68.         ConfigTimer0(1);       //配置T0定時1ms
  69.                                   
  70.         while(1)
  71.         {
  72.                 if (temp < 0)
  73.                 {
  74.                   LedBuff[0] = 0x40;
  75.                         LedBuff[1] = LedChar[-temp/10%10];
  76.                   LedBuff[2] = LedChar[-temp%10];
  77.                 }
  78.                 else
  79.                 {
  80.                   LedBuff[0] = LedChar[temp/100%10];
  81.                   LedBuff[1] = LedChar[temp/10%10];
  82.                   LedBuff[2] = LedChar[temp%10];
  83.                 }

  84.                
  85.                 LedBuff[5] = LedChar[light/100%10];
  86.                 LedBuff[6] = LedChar[light/10%10];
  87.                 LedBuff[7] = LedChar[light%10];
  88.                
  89.                 if (temp >= 28)
  90.                 {
  91.                   beep_flag = 1;
  92.                         LedBuff[8] = 0xFF;
  93.                 }
  94.                 else
  95.                 {
  96.                   LedBuff[8] = 0x01;
  97.                 }
  98.         }
  99. }

  100. /* ADC中斷服務程序 */
  101. void adc_isr() interrupt 5 using 1
  102. {
  103.         static unsigned int cnt = 0;      //記錄ADC中斷次數
  104.         static unsigned long temp_sum = 0;   //溫度AD值累加和
  105.         static unsigned long light_sum = 0;  //光照AD值累加和
  106.        
  107.         cnt++;            //中斷次數+1
  108.   ADC_CONTR &= !ADC_FLAG;       //清除ADC中斷標志
  109.        
  110.         if (ch == 3)
  111.         {
  112.           temp_sum += (ADC_RES*256+ADC_LOW2)/4;
  113.         }
  114.         if (ch == 4)
  115.         {
  116.           light_sum += ADC_RES*256+ADC_LOW2;
  117.         }
  118.        
  119.         if (cnt > 2000)
  120.         {
  121.           cnt = 0;
  122.                
  123.                 temp = TempData[(temp_sum+1000/2)/1000-1];
  124.                 light = (light_sum+1000/2)/1000;
  125.                 temp_sum = 0;
  126.                 light_sum = 0;
  127.         }
  128.        
  129.         ADC_RES = 0;               
  130.         ADC_LOW2 = 0;               //清除結果寄存器
  131.        
  132.         if (++ch == 5) ch=3;       //切換到下一個通道
  133.         ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  134.         CLK_DIV = 0x20;
  135. }

  136. /* 初始化ADC */
  137. void InitADC()
  138. {
  139.   P1ASF = 0xFF;               //設置P1口為AD口
  140.         ADC_RES = 0;               
  141.         ADC_LOW2 = 0;               //清除結果寄存器
  142.         ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch;
  143.         CLK_DIV = 0x20;            //ADC_RES[1:0]存放高2位ADC結果,ADC_RESL[7:0]存放低8位ADC結果
  144.         Delay2ms();                         //ADC上電并延時
  145. }

  146. void Delay2ms()                //@11.0592MHz
  147. {
  148.         unsigned char i, j;

  149.         _nop_();
  150.         _nop_();
  151.         i = 22;
  152.         j = 128;
  153.         do
  154.         {
  155.                 while (--j);
  156.         } while (--i);
  157. }

  158. /* 配置并啟動T0,ms為T0定時時間 */
  159. void ConfigTimer0(unsigned int ms)
  160. {
  161.   unsigned long tmp;            //臨時變量
  162.        
  163.         tmp = 11059200 / 12;          //定時器計數頻率
  164.         tmp = (tmp * ms) / 1000;      //計算所需的計數值
  165.         tmp = 65536 - tmp;            //計算定時器重載值
  166.         tmp = tmp + 13;               //補償中斷響應延時造成的誤差
  167.         T0RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節
  168.         T0RL = (unsigned char)tmp;
  169.         TMOD &= 0xF0;                 //清零T0的控制位
  170.         TMOD |= 0x01;                 //配置T0為模式1
  171.         TH0 = T0RH;                   //加載T0重載值
  172.         TL0 = T0RL;
  173.         ET0 = 1;                      //使能T0中斷
  174.         TR0 = 1;                      //啟動T0
  175. }

  176. /* LED動態掃描函數,需在定時中斷中調用 */
  177. void LedScan()
  178. {
  179.   static unsigned char i = 0;       //動態掃描索引
  180.        
  181.         P0 = 0x00;                        //關閉所有段選位,顯示消隱
  182.         P2 = (P2 & 0xF0) | i;             //位選索引值賦值到P2口低3位
  183.         P0 = LedBuff[i];                  //緩沖區中索引位置的數據送到P0口
  184.         if (i < sizeof(LedBuff)-1)        //索引遞增循環,遍歷整個緩沖區
  185.                 i++;
  186.         else
  187.                 i = 0;
  188. }

  189. /* T0中斷服務函數,完成數碼管掃描 */
  190. void InterruptTimer0() interrupt 1
  191. {
  192.         static unsigned int cnt = 0;
  193.   TH0 = T0RH;             //重新加載重載值
  194.         TL0 = T0RL;            
  195.         LedScan();             //LED掃描顯示
  196.        
  197.         if (beep_flag)
  198.         {
  199.           BEEP = ~BEEP;          //反轉蜂鳴器控制電平
  200.                 cnt++;
  201.                 if (cnt > 5000) {     //中斷5000次后,即定時5ms
  202.                         cnt = 0;
  203.             beep_flag = 0;
  204.                 }
  205.         }
  206. }
復制代碼

所有資料51hei提供下載:
lesson5.zip (39.54 KB, 下載次數: 11)


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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99在线免费观看 | 欧美区日韩区 | 亚洲国产高清在线观看 | 国产视频1区 | 亚洲成av人片在线观看 | 国产成人福利视频在线观看 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 淫片一级国产 | 国产偷自视频区视频 | 97成人精品 | 自拍偷拍3p | 99久久影院 | 天堂男人av | 午夜在线视频 | 亚洲一区精品在线 | 精品一区视频 | 国产精品国产三级国产aⅴ原创 | 国产精品视频一区二区三区, | 国产精品视频免费看 | 国产日韩精品一区二区 | 精品免费国产一区二区三区四区 | 免费观看国产视频在线 | 久久精品高清视频 | 国产精品久久久久久久 | 一级做a毛片 | 久久国| 欧美一区二区在线观看 | av网站免费| 天天操天天插天天干 | 国产一区二区三区在线 | av在线一区二区三区 | 99久久精品免费看国产四区 | 欧美性生活免费 | 国产成人午夜电影网 | 亚洲一区免费在线 | 96国产精品久久久久aⅴ四区 | 国产精品99久久久久久久久久久久 | 亚洲视频在线观看免费 | 337p日韩| 91精品在线播放 | 亚洲一区二区三区四区五区午夜 |