8051学习笔记——AD

AD.C

  1 #include<reg52.h>
  2 #include <iic.h>
  3
  4 #define  PCF8591 0x90    //PCF8591 地址
  5
  6 sbit    LS138A=P2^2;
  7 sbit    LS138B=P2^3;
  8 sbit    LS138C=P2^4;
  9
 10 //此表为 LED 的字模, 共阴数码管 0-9  -
 11 unsigned char code Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
 12
 13 unsigned char AD_CHANNEL;
 14 unsigned long xdata  LedOut[8];
 15 unsigned int  D[32];
 16
 17 bit DACconversion(unsigned char sla,unsigned char c,  unsigned char Val)
 18 {
 19     Start_I2c();              //启动总线
 20     SendByte(sla);            //发送器件地址
 21     if(ack==0)    return(0);
 22     SendByte(c);              //发送控制字节
 23     if(ack==0)    return(0);
 24     SendByte(Val);            //发送DAC的数值
 25     if(ack==0)    return(0);
 26     Stop_I2c();               //结束总线
 27     return(1);
 28 }
 29
 30 /*******************************************************************
 31 ADC发送字节[命令]数据函数
 32 *******************************************************************/
 33 bit ISendByte(unsigned char sla,unsigned char c)
 34 {
 35     Start_I2c();              //启动总线
 36     SendByte(sla);            //发送器件地址
 37     if(ack==0)    return(0);
 38     SendByte(c);              //发送数据
 39     if(ack==0)    return(0);
 40     Stop_I2c();               //结束总线
 41     return(1);
 42 }
 43
 44 /*******************************************************************
 45 ADC读字节数据函数
 46 *******************************************************************/
 47 unsigned char IRcvByte(unsigned char sla)
 48 {
 49     unsigned char c;
 50
 51        Start_I2c();          //启动总线
 52        SendByte(sla+1);      //发送器件地址
 53        if(ack==0)    return(0);
 54        c=RcvByte();          //读取数据0
 55
 56        Ack_I2c(1);           //发送非就答位
 57        Stop_I2c();           //结束总线
 58        return(c);
 59 }
 60
 61 void main()
 62 {
 63     char i,j;
 64     while(1)
 65      {/********以下AD-DA处理*************/
 66            switch(AD_CHANNEL)
 67            {
 68              case 0: ISendByte(PCF8591,0x41);
 69                      D[0]=IRcvByte(PCF8591);  //ADC0 模数转换1  放大2倍显示
 70                      break;
 71
 72              case 1: ISendByte(PCF8591,0x42);
 73                      D[1]=IRcvByte(PCF8591);  //ADC1  模数转换2
 74                      break;
 75
 76              case 2: ISendByte(PCF8591,0x43);
 77                      D[2]=IRcvByte(PCF8591);  //ADC2    模数转换3
 78                     break;
 79
 80              case 3: ISendByte(PCF8591,0x40);
 81                      D[3]=IRcvByte(PCF8591);  //ADC3   模数转换4
 82                      break;
 83
 84              case 4: DACconversion(PCF8591,0x40, D[4]); //DAC      数模转换
 85                      break;
 86            }
 87
 88         D[4]=400;  //数字--->>模拟输出
 89         D[4]=D[0];  //   把模拟输入 采样的信号 通过数模转换输出
 90            if(++AD_CHANNEL>4)    AD_CHANNEL=0;
 91
 92  /********以下将AD的值送到LED数码管显示*************/
 93
 94          LedOut[0]=Disp_Tab[D[1]%10000/1000];
 95          LedOut[1]=Disp_Tab[D[1]%1000/100]|0x80;
 96          LedOut[2]=Disp_Tab[D[1]%100/10];
 97          LedOut[3]=Disp_Tab[D[1]%10];
 98
 99          LedOut[4]=Disp_Tab[D[0]%10000/1000];
100          LedOut[5]=Disp_Tab[D[0]%1000/100]|0x80;
101          LedOut[6]=Disp_Tab[D[0]%100/10];
102          LedOut[7]=Disp_Tab[D[0]%10];
103
104
105          for( i=0; i<8; i++)
106          {
107              P0 = LedOut[i];
108               switch(i)      //使用switch 语句控制138译码器  也可以是用查表的方式 学员可以试着自己修改
109             {
110                 case 0:LS138A=0; LS138B=0; LS138C=0; break;
111                 case 1:LS138A=1; LS138B=0; LS138C=0; break;
112                 case 2:LS138A=0; LS138B=1; LS138C=0; break;
113                 case 3:LS138A=1; LS138B=1; LS138C=0; break;
114                 case 4:LS138A=0; LS138B=0; LS138C=1; break;
115                 case 5:LS138A=1; LS138B=0; LS138C=1; break;
116                 case 6:LS138A=0; LS138B=1; LS138C=1; break;
117                 case 7:LS138A=1; LS138B=1; LS138C=1; break;
118             }
119             for (j = 0 ; j<90 ;j++) { ;}       //扫描间隔时间
120           }
121     }
122 }

