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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

STC12C5A60S2片內ad程序數碼管顯示

[復制鏈接]
跳轉到指定樓層
樓主
ID:79544 發表于 2015-7-28 20:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
  1. /*(1)      
  2. P1_ADC_EN:特殊功能寄存器  
  3. P1.x作為A/D轉換輸入通道來用允許特殊功能寄存器。
  4. 相應位為“1”時,對應的P1.x口作為A/D轉換使用
  5. ,內部上拉電阻自動斷開。
  6. (2)ADC_CONTR:特殊功能寄存器            
  7. CHS2/CHS1/CHS0是模擬輸入通道選擇,

  8. CHS2/CHS1/CHS0的取值如下表所示

  9. CHS2  CHS1  CHS0  模擬輸入通道選擇
  10. 0                 0         0 選擇P1.0為A/D輸入
  11. 0                 0         1 選擇P1.1為A/D輸入
  12. 0                 1         0  選擇P1.2為A/D輸入
  13. 0                 1         1 選擇P1.3為A/D輸入
  14. 1                 0         0 選擇P1.4為A/D輸入
  15. 1                 0         1 選擇P1.5為A/D輸入
  16. 1                 1         0 選擇P1.6為A/D輸入
  17. 1                  1          1  選擇P1.7為A/D輸入

  18. ADC_START是模擬/數字轉換(ADC)啟動控制位,設置為1時,開始轉換。      
  19. ADC_FLAG是模擬/數字轉換結束標志位,當A/D轉換完成后,ADC_FLAG=1。
  20. (3)ADC_DATA:A/D轉換結果特殊功能寄存器

  21. 模擬/數字轉換結果計算公式為 結果=256×Vin/Vcc

  22. Vin是模擬輸入通道輸入電壓,Vcc為單片機實際工作電壓,
  23. 用單片機工作電壓作為模擬參考電壓 */


  24. //2、STC12C5A60S2內ADC采樣電壓值,
  25. //先采樣30次然后去掉上下10個再取平均值
  26. //STC12C5A60S2內ADC采樣
  27. #include <reg51.h>  
  28. #include<math.h>
  29. #define uchar unsigned char
  30. #define uint unsigned int
  31. #define segp P0 //數據端口
  32. #define scanp P2  //位端口
  33. sbit wei=P0^6;
  34. sbit duan=P0^7;
  35. sbit fmq =P1^7;
  36. uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,               
  37.                                 0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};     //不帶點共陽段驅動信號

  38. uchar code tab_d[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //帶點共陽段驅動

  39. uchar code scan[]={0xfe,0xfd,0xfb,0xf7};

  40.               //位掃描驅動信號
  41. uint display[4]={0,0,0,0}; //初始顯示數字
  42. uint con=0, _data=0,data2=0; //con顯示循環變量_data為ADC采樣值臨時變量data2顯示數據臨時變量
  43. //下面五行為ADC定義

  44. sfr P1ASF=0x9d;           
  45. sfr ADC_CONTR=0xbc;
  46. sfr ADC_RES=0xbd;
  47. sfr ADC_RESL=0xbe;
  48. sfr AUXR1=0xa2;

  49. /*sfr P1_ADC_EN=0x97;
  50. sfr ADC_CONTR=0xc5;
  51. sfr ADC_DATA=0xc6;*/

  52. void t0_t1_init();//t0顯示掃描定時器和t1串口比特率定時器初始化函數
  53. void adc_init();  //adc初始化函數
  54. void uart_out(uchar byte);  //串口發送字節函數
  55. uint average(uint buffer[30]); //采樣數據處理函數
  56. void AD();                //電壓采樣30次函數
  57. void delay1ms(uchar x);     //延時函數
  58. void beep()
  59. {
  60.         fmq=0;
  61.         delay1ms(100);
  62.         fmq=1;
  63.         delay1ms(100);
  64. }
  65. void main()
  66. {     
  67.         t0_t1_init();  
  68.         adc_init();  
  69.         while(1)  
  70.         {     
  71.                 AD();
  72.                 if(data2>4700|data2<4000)
  73.                 beep();        //報警         
  74.         }
  75. }
  76. /////////定時器初始化///////  
  77. void t0_t1_init()                        
  78. {
  79.         SCON=0x50;  
  80.         PCON=0;  
  81.         TMOD=0x21;  
  82.         TH1=TL1=0xe6;  
  83.         TH0=0xf0;  
  84.         TL0=0x60;  
  85.         EA=ET0=1;
  86.         // ES=1;  
  87.         TR1=1;  
  88.         TR0=1;
  89. }
  90. ////ADC初始化///////  
  91. void adc_init()                     
  92. {
  93.         P1ASF=0x01;//啟動P10為ADC模擬輸入口把內部上拉電阻斷開
  94.         P1ASF=0x02; //啟動P11為ADC模擬輸入口把內部上拉電阻斷開  
  95.         AUXR1&=0xfb; //adrj_0 高8位在ADC_RES     
  96.         ADC_RES=0;    //初值
  97.         //開啟ADC電源 并設置轉換周期為540個時鐘周期轉換一次。
  98.         //SPEED_1_1,chs000(選擇AD采樣通道p10)
  99.         //ADC_POWER=1; CHS2,1,0為0,用p1.0作為輸入。SPEED1,0  
  100.         ADC_CONTR=0x80;//用p1.0作為輸入
  101.         ADC_CONTR=0x81;//用p1.1作為輸入

  102.         delay1ms(2);
  103.         // IE|=0xa0;  
  104. }
  105. //////采集30次電壓值//////  
  106. void AD()                                
  107. {
  108.         char i;  uint temp_buf[30]={0};  
  109.         for(i=0;i<30;i++)  
  110.         {
  111.                 ADC_CONTR |=0x08; //開啟轉換   
  112.                 while((ADC_CONTR&0x10)==0);   
  113.                 ADC_CONTR &=0xe7;     //清除標志   
  114.                 temp_buf[i]=ADC_RES;   //取出數值到temp_buf      
  115.         }  
  116.         _data=average(temp_buf); //采樣30次后的數據代入處理函數處理后返回處理后的數值,給下面用串口發送出去  
  117.         uart_out(_data);  
  118. }
  119. ////先對整個數組的三十個值進行從小到大的排列,
  120. //////  ///再去掉最大5個和最少5個再求平均值;函數返回temp值///
  121. uint average(uint buffer[30])      
  122. {   
  123.         uchar i,j;  
  124.         uint temp;
  125.         for(i=1; i<30; i++)      
  126.         for(j=29; j>=i; --j)   
  127.         {   
  128.                  if(buffer[j-1] > buffer[j])   
  129.                 {      
  130.                         temp = buffer[j-1];     
  131.                         buffer[j-1] = buffer[j];     
  132.                         buffer[j] = temp;
  133.                 }   
  134.         }   
  135.         temp = 0;                                   
  136.         for(i=5; i<25; i++)  
  137.         {   
  138.                 temp += buffer[i];  
  139.         }      
  140.         temp = (uint)(((float)temp) / 20 + 0.5);  
  141.         return(temp);
  142. }
  143. ///顯示數據處理及掃描顯示中斷服務函數////
  144. void t0_4ms(void) interrupt 1      
  145. {   
  146.         data2=_data;  
  147.         data2=_data*19.53;  
  148.         display[0]=tab_d[data2/1000]; //用帶小數點的段碼
  149.         display[1]=tab[(data2/100)%10]; //用不帶小數點的段碼  
  150.         display[2]=tab[(data2/10)%10];  
  151.         display[3]=tab[data2%10];  
  152.         TH0=0xf0;  
  153.         TL0=0x60;
  154.         if(++con==5) con=1;
  155.         // segp=0xff;
  156.         wei=1;
  157.         P2=scan[con-1];
  158.         wei=0;
  159.         duan=1;
  160.         P2=display[con-1];
  161.         duan=0;
  162.         delay1ms(10) ;
  163.         P2=0xff;
  164. //        segp=display[con-1];  
  165. //        scanp=scan[con-1];
  166. }
  167. //串口發送節字函數////  
  168. void uart_out(uchar byte)              
  169. {
  170.         SBUF=byte;  
  171.         while(TI==0);  
  172.         TI=0;
  173. }
  174. ///1ms延時////  
  175. void delay1ms(uchar x)               
  176. {
  177. uchar i,j;
  178. for(i=0;i<x;i++)  
  179. for(j=0;j<250;j++);  
  180. }

復制代碼

評分

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

查看全部評分

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

使用道具 舉報

沙發
ID:86938 發表于 2015-8-6 16:30 | 只看該作者
188.///1ms延時////  
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 高清人人天天夜夜曰狠狠狠狠 | 亚洲人成网亚洲欧洲无码 | 欧美色成人 | 日韩欧美专区 | 狠狠的干狠狠的操 | 免费在线观看一区二区 | 久操伊人| 日本视频一区二区三区 | 午夜寂寞影院列表 | 两性午夜视频 | 懂色中文一区二区三区在线视频 | 一区二区在线不卡 | 国产高清一区二区三区 | 99re免费| 中文字幕av网 | 日本在线中文 | 亚洲成人av在线播放 | 国产日韩欧美中文 | 亚洲一区二区综合 | 日韩美香港a一级毛片免费 国产综合av | 久久中文字幕一区 | 桃花av在线 | 久久久久九九九女人毛片 | 成人免费在线观看视频 | 日韩国产在线观看 | 久久高清国产视频 | 九九热在线视频 | 日韩精品成人一区二区三区视频 | 日韩精品一区二区三区中文在线 | 韩国精品一区二区三区 | 久久久精 | 日本久久久一区二区三区 | 在线看一区二区 | 天天影视亚洲综合网 | 国产网站在线免费观看 | www.97国产 | 欧美成人猛片aaaaaaa | 丁香婷婷久久久综合精品国产 | 久久69精品久久久久久久电影好 | 国产成人精品久久二区二区 | 亚洲国产精品第一区二区 |