找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

帖子
查看: 3643|回復(fù): 0
收起左側(cè)

51單片機(jī)ADC0808采集 數(shù)碼管顯示

[復(fù)制鏈接]
ID:888341 發(fā)表于 2021-3-4 15:06 | 顯示全部樓層 |閱讀模式
51hei圖片20210304150216.png
程序和仿真工程請(qǐng)?jiān)诟郊邢螺d

單片機(jī)源程序如下:
  1. #include<reg52.h>         
  2. #include<intrins.h>
  3. #define ulong unsigned long
  4. #define uint unsigned int
  5. #define uchar unsigned char

  6. //定義ADC的控制接口
  7. #define                ADC_DATA                P1               
  8. sbit                  ADC_EOC                 = P3^2;              
  9. sbit                  ADC_CLK                 = P3^1;               
  10. sbit                  ADC_START                 = P3^0;            
  11. sbit                  ADC_OE                         = P3^3;  
  12. sbit                  ADC_A                         = P3^4;  
  13. sbit                  ADC_B                         = P3^5;   
  14. sbit                  ADC_C                         = P3^6;

  15. //定義數(shù)碼管接口
  16. #define                SEG_DATA                P0
  17. sbit seg_1=P2^0;
  18. sbit seg_2=P2^1;
  19. sbit seg_3=P2^2;
  20. sbit seg_4=P2^3;


  21. uchar code SEG_Table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xf7};//CA共陽
  22. uchar dis_data_buf[4]={0,0,0,0};

  23. //============================
  24. //ADC獲取函數(shù)
  25. //============================
  26. uchar ADC_GET(uchar temp_channel)
  27. {
  28.         if(temp_channel==0)
  29.         {
  30.            ADC_A=0;
  31.            ADC_B=0;
  32.            ADC_C=0;
  33.         }
  34.         else if(temp_channel==1)
  35.         {
  36.            ADC_A=1;
  37.            ADC_B=0;
  38.            ADC_C=0;
  39.         }
  40.         else if(temp_channel==2)
  41.         {
  42.            ADC_A=0;
  43.            ADC_B=1;
  44.            ADC_C=0;
  45.         }
  46.         else if(temp_channel==3)
  47.         {
  48.            ADC_A=1;
  49.            ADC_B=1;
  50.            ADC_C=0;
  51.         }
  52.         else if(temp_channel==4)
  53.         {
  54.            ADC_A=0;
  55.            ADC_B=0;
  56.            ADC_C=1;
  57.         }
  58.         else if(temp_channel==5)
  59.         {
  60.            ADC_A=1;
  61.            ADC_B=0;
  62.            ADC_C=1;
  63.         }
  64.         else if(temp_channel==6)
  65.         {
  66.            ADC_A=0;
  67.            ADC_B=1;
  68.            ADC_C=1;
  69.         }
  70.         else if(temp_channel==7)
  71.         {
  72.            ADC_A=1;
  73.            ADC_B=1;
  74.            ADC_C=1;
  75.         }

  76.         ADC_START = 0;
  77.         ADC_OE = 0;
  78.         ADC_START = 1;
  79.         ADC_START = 0;
  80.         while(ADC_EOC == 0);
  81.         ADC_OE = 1;
  82.         return ADC_DATA;
  83. }

  84. void Delay_1ms(uint i)//1ms延時(shí)
  85. {
  86.   uchar x,j;
  87.   for(j=0;j<i;j++)
  88.     for(x=0;x<=148;x++);       
  89. }


  90. //數(shù)碼管的顯示函數(shù)
  91. void diplay(uchar *dis_p)
  92. {
  93.   static uchar temp_num=0;
  94.   //消隱       
  95.   seg_1=0;seg_2=0;seg_3=0;seg_4=0;
  96.   switch(temp_num) //動(dòng)態(tài)掃描數(shù)碼管
  97.   {
  98.   case 0:
  99.                  SEG_DATA=SEG_Table[*(dis_p+temp_num)]&0x7f;//傳遞數(shù)碼管斷碼到數(shù)據(jù)段
  100.                 seg_1=1;seg_2=0;seg_3=0;seg_4=0;
  101.                
  102.   break;
  103.   case 1:
  104.            SEG_DATA=SEG_Table[*(dis_p+temp_num)];//傳遞數(shù)碼管斷碼到數(shù)據(jù)段
  105.            seg_1=0;seg_2=1;seg_3=0;seg_4=0;
  106.                
  107.   break;
  108.   case 2:
  109.                 SEG_DATA=SEG_Table[*(dis_p+temp_num)];//傳遞數(shù)碼管斷碼到數(shù)據(jù)段
  110.                 seg_1=0;seg_2=0;seg_3=1;seg_4=0;
  111.                
  112.   break;
  113.   case 3:
  114.                 SEG_DATA=SEG_Table[*(dis_p+temp_num)];//傳遞數(shù)碼管斷碼到數(shù)據(jù)段
  115.                 seg_1=0;seg_2=0;seg_3=0;seg_4=1;
  116.                
  117.   break;
  118.   }
  119.   Delay_1ms(2);

  120.   temp_num++;
  121.   if(temp_num>3) temp_num=0;

  122. }
  123. //************************************
  124. //定時(shí)器初始化
  125. //************************************
  126. void Time0_init()
  127. {
  128.         TMOD |= 0x02;                         //使用模式2,8位定時(shí)器
  129.         TH0=256-50;//  50US
  130.           TL0=256-50;//
  131.         EA    = 1;  //總中斷
  132.         ET0   = 1;//定時(shí)器0初始化
  133.         TR0   = 1;

  134. }

  135. //轉(zhuǎn)換采集的數(shù)據(jù)進(jìn)行顯示
  136. void Trans_data(uchar temp_channel)
  137. {
  138.         ulong temp_data=0;
  139.         temp_data=ADC_GET(temp_channel);
  140.         temp_data=temp_data*5000/255;        //把AD數(shù)值換算成電壓并放大1000倍,避免小數(shù)運(yùn)算
  141.         //解析數(shù)據(jù)到數(shù)碼管
  142.         dis_data_buf[3]=temp_data%10;
  143.         dis_data_buf[2]=temp_data%100/10;
  144.         dis_data_buf[1]=temp_data%1000/100;;         //數(shù)組的最后一個(gè)是下劃線編碼
  145.         dis_data_buf[0]=temp_data/1000;
  146. }
  147. /********************************************************************
  148. * 名稱 : Main()                       
  149. * 功能 : 主函數(shù)                       
  150. * 輸入 : 無               
  151. * 輸出 : 無               
  152. ***********************************************************************/
  153. void Main(void)
  154. {

  155.   Time0_init();                                        //初始化定時(shí)器
  156.   while(1)
  157.   {                 
  158.         Trans_data(0);                        //采集指定通道的數(shù)據(jù)       
  159.     diplay(dis_data_buf);        //刷新顯示       
  160.   }
  161. }

  162. //===========================
  163. //定時(shí)器0中斷,為ADC提供時(shí)鐘信號(hào)
  164. //===========================
  165. void timer0() interrupt 1
  166. {
  167.         ADC_CLK = ~ADC_CLK;
  168. }
復(fù)制代碼

所有資料51hei提供下載:
ADC809.zip (236.54 KB, 下載次數(shù): 70)




回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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