IIC.h

 1 #include<reg52.h>
 2 #include <intrins.h>
 3
 4 #define  _Nop()  _nop_()   /*定义空指令*/
 5 sbit     SCL = P2^1;       //I2C  时钟
 6 sbit     SDA = P2^0;       //I2C  数据
 7 bit ack;                 /*应答标志位*/
 8
 9 void Start_I2c()
10 {
11     SDA = 1;         /*发送起始条件的数据信号*/
12       _Nop();
13       SCL = 1;         /*起始条件建立时间大于4.7us,延时*/
14       _Nop();_Nop();_Nop();_Nop();_Nop();
15       SDA = 0;         /*发送起始信号,起始条件锁定时间大于4μs*/
16       _Nop();_Nop();_Nop();_Nop();_Nop();
17       SCL = 0;       /*钳住I2C总线,准备发送或接收数据 */
18       _Nop();_Nop();
19 }
20
21 void Stop_I2c()
22 {
23       SDA = 0;
24       _Nop();
25       SCL = 1;
26       _Nop();_Nop();_Nop();_Nop();_Nop();
27       SDA = 1;      /*发送I2C总线结束信号*/
28       _Nop();_Nop();_Nop();_Nop();
29 }
30
31 void  SendByte(unsigned char  c)
32 {
33     int i;
34
35      for(i = 0;i < 8;i++)  /*要传送的数据长度为8位*/
36     {
37         if((c << i) & 0x80)    SDA=1;   /*判断发送位*/
38            else  SDA = 0;
39          _Nop();
40          SCL = 1;               /*置时钟线为高,通知被控器开始接收数据位*/
41           _Nop();_Nop();_Nop();_Nop();_Nop();
42          SCL = 0;
43     }
44     _Nop();_Nop();
45     SDA = 1;                /*8位发送完后释放数据线,准备接收应答位*/
46     _Nop();_Nop();
47     SCL = 1;
48       _Nop();_Nop();_Nop();
49     if(SDA == 1)    ack = 0;
50     else    ack = 1;        /*判断是否接收到应答信号*/
51     SCL = 0;
52     _Nop();_Nop();
53 }
54
55 unsigned char  RcvByte()
56 {
57     unsigned char  retc;
58     int i;
59     retc = 0;
60       SDA = 1;                     /*置数据线为输入方式*/
61       for(i = 0;i < 8;i++)
62     {
63         _Nop();
64         SCL = 0;                  /*置时钟线为低,准备接收数据位*/
65         _Nop();_Nop();_Nop();_Nop();_Nop();
66         SCL = 1;                  /*置时钟线为高使数据线上数据有效*/
67         _Nop();_Nop();
68         retc = retc<<1;
69         if(SDA == 1)    retc = retc+1;  /*读数据位,接收的数据位放入retc中 */
70         _Nop();_Nop();
71     }
72       SCL = 0;
73      _Nop();_Nop();
74       return(retc);
75 }
76
77 void Ack_I2c(bit a)
78 {
79     if(a == 0)    SDA = 0;              /*在此发出应答或非应答信号 */
80       else SDA = 1;
81     _Nop();_Nop();_Nop();
82       SCL = 1;
83      _Nop();_Nop();_Nop();_Nop();_Nop();
84      SCL = 0;                     /*清时钟线,钳住I2C总线以便继续接收*/
85       _Nop();_Nop();
86 }
时间: 2024-12-16 21:24:47

8051学习笔记——AD的相关文章

8051学习笔记——IIC与EEPROM实验

main.c 1 #include <reg51.h> 2 #include "iic.h" 3 #define AT24C02 0xa0 //AT24C02 地址 4 5 sbit LS138A=P2^2; //译码器端 6 sbit LS138B=P2^3; 7 sbit LS138C=P2^4; 8 9 sbit K1 = P1^0; //保存 10 sbit K2 = P1^1; //读取 11 sbit K3 = P1^2; //+数据 12 sbit K4 =

8051学习笔记——232通信

