標(biāo)題: AD0832設(shè)計(jì)的電壓表32X16點(diǎn)陣顯示程序+仿真 [打印本頁(yè)]

作者: 13118302007    時(shí)間: 2017-4-30 12:48
標(biāo)題: AD0832設(shè)計(jì)的電壓表32X16點(diǎn)陣顯示程序+仿真
AD0832設(shè)計(jì)的電壓表仿真圖:


32X16點(diǎn)陣顯示
單片機(jī)源程序:
  1. #include <intrins.h>
  2. #include <reg52.h>
  3. #include <stdio.h>
  4. #define ulong unsigned long
  5. #define uint unsigned int
  6. #define uchar unsigned char
  7. uchar k,i,j;
  8. float l;
  9. sbit sw=P3^0;      //159選通開(kāi)關(guān)
  10. sbit ADCS =P3^1;  //ADC0832 chip seclect
  11. sbit ADDI =P3^3;  //ADC0832 k in
  12. sbit ADDO =P3^3;  //ADC0832 k out
  13. sbit ADCLK =P3^2;  //ADC0832 clock signal
  14. uchar dsw[20];  //存放sprintf轉(zhuǎn)換字符
  15. uchar idata value[149]; //點(diǎn)陣字符儲(chǔ)存
  16. uchar code table[]={    //字符查表
  17. 0x00,0x00,0x00,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*".",0*/
  18. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
  19. 0x00,0x00,0xE0,0x0F,0x10,0x10,0x08,0x20,0x08,0x20,0x10,0x10,0xE0,0x0F,0x00,0x00,/*"0",1*/
  20. 0x00,0x00,0x10,0x20,0x10,0x20,0xF8,0x3F,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,/*"1",2*/
  21. 0x00,0x00,0x70,0x30,0x08,0x28,0x08,0x24,0x08,0x22,0x88,0x21,0x70,0x30,0x00,0x00,/*"2",3*/
  22. 0x00,0x00,0x30,0x18,0x08,0x20,0x88,0x20,0x88,0x20,0x48,0x11,0x30,0x0E,0x00,0x00,/*"3",4*/
  23. 0x00,0x00,0x00,0x07,0xC0,0x04,0x20,0x24,0x10,0x24,0xF8,0x3F,0x00,0x24,0x00,0x00,/*"4",5*/
  24. 0x00,0x00,0xF8,0x19,0x08,0x21,0x88,0x20,0x88,0x20,0x08,0x11,0x08,0x0E,0x00,0x00,/*"5",6*/
  25. 0x00,0x00,0xE0,0x0F,0x10,0x11,0x88,0x20,0x88,0x20,0x18,0x11,0x00,0x0E,0x00,0x00,/*"6",7*/
  26. 0x00,0x00,0x38,0x00,0x08,0x00,0x08,0x3F,0xC8,0x00,0x38,0x00,0x08,0x00,0x00,0x00,/*"7",8*/
  27. 0x00,0x00,0x70,0x1C,0x88,0x22,0x08,0x21,0x08,0x21,0x88,0x22,0x70,0x1C,0x00,0x00,/*"8",9*/
  28. 0x00,0x00,0xE0,0x00,0x10,0x31,0x08,0x22,0x08,0x22,0x10,0x11,0xE0,0x0F,0x00,0x00,/*"9",10*/
  29. 0x08,0x00,0x78,0x00,0x88,0x07,0x00,0x38,0x00,0x0E,0xC8,0x01,0x38,0x00,0x08,0x00,/*"V",11*/
  30. };

  31. void delay(int c)     //延時(shí),C不能小于5
  32.     {
  33.     int i,j;
  34.     for(i=0;i<c;i++)
  35.         for(j=0;j<10;j++)
  36.             ;
  37.      }
  38. /************
  39. 讀ADC0832函數(shù)
  40. ************/
  41. //采集并返回
  42. unsigned int Adc0832(unsigned char channel)     //AD轉(zhuǎn)換,返回結(jié)果
  43. {
  44.     uchar i=0;
  45.     uchar j;
  46.     uint dat=0;
  47.     uchar ndat=0;
  48.     if(channel==0)channel=2;
  49.     if(channel==1)channel=3;
  50.     ADDI=1;
  51.     _nop_();
  52.     _nop_();
  53.     ADCS=0;//拉低CS端
  54.     _nop_();
  55.     _nop_();
  56.     ADCLK=1;//拉高CLK端
  57.     ADDI=channel&0x1;
  58.     _nop_();
  59.     _nop_();
  60.     ADCLK=0;//拉低CLK端,形成下降沿2
  61.     _nop_();
  62.     _nop_();
  63.     ADDI=(channel>>1)&0x1;
  64.     _nop_();
  65.     _nop_();
  66.     ADCLK=0;//拉低CLK端,形成下降沿3
  67.     ADDI=1;//控制命令結(jié)束
  68.     _nop_();
  69.     _nop_();
  70.     dat=0;
  71.     for(i=0;i<8;i++)
  72.     {
  73.         dat|=ADDO;//收數(shù)據(jù)
  74.         ADCLK=1;
  75.         _nop_();
  76.         _nop_();
  77.         dat<<=1;
  78.         if(i==7)dat|=ADDO;
  79.     }  
  80.     for(i=0;i<8;i++)
  81.     {
  82.         j=0;
  83.         j=j|ADDO;//收數(shù)據(jù)
  84.         ADCLK=1;
  85.         _nop_();
  86.         _nop_();
  87.         ADCLK=0;//形成一次時(shí)鐘脈沖
  88.         _nop_();
  89.         _nop_();
  90.         j=j<<7;
  91.         ndat=ndat|j;
  92.         if(i<7)ndat>>=1;
  93.     }
  94.     ADCS=1;//拉低CS端
  95.     ADCLK=0;//拉低CLK端
  96.     ADDO=1;//拉高數(shù)據(jù)端,回到初始狀態(tài)
  97.     dat<<=8;
  98.     dat|=ndat;
  99.     return(dat);            //return ad k
  100. }
  101. /*************************************************
  102.             點(diǎn)陣字符采集函數(shù)
  103. **************************************************/
  104. void tra(uchar *p)    //數(shù)組dsp[]里面的字符查詢后,再儲(chǔ)儲(chǔ)存到另一個(gè)顯示數(shù)組value[]
  105. { for(i=0;i<5;i++)
  106.   {
  107.       if(i<4)        //i=2時(shí)查的是句號(hào),其他3個(gè)是電壓值
  108.       {
  109.         for(j=0;j<16;j++)
  110.         {
  111.           value[(i+1)*16+j]=table[(*p-0x2e)*16+j];
  112.         }
  113.        }
  114.       else
  115.       {  for(j=0;j<16;j++)      //電壓符號(hào)V
  116.           value[(i+1)*16+j]=table[12*16+j];
  117.       }
  118.       
  119.       p++;
  120.   }
  121.   for(i=0;i<16;i++)           //前16個(gè)和后21個(gè)消隱作用,不顯示
  122.   for(i=128;i<149;i++)
  123.   value[i]=0;
  124. }

  125. void main()
  126.     {
  127.     unsigned int b=0,i,j;
  128.     unsigned char a;

  129.     while(1)
  130.     {

  131.     l=k/255.0*5.0;
  132.     sprintf(dsw,"%2.3f",l);  //電壓值轉(zhuǎn)換成字符方式儲(chǔ)存,不明白的人上百度查一下sprintf函數(shù)的運(yùn)用就清楚的,俺也是查的
  133.     tra(dsw);
  134.     j=0;
  135.     if(a>2) //移動(dòng)間隔時(shí)間;越大移動(dòng)越慢
  136.         {
  137.         a=0;
  138.         b+=2;
  139.         if(b>=85)  //顯示到最后一個(gè)字,回頭顯示
  140.             {
  141.             b=0;
  142.             }   
  143.         }
  144.      sw=1;   //顯示字符,順序是從左掃到右,有16列,數(shù)據(jù)電平是從左1到左16,由低到高
  145.      for(i=0;i<16;i++)  //sw是154選通開(kāi)關(guān)。
  146.         {
  147.         P1=i;
  148.         P0=value[j+b];
  149.         P2=value[j+b+1];
  150.         delay(5);
  151.         P0=0x00;
  152.         P2=0x00;
  153.         j+=2;
  154.         }
  155.      sw=0;


  156. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

仿真工程文件和源碼下載:
AD0832設(shè)計(jì)的電壓表32X16點(diǎn)陣顯示.zip (78.84 KB, 下載次數(shù): 23)







歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1