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

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

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 3774|回復(fù): 2
收起左側(cè)

為【數(shù)顯問(wèn)題】啥數(shù)碼管顯示跳動(dòng)厲害?這是顯示3路AD轉(zhuǎn)換輸出的程序

[復(fù)制鏈接]
ID:89646 發(fā)表于 2015-11-13 21:11 | 顯示全部樓層 |閱讀模式
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define PCF8591_ADDR         0x90
  4. #define DACOUT_EN                0x40

  5. typedef unsigned char uchar;
  6. typedef unsigned int uint;


  7. uchar code leddata[]={

  8.                 0x3F,  //"0"
  9.                 0x06,  //"1"
  10.                 0x5B,  //"2"
  11.                 0x4F,  //"3"
  12.                 0x66,  //"4"
  13.                 0x6D,  //"5"
  14.                 0x7D,  //"6"
  15.                 0x07,  //"7"
  16.                 0x7F,  //"8"
  17.                 0x6F,  //"9"
  18.                 0x77,  //"A"
  19.                 0x7C,  //"B"
  20.                 0x39,  //"C"
  21.                 0x5E,  //"D"
  22.                 0x79,  //"E"
  23.                 0x71,  //"F"
  24.                 0x76,  //"H"
  25.                 0x38,  //"L"
  26.                 0x37,  //"n"
  27.                 0x3E,  //"u"
  28.                 0x73,  //"P"
  29.                 0x5C,  //"o"
  30.                 0x40,  //"-"
  31.                 0x00,  //熄滅
  32.                 0x00  //自定義

  33.                          };


  34. /*位聲明*/
  35. sbit SCL = P2^1;
  36. sbit SDA = P2^0;
  37. sbit du = P2^6;
  38. sbit we = P2^7;
  39. sbit AD0_OK = P1^0;
  40. sbit AD1_OK = P1^1;
  41. sbit AD2_OK = P1^2;
  42. sbit AD3_OK = P1^3;
  43. /*延時(shí)5us*/
  44. void delay_5us()
  45. {
  46.         _nop_();
  47. }

  48. /*延時(shí)1ms*/
  49. void delay(uint z)
  50. {
  51.         uint x,y;
  52.         for(x = z; x > 0; x--)
  53.                 for(y = 114; y > 0 ; y--);
  54. }

  55. /**數(shù)碼顯示函數(shù)(為0的位不顯示)**/
  56. void display_567bit(uchar cc)
  57. {
  58.         uchar ge,shi,bai;

  59.         bai = cc / 100;
  60.         shi = (cc - bai*100) / 10;
  61.         ge = cc % 10 ;

  62.         if(cc > 99 && cc < 999)
  63.         {
  64.                 P0 = 0xff;
  65.                 we = 1;P0 = 0xdf;//1101 1111
  66.                 we = 0;
  67.                 du = 1;P0 = leddata[bai];
  68.                 du = 0;
  69.                 delay(1);
  70.        
  71.                 P0 = 0xff;//數(shù)碼管清零
  72.                 we = 1;P0 = 0xbf;
  73.                 we = 0;
  74.                 du = 1;P0 = leddata[shi];
  75.                 du = 0;
  76.                 delay(1);       
  77.        
  78.                 P0 = 0xff;
  79.                 we = 1;P0 = 0x7f;
  80.                 we = 0;
  81.                 du = 1;P0 = leddata[ge];
  82.                 du = 0;
  83.                 delay(1);               
  84.         }
  85.         else if(cc > 9 && cc < 99)
  86.         {
  87.                 P0 = 0xff;//數(shù)碼管清零
  88.                 we = 1;P0 = 0xbf;
  89.                 we = 0;
  90.                 du = 1;P0 = leddata[shi];
  91.                 du = 0;
  92.                 delay(1);       
  93.        
  94.                 P0 = 0xff;
  95.                 we = 1;P0 = 0x7f;
  96.                 we = 0;
  97.                 du = 1;P0 = leddata[ge] + 0x80;
  98.                 du = 0;
  99.                 delay(1);
  100.         }
  101.         else
  102.         {
  103.                 P0 = 0xff;
  104.                 we = 1;P0 = 0x7f;
  105.                 we = 0;
  106.                 du = 1;P0 = leddata[ge] + 0x80;
  107.                 du = 0;
  108.                 delay(1);
  109.         }
  110. }

  111. /**數(shù)碼顯示函數(shù)(為0的位不顯示)**/
  112. void display_34bit(uchar cc)
  113. {
  114.         uchar ge,shi,bai;

  115.         bai = cc / 100;
  116.         shi = (cc - bai*100) / 10;
  117.         ge = cc % 10 ;

  118.          if(cc > 9 && cc < 99)
  119.         {
  120.                 P0 = 0xff;//數(shù)碼管清零
  121.                 we = 1;P0 = 0xf7;//1111 0111
  122.                 we = 0;
  123.                 du = 1;P0 = leddata[shi];
  124.                 du = 0;
  125.                 delay(1);       
  126.        
  127.                 P0 = 0xff;
  128.                 we = 1;P0 = 0xef;//1110 1111
  129.                 we = 0;
  130.                 du = 1;P0 = leddata[ge] + 0x80;
  131.                 du = 0;
  132.                 delay(1);
  133.         }
  134.         else
  135.         {
  136.                 P0 = 0xff;
  137.                 we = 1;P0 = 0xef;//1110 1111
  138.                 we = 0;
  139.                 du = 1;P0 = leddata[ge] + 0x80;
  140.                 du = 0;
  141.                 delay(1);
  142.         }
  143. }

  144. /**數(shù)碼顯示函數(shù)(為0的位不顯示)**/
  145. void display_012bit(uchar cc)
  146. {
  147.         uchar ge,shi,bai;

  148.         bai = cc / 100;
  149.         shi = (cc - bai*100) / 10;
  150.         ge = cc % 10 ;

  151.         if(cc > 99 && cc < 999)
  152.         {
  153.                 P0 = 0xff;
  154.                 we = 1;P0 = 0xfe;//1111 1110
  155.                 we = 0;
  156.                 du = 1;P0 = leddata[bai];
  157.                 du = 0;
  158.                 delay(3);
  159.        
  160.                 P0 = 0xff;//數(shù)碼管清零
  161.                 we = 1;P0 = 0xfd;//1111 1101
  162.                 we = 0;
  163.                 du = 1;P0 = leddata[shi];
  164.                 du = 0;
  165.                 delay(3);
  166.        
  167.                 P0 = 0xff;
  168.                 we = 1;P0 = 0xfb;//1111 1011
  169.                 we = 0;
  170.                 du = 1;P0 = leddata[ge] + 0x80;
  171.                 du = 0;
  172.                 delay(1);               
  173.         }
  174.         else if(cc > 9 && cc < 99)
  175.         {
  176.                 P0 = 0xff;//數(shù)碼管清零
  177.                 we = 1;P0 = 0xfd;//1111 1101
  178.                 we = 0;
  179.                 du = 1;P0 = leddata[shi];
  180.                 du = 0;
  181.                 delay(3);
  182.        
  183.                 P0 = 0xff;
  184.                 we = 1;P0 = 0xfb;//1111 1011
  185.                 we = 0;
  186.                 du = 1;P0 = leddata[ge] + 0x80;
  187.                 du = 0;
  188.                 delay(3);
  189.         }
  190.         else
  191.         {
  192.                 P0 = 0xff;
  193.                 we = 1;P0 = 0xfb;//1111 1011
  194.                 we = 0;
  195.                 du = 1;P0 = leddata[ge] + 0x80;
  196.                 du = 0;
  197.                 delay(3);
  198.         }
  199. }

  200. /*I2C初始化*/
  201. void I2C_init()
  202. {
  203.         SCL = 1;
  204.         _nop_();
  205.         SDA = 1;
  206.         _nop_();
  207. }

  208. /*I2C起始信號(hào)*/
  209. void I2C_start()        //I2C起始信號(hào)
  210. {
  211.         SDA = 1;
  212.         _nop_();        //小延時(shí) 讓總線穩(wěn)定
  213.         SCL = 1;
  214.         delay_5us();
  215.         SDA = 0;
  216.         delay_5us();
  217. }

  218. /*I2C終止信號(hào)*/
  219. void I2C_stop()                //I2C終止信號(hào)
  220. {
  221.         SDA = 0;
  222.         _nop_();        //小延時(shí) 讓總線穩(wěn)定
  223.         SCL = 1;
  224.         delay_5us();
  225.         SDA = 1;
  226.         delay_5us();
  227. }

  228. /*主機(jī)發(fā)送應(yīng)答*/
  229. void master_answer(bit i)                //主機(jī)發(fā)送應(yīng)答信號(hào),以回復(fù)從機(jī)是否應(yīng)答
  230. {
  231.          SCL = 0;        //拉低時(shí)鐘總線SLC,允許數(shù)據(jù)總線SDA上的數(shù)據(jù)變化
  232.          _nop_();        //穩(wěn)定總線
  233.          if(i)
  234.          {
  235.                  SDA = 0;//發(fā)送應(yīng)答
  236.          }
  237.          else
  238.          {
  239.                  SDA =1;//發(fā)送非應(yīng)答
  240.          }
  241.          _nop_();
  242.          SCL = 1;        //拉高時(shí)鐘總線,以讓從機(jī)讀走主機(jī)的應(yīng)答信號(hào)
  243.          delay_5us();        //按照I2C時(shí)序,必須延時(shí)4us
  244.          //此時(shí)從機(jī)已經(jīng)讀完應(yīng)答信號(hào)
  245.          SCL = 0;        //時(shí)鐘拉低,占用總線繼續(xù)通信,
  246.          _nop_();
  247.          SDA = 1;        //數(shù)據(jù)總線拉高,釋放數(shù)據(jù)總線,交由從機(jī)控制
  248.          _nop_();
  249. }

  250. /*測(cè)試從機(jī)應(yīng)答*/
  251. bit test_answer()        //測(cè)試從機(jī)的應(yīng)答
  252. {
  253.         SCL = 1;        //只有時(shí)鐘總線為1 ,才能接受應(yīng)答信號(hào)
  254.         delay_5us();//I2C時(shí)序要求,必須延時(shí)4us
  255.         if(SDA)
  256.         {
  257.                 SCL = 0;        //拉低,以讓SDA可變
  258.                 _nop_();
  259.                 I2C_stop();
  260.                 return(0);         //返回非應(yīng)答
  261.         }
  262.         else
  263.         {
  264.                 SCL = 0;        //拉低,以讓SDA可變
  265.                 _nop_();
  266.                 return(1);         //返回非應(yīng)答
  267.         }
  268.          SCL = 0;        //時(shí)鐘拉低,占用總線繼續(xù)通信,
  269.          _nop_();
  270.          SDA = 1;        //數(shù)據(jù)總線拉高,釋放數(shù)據(jù)總線,交由從機(jī)控制
  271.          _nop_();
  272. }

  273. /*發(fā)送一個(gè)字節(jié)*/
  274. void I2C_send_byte(uchar byte)
  275. {
  276.         uchar i;
  277.         for(i = 0; i < 8 ;i++)
  278.         {
  279.                 SCL = 0;
  280.                 _nop_();
  281.                 if(byte & 0x80)                //1000 0000
  282.                 {
  283.                         SDA = 1;
  284.                         _nop_();
  285.                 }
  286.                 else
  287.                 {
  288.                         SDA = 0;
  289.                         _nop_();
  290.                 }
  291.                 SCL = 1;
  292.                 _nop_();
  293.                 byte <<= 1;                 //byte = byte << 1;
  294.          }
  295.          SCL = 0;        //時(shí)鐘拉低,占用總線繼續(xù)通信
  296.          _nop_();
  297.          SDA = 1;        //數(shù)據(jù)總線拉高,釋放數(shù)據(jù)總線
  298.          _nop_();
  299. }

  300. /*讀一個(gè)字節(jié)*/
  301. uchar I2C_read_byte()
  302. {
  303.         uchar i,dat;
  304.         SCL = 0;
  305.         _nop_();
  306.         SDA = 1;
  307.         _nop_();

  308.         for(i = 0; i < 8 ;i++)
  309.         {
  310.                 SCL = 1;        //SCL置高以使SDA保持,才可以讀數(shù)據(jù)
  311.                 _nop_();
  312.                 if(SDA)
  313.                 {
  314.                         dat = dat | 0x01;
  315.                 }
  316.                 else
  317.                 {
  318.                         dat = dat & 0xfe;
  319.                 }

  320.                 _nop_();
  321.                 SCL = 0;
  322.                 _nop_();

  323.                 if(i < 7)
  324.                 {
  325.                         dat = dat << 1;
  326.                 }
  327.          }
  328.          return (dat);
  329.          SCL = 0;        //時(shí)鐘拉低,占用總線繼續(xù)通信
  330.          _nop_();
  331.          SDA = 1;        //數(shù)據(jù)總線拉高,釋放數(shù)據(jù)總線
  332.          _nop_();
  333. }

  334. /*DAC發(fā)送數(shù)據(jù)*/
  335. bit DAC_OUT(uchar dat)
  336. {
  337.         bit ACK_flag;
  338.         I2C_start();
  339.         I2C_send_byte(PCF8591_ADDR + 0);
  340.         if(test_answer() == 0)
  341.         {
  342.                 ACK_flag = 1;
  343.         }       
  344.         I2C_send_byte(DACOUT_EN);        //DA輸出使能
  345.         if(test_answer() == 0)
  346.         {
  347.                 ACK_flag = 1;       
  348.         }
  349.         I2C_send_byte(dat);
  350.         if(test_answer() == 0)
  351.         {
  352.                 ACK_flag = 1;       
  353.         }
  354.         I2C_stop();
  355.         delay(5);
  356.         if(ACK_flag == 1)
  357.         {
  358.                 return 0;
  359.         }
  360.         else
  361.                 return 1;
  362. }

  363. /*讀AD數(shù)據(jù)*/
  364. uchar ADC_Read(uchar CON)
  365. {
  366.         uchar DAC_Value;

  367.         bit ACK_flag;
  368.         I2C_start();
  369.         I2C_send_byte(PCF8591_ADDR + 0);
  370.         if(test_answer() == 0)
  371.         {
  372.                 ACK_flag = 1;       
  373.         }
  374.         I2C_send_byte(CON);
  375.         if(test_answer() == 0)
  376.         {
  377.                 ACK_flag = 1;                          
  378.         }
  379.         master_answer(0);
  380.         I2C_start();
  381.         I2C_send_byte(PCF8591_ADDR + 1);
  382.         if(test_answer() == 0)
  383.         {
  384.                 ACK_flag = 1;       
  385.         }
  386.         DAC_Value = I2C_read_byte();        //將讀出的數(shù)據(jù)賦給 全局變量 DAC_Value
  387.         master_answer(0);  
  388.         I2C_stop();
  389.     delay(2);
  390.         if(ACK_flag == 1)
  391.         {
  392.                 return 0;
  393.         }
  394.         else
  395.         return DAC_Value;
  396. }

  397. void main()
  398. {
  399.         I2C_init();
  400.         while(1)
  401.         {
  402.                 if( DAC_OUT(ADC_Read(0x00)) )                        AD0_OK = 0;                else                AD0_OK = 1;
  403.                 display_012bit(ADC_Read(0x00));
  404.                   
  405.                 if( DAC_OUT(ADC_Read(0x01)) )                        AD1_OK = 0;                else                AD1_OK = 1;
  406.                 display_34bit(ADC_Read(0x01));
  407.                   
  408.                 if( DAC_OUT(ADC_Read(0x02)) )                        AD2_OK = 0;                else                AD2_OK = 1;
  409.                 display_567bit(ADC_Read(0x02));
  410.                                                                             
  411.                 if( DAC_OUT(ADC_Read(0x03)) )                        AD3_OK = 0;                else                AD3_OK = 1;
  412.         }
  413. }
