基于51单片机的PCF8591 DA转换 附带工程文件可供学习
单片机源程序如下:
- /**********************51实验开发板例程************************
- * 平台:HJ-C52 + Keil U4 + STC89C52RD
- ******************************************************************/
- /*-----------------------------------------------
- 名称:IIC协议 PCF8591ADDA转换
- 内容:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示
- ------------------------------------------------*/
- #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
- #include <intrins.h> //包含NOP空指令函数_nop_();
- #define AddWr 0x90 //写数据地址
- #define AddRd 0x91 //读数据地址
- sbit RST=P2^4; //关掉时钟芯片输出
- sbit Sda=P2^0; //定义总线连接端口
- sbit Scl=P2^1;
- sbit Fm=P2^3; //FM
- sbit dula=P2^6;
- sbit wela=P2^7;
- bit ADFlag; //定义AD采样标志位
- unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
- data unsigned char Display[8];//定义临时存放数码管数值
- /*------------------------------------------------
- 延时程序
- ------------------------------------------------*/
- void mDelay(unsigned char j)
- {
- unsigned int i;
- for(;j>0;j--)
- {
- for(i=0;i<125;i++)
- {;}
- }
- }
- /*------------------------------------------------
- 初始化定时器1
- ------------------------------------------------*/
- void Init_Timer1(void)
- {
- TMOD |= 0x10;
- TH1=0xff; /* Init value */
- TL1=0x00;
- //PT1=1; /* 优先级 */
- EA=1; /* interupt enable */
- ET1=1; /* enable timer1 interrupt */
- TR1=1;
- }
- /*------------------------------------------------
- 启动IIC总线
- ------------------------------------------------*/
- void Start(void)
- {
- Sda=1;
- _nop_();
- Scl=1;
- _nop_();
- Sda=0;
- _nop_();
- Scl=0;
- }
- /*------------------------------------------------
- 停止IIC总线
- ------------------------------------------------*/
- void Stop(void)
- {
- Sda=0;
- _nop_();
- Scl=1;
- _nop_();
- Sda=1;
- _nop_();
- Scl=0;
- }
- /*------------------------------------------------
- 应答IIC总线
- ------------------------------------------------*/
- void Ack(void)
- {
- Sda=0;
- _nop_();
- Scl=1;
- _nop_();
- Scl=0;
- _nop_();
- }
- /*------------------------------------------------
- 非应答IIC总线
- ------------------------------------------------*/
- void NoAck(void)
- {
- Sda=1;
- _nop_();
- Scl=1;
- _nop_();
- Scl=0;
- _nop_();
- }
- /*------------------------------------------------
- 发送一个字节
- ------------------------------------------------*/
- void Send(unsigned char Data)
- {
- unsigned char BitCounter=8;
- unsigned char temp;
- do
- {
- temp=Data;
- Scl=0;
- _nop_();
- if((temp&0x80)==0x80)
- Sda=1;
- else
- Sda=0;
- Scl=1;
- temp=Data<<1;
- Data=temp;
- BitCounter--;
- }
- while(BitCounter);
- Scl=0;
- }
- /*------------------------------------------------
- 读入一个字节并返回
- ------------------------------------------------*/
- unsigned char Read(void)
- {
- unsigned char temp=0;
- unsigned char temp1=0;
- unsigned char BitCounter=8;
- Sda=1;
- do
- {
- Scl=0;
- _nop_();
- Scl=1;
- _nop_();
- if(Sda)
- temp=temp|0x01;
- else
- temp=temp&0xfe;
- if(BitCounter-1)
- {
- temp1=temp<<1;
- temp=temp1;
- }
- BitCounter--;
- }
- while(BitCounter);
- return(temp);
- }
-
- /*------------------------------------------------
- 写入DA数模转换值
- ------------------------------------------------*/
- void DAC(unsigned char Data)
- {
- Start();
- Send(AddWr); //写入芯片地址
- Ack();
- Send(0x40); //写入控制位,使能DAC输出
- Ack();
- Send(Data); //写数据
- Ack();
- Stop();
-
- }
- /*------------------------------------------------
- 读取AD模数转换的值,有返回值
- ------------------------------------------------*/
- unsigned char ReadADC(unsigned char Chl)
- {
- unsigned char Data;
- Start(); //写入芯片地址
- Send(AddWr);
- Ack();
- Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
- //Chl的值分别为0、1、2、3,分别代表1-4通道
- Ack();
- Start();
- Send(AddRd); //读入地址
- Ack();
- Data=Read(); //读数据
- Scl=0;
- NoAck();
- Stop();
- return Data; //返回值
- }
- void fmg(void)//fm关
- {
- Fm=1; // 关 fm
- }
- void cmg(void)//数码管锁存函数 关时钟DS1302
- {
- dula=1;
- P0=0x00;
- dula=0;
- wela=1;
- P0=0x00;
- wela=0;
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
51单片机DA数模转换.rar
(304.81 KB, 下载次数: 94)
|