1. gzyueqian
      13352868059
      首頁 > 新聞中心 > > 正文

      AT89C2051實現A/D轉換的C51程序

      更新時間: 2006-03-03 11:32:10來源: 粵嵌教育瀏覽量:2916

      /* io分配: *
      ;* OUTPUT: *
      ;* P1.0 ...... 模擬量輸入 *
      ;* P1.1 ...... DA輸入比較基準電壓 *
      ;* P1.2~7..... R-2R DA電阻網絡 *
      ;* P3.7 ...... LED 模擬亮度輸出 *
      ;* CPU CLOCK EQU 6M */
      //xiaoqi last edit in 2001.11
      //#pragma src
      #include "AT89x051.h"
      #include <stdlib.h>
      #include<math.h>
      #include<intrins.h>

      //變量類型標識的宏定義,大家都喜歡這么做
      #define Uchar unsigned char
      #define Uint unsigned int

      #define Ledlight() (P3 &= 0x7f)
      #define Leddark() (P3 |= 0x80)

      sbit P36 = P3^6; // 比較器內部判斷腳
      sbit LED = P3^7; // 一個發(fā)光二級管觀察亮度變化

      // 內部標志位定義
      bit less; // 比較是否大于 1.小于,0.大于

      // 全局變量定義
      Uchar timer1, // 通用延時計數器
      timer2, // 按鍵蜂鳴器反應定時器
      adcdata, // ad轉換變量
      pwm1; // PWM輸出比例

      // 函數列表
      void DelayMs(unsigned int number); // 毫秒延時
      void timers0(); // 在定時器中斷中做數碼管的掃描顯示(ct0)
      void Initall(void); // 系統(tǒng)初始化
      void timers1(void); // TC1定時器中斷用于掃描顯示與鍵盤
      Uchar adcread(void); // adc轉換程序

      void main(void) using 0
      {
      DelayMs(120);
      Initall();
      pwm1 = adcread();
      LED=1;
      while(1)
      {
      pwm1 = adcread();
      timer2=10;
      while (timer2);
      }
      }

      // 毫秒延時
      void DelayMs(unsigned int number)
      {
      unsigned char temp;

      for(;number!=0;number--)
      for(temp=112;temp!=0;temp--);
      }

      /*************************************
      在定時器中斷中做LED的PWM輸出
      *************************************/
      void timers0() interrupt 1 using 1
      {
      TH0 = 0xff;
      TL0 = 0xd0;
      timer1--;
      if (timer1==pwm1)LED=0;
      if (timer1==0){
      LED=1;
      timer1=0x40;
      timer2--;
      };
      }

      /****************
      ;* 6位 ADC轉換
      ;****************/
      Uchar adcread(void)
      {
      Uchar i=0x3f,temp=0;
      P36 =1;
      P1 = 3; _nop_();_nop_(); // 從零開始
      while ((i--)&& (P36))
      {
      temp += 4;
      P1 = temp|3;
      _nop_();
      }
      temp >>= 2;
      return temp;
      }

      /****************
      ;* 系統(tǒng)初始化
      ;****************/
      void Initall(void)
      {
      TMOD = 0x11; // 0001 0001 16進制計數器
      IP = 0x8; // 0000 1000 t1優(yōu)先
      IE = 0x8A; // 1000 1010 t0,t1中斷允許
      TCON = 5; // 0000 0101 外部中斷低電平觸發(fā)
      TR0 = 1; // 打開定時器中斷,IE中已經打開,在明示一下
      TR1 = 0;
      ET0 = 1;
      ET1 = 0;
      P1 = 0xff;
      }

      /*************************************
      TC1定時器中斷用于掃描顯示與鍵盤(ct1)
      *************************************/
      void timers1(void) interrupt 3 using 2
      {
      _nop_(); //實驗中沒有啟用
      }

      免費預約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 一区二区三区日韩精品 | 中文字幕在线永久在线在线 | 亚洲一区二区三区偷拍女厕 | 亚洲一区二区日韩 | 亚洲欧美一区二区三区 | 亚洲欧美日韩中文字幕乱码 |