1 #include <reg51.h> 2 3 int flag = 0; 4 unsigned int Send_Data,Recv_Data; 5 6 void main() 7 { 8 SCON = 0X50; //MODE 2 9 TMOD = 0x20; //MODE 2 10 11 TH1 = 0XFD; 12 TL1 = 0XFD; 13 14 TR1 = 1; 15 ES = 1; //开串口中断 16 EA = 1; 17 18 while(1) 19 { 20 if(fl

【点击模型学习笔记】Ad centric model discovery for redicting ads&#39; click through rate_ANT2013_Tencent

腾讯soso的人写的一篇文章,介绍soso广告系统的ctr预估技术.2013年的,应该反映了当前soso的ctr预估系统的情况. ANT会议质量一般,elsevier出版社出版.搞笑的是,文章摘要居然把论文模板上的这句话"Click here and insert your abstract text"原封不动的写在了第一句,并且就这样发表了! 主要内容: 描述soso搜索结果页面中广告点击率预测的系统实现. 具体内容: 1. 相关工作 Rechardson用逻辑回归来预测ctr ki

PowerShell 学习笔记5

可重用的远程管理会话: TCP Joke: ICM进行的会话在结束之后,会话在目标计算机上进行的会话就全部销毁了. 建立Session与查看Session $Session = New-PSSession –computerName dc Get-PSSession icm –session $sessions {$var =2} 这个$Session可以被重用(Powershell V3) 测试脚本执行时间: Measure-Command { scriptblock} 重用Session的脚

java学习笔记10--泛型总结

java学习笔记系列: java学习笔记9--内部类总结 java学习笔记8--接口总结 java学习笔记7--抽象类与抽象方法 java学习笔记6--类的继承.Object类 java学习笔记5--类的方法 java学习笔记4--对象的初始化与回收 java学习笔记3--类与对象的基础 java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址:http://www.cnblogs.com/archimedes/p/java-study-note10.html,转载

【点击模型学习笔记】A survey on click modeling in web search_Lianghao Li_ppt

是一篇综述性质的ppt. 主要内容: 对搜索中的广告点击预测,总结学术界的研究成果. 搜索广告主要展示位为:1. 搜索结果页面最上侧:2. 搜索结果右侧. 研究意义:广告点击次数直接影响收入 问题抽象:对于某个query q,和某个广告ad,预测用户对它们的点击率. 具体内容: 1. 最简单的点击模型:通过点击次数来预测,计算公式为 P = #count of clicks / #count of impressions(展现) 缺点:点击受到用户浏览行为的影响:对于长尾query和ad,存在冷

stm32寄存器版学习笔记07 ADC

STM32F103RCT有3个ADC,12位主逼近型模拟数字转换器,有18个通道,可测量16个外部和2个内部信号源.各通道的A/D转换可以单次.连续.扫描或间断模式执行. 1.通道选择 stm32把ADC转换分成2个通道组:规则通道组相当于正常运行的程序:注入通道组相当于中断.程序初始化阶段设置好不同的转换组,系统运行中不用变更循环转换的配置,从而达到任务互不干扰和快速切换. 有16个多路通道.可以把转换组织成两组:规则组和注入组.在任意多个通道上以任意顺序进行的一系列转换构成成组转换.例如,可

单片机 学习笔记(一)

最近,正在学习 ARM ,所以随便学习一下单片机,帮助理解. 在<ARM学习笔记一 入门篇>中提到过,嵌入式处理器分为三种:嵌入式微处理器 .嵌入式微控制器.嵌入式DSP :其中嵌入式微控制器 就是 单片机,它将 CPU.存储器和其他外设封装在一起 . 80C51 系列: 80C51 是 MCS-51 系列中的一个典型品种:以 8051 为基核开发出的 CMOS 工艺单片机产品统称为 80C51系列. 以下是 8051 的内部结构: 8051 的基本构成:  CPU:由运算和控制逻辑组成,同时

&lt;老友记&gt;学习笔记

这是六个人的故事,从不服输而又有强烈控制欲的monica,未经世事的千金大小姐rachel,正直又专情的ross,幽默风趣的chandle,古怪迷人的phoebe,花心天真的joey——六个好友之间的情路坎坷,事业成败和生活中的喜怒哀乐,无时无刻不牵动着彼此的心,而正是正平凡的点点滴滴,却成为最令人感动与留恋的东西. 人物:1.瑞秋•格林(RACHEL GREENE)由珍妮佛•安妮斯顿(Jennifer Aniston)扮演 瑞秋是莫妮卡的高中同学,在与牙医未婚夫的婚礼上脱逃至莫妮卡处. 2.罗