单片机源程序如下:
/**********************51实验开发板例程************************
* 平台:HJ-C52 + Keil U4 + STC89C52RD
******************************************************************/
/*-----------------------------------------------
名称:IIC协议 PCF8591ADDA转换
内容:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示
------------------------------------------------*/
#include #include #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; //返回值
上一篇:单片机汇编 设晶振频率为11.0592M,串口工作方式1
下一篇:rs485 16路继电器控制板 仿modbus通信协议控制有上下位机程序
推荐阅读最新更新时间:2024-11-17 01:18
设计资源 培训 开发板 精华推荐
- DER-404 - 适用于A19灯的8 W可调光、高效率、高PF、非隔离LED驱动器
- AI01语音红外遥控器
- 使用 Endicott Research Group 的 SFDKB3908F 的参考设计
- DM163008、MCP2120/MCP2150 红外开发工具包
- LT8606EMSE 12V、1MHz 降压型稳压器的典型应用电路
- 仪表用 ADC 驱动器
- 使用 Richtek Technology Corporation 的 RT7281 的参考设计
- 使用 Analog Devices 的 LTC1430CS8 的参考设计
- L7808A 稳压器的典型应用@ (Vo(min) = Vxx + VBE)
- 用于电机控制的 MOSFET 功率驱动器
- Allegro MicroSystems 在 2024 年德国慕尼黑电子展上推出先进的磁性和电感式位置感测解决方案
- 左手车钥匙,右手活体检测雷达,UWB上车势在必行!
- 狂飙十年,国产CIS挤上牌桌
- 神盾短刀电池+雷神EM-i超级电混,吉利新能源甩出了两张“王炸”
- 浅谈功能安全之故障(fault),错误(error),失效(failure)
- 智能汽车2.0周期,这几大核心产业链迎来重大机会!
- 美日研发新型电池,宁德时代面临挑战?中国新能源电池产业如何应对?
- Rambus推出业界首款HBM 4控制器IP:背后有哪些技术细节?
- 村田推出高精度汽车用6轴惯性传感器
- 福特获得预充电报警专利 有助于节约成本和应对紧急情况