復(fù)制代碼


回復(fù)

使用道具 舉報(bào)

ID:96682 發(fā)表于 2015-11-24 01:21 | 顯示全部樓層
這程序不符合人眼反應(yīng)速度得修改
回復(fù)

使用道具 舉報(bào)

ID:97163 發(fā)表于 2015-11-25 22:54 | 顯示全部樓層
顯示頻率太慢,減少ad采集次數(shù)
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 在线免费观看视频你懂的 | 中文字幕国产 | 日韩av在线一区二区三区 | 日本在线综合 | 国产成人精品一区二区三区在线 | 成人精品久久 | 国产黄色小视频 | 看毛片网站| 日韩精品一区二区三区 | 中文字幕乱码一区二区三区 | 欧美性猛交一区二区三区精品 | 一区| 在线观看亚洲精品视频 | 人人澡人人射 | 久久久久久免费观看 | 国产精品久久久久久久粉嫩 | 精品二| 国产精品久久久久久久7电影 | 羞羞色在线观看 | 中文天堂网 | 久久99精品国产 | 久久久久久国产精品 | 亚洲三级av| 日本aa毛片a级毛片免费观看 | 国产精品成人一区二区 | 国产精品久久久久久久久久久久 | 亚洲自拍偷拍视频 | 懂色av一区二区三区在线播放 | 精品视频一区二区三区在线观看 | 日韩精品成人一区二区三区视频 | 免费人成在线观看网站 | 超碰网址 | 亚洲狠狠 | 亚洲码欧美码一区二区三区 | 黄色亚洲网站 | 亚洲一区中文字幕在线观看 | 欧美色综合| 日本午夜精品一区二区三区 | 成人在线免费观看 | 亚洲精品456| 国产成人综合在线 |