51单片机PCF8591-AD-DA转换
51单片机PCF8591-AD-DA转换,中断实现切换。
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned intsbit SCL=P2^1; //串行时钟输入端
sbit SDA=P2^0; //串行数据输入端
sbit HC595_RCLK = P2^5;
sbit HC595_SRCLK = P2^6;
sbit HC595_SER = P2^7;uchar flag,n,a,b,c,yi,er,san,si,wu,liu,qi,ba;
uchar code shuma_duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40,0x00};
void display();
void delay() //延时4-5个微秒
{;;}
//
void Delay_Ms(uint z)
{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);
}
//
void Send_595(uchar dat)
{ uchar i;for(i=0; i<8; i++){if(dat & 0x80)HC595_SER = 1;else HC595_SER = 0;HC595_SRCLK = 0;HC595_SRCLK = 1;dat = dat << 1;}
}
//
void start()//开始信号
{SDA=1;delay();SCL=1;delay();SDA=0;delay();
}
//
void stop() //停止信号
{SDA=0;delay();SCL=1;delay();SDA=1;delay();
}
//
void respons()//应答 相当于一个智能的延时函数
{uchar i;SCL=1;delay();while((SDA==1)&&(i<250))i++;SCL=0;delay();
}
//
void init() //初始化
{SDA=1;delay();SCL=1;delay();
}uchar read_byte()
{uchar i,k;SCL=0;delay();SDA=1;delay();for(i=0;i<8;i++){SCL=1;delay();k=(k<<1)|SDA;//先左移一位,再在最低位接受当前位SCL=0;delay();}return k;
}
//
void write_byte(uchar date) //写一字节数据
{uchar i,temp;temp=date;for(i=0;i<8;i++){temp=temp<<1; //左移一位 移出的一位在CY中SCL=0; //只有在scl=0时sda能变化值delay();SDA=CY;delay();SCL=1;delay();SCL=0;delay(); } SDA=1;delay();
}
//
void write_process(uchar kongzhizi,uchar date)
{start();write_byte(0x90); //1010 0000 前四位固定 接下来三位全部被接地了 所以都是0 最后一位是写 所以为低电平respons();write_byte(kongzhizi);respons();write_byte(date);respons();stop();
}
//
uchar read_process(uchar kongzhizi)
{uchar date;start();write_byte(0x90);respons();write_byte(kongzhizi);respons();start();write_byte(0x91); //把最后一位变成1,读respons();date = read_byte();stop();return date;
}
//
void main()
{flag = 0;EA = 1;EX0 = 1;IT0 = 1;while(1){//A/D转换//通过AD转换,把数值显示。if(flag == 0){init();n = read_process(0x00); //rb2滑动变阻器
// n = read_process(0x01); //光敏电阻 光度越强 数值越小
// n = read_process(0x02); //热敏电阻 温度越高 数值越小
// n = read_process(0x03); //接地为0yi=n/100;er=n%100/10;san=n%10;si=11;wu=11;liu=11;qi=11;ba=11;display();}//D/A转换//慢慢变亮后再慢慢变暗,如此循环。if(flag == 1){if(a <= 250){a++;c = a;if(a == 251){b = 250;}}if(b >= 2){b--;c = b;if(b == 1){a = 0;}}Delay_Ms(5);write_process(0x40,c);}}
}
//
void exter() interrupt 0 //控制D/A转换还是A/D转换。
{flag++;if(flag == 2){flag = 0;}
}
//
void display()
{Send_595(0xfe); Send_595(shuma_duan[yi]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xfd); Send_595(shuma_duan[er]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xfb); Send_595(shuma_duan[san]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xf7);Send_595(shuma_duan[si]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xef); Send_595(shuma_duan[wu]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xdf); Send_595(shuma_duan[liu]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0xbf); Send_595(shuma_duan[qi]);HC595_RCLK = 0;HC595_RCLK = 1;Send_595(0x7f); Send_595(shuma_duan[ba]);HC595_RCLK = 0;HC595_RCLK = 1;
}
个人见解,感谢阅读。
51单片机PCF8591-AD-DA转换相关推荐
- 单片机C语言DA转换,51单片机PCF8591的DA转换程序详解[含HL-1与HJ-c52 DA代码AD/DA原理图](可直接复......
以下是补充(能想到的范围有限有没想到的还请谅解) DA工作原理 基于PCF8591芯片 DA是什么? n DA指数模转换(Digital to Analog),顾名思义,就是把数字信号转换成模拟信号. ...
- AD/DA转换(XPT2046)
AD/DA介绍 AD(Analog to Digital):模拟-数字转换,将模拟信号转换为计算机可操作的数字信号 DA(Digital to Analog):数字-模拟转换,将计算机输出的数字信号转 ...
- PCF8591 ---AD\DA转换器的使用(IIC通信的软件模拟与应用) (by 51单片机)
依旧是借着蓝桥杯的机会,来学习一些模块,和软件模拟一些通信方式. 今天学习的模块是PCF8591,一款AD\DA转换器,使用IIC通信方式. 芯片的内部框图如下所示: 各引脚作用如下表所示: 仍旧和之 ...
- 基于51单片机的AD转换设计
一.设计目的 掌握AD转换芯片的基本工作原理: 掌握一个完整的C语言程序结构: 熟悉AD转换与单片机的使用的编程. 二.设计环境 Keil开发环境 Proteus软件. 三.设计及调试 (1) 设计内 ...
- PCF8591芯片的AD/DA转换(适用于蓝桥杯单片机)
目录 1.PCF8591的引脚介绍 2.用IIC发送或接收字节 发送的第一个字节 发送的第二个字节 发送第三个字节 3.发送和接收的字节转换 4.全部代码 IIC部分 接收电压数据 发送电压数据 1. ...
- 51单片机——AD/DA转换
模数和数模转换 A:模拟量 D:数字量 模拟量:自然界连续变化的物理量.所谓连续,包含两个方面的含义: 一方面从时间上来说,它是随时间连续变化的: 另一方面从数值上来说,它的数值也是连续 ...
- [网友问答1]STM32驱动PCF8591模块,实现AD/DA转换
欢迎关注 程序员小哈带你玩转嵌入式,微信搜索:嵌入式从0到1,更多干货等着你. 想进小哈技术交流群,请加程序员小哈个人微信,带你嵌入式入门进阶. 问题原由 粉丝提问,STM32如何驱动PCF8591? ...
- 基于51单片机的AD转换
A/D转换 选用芯片:AT89S52 函数功能:如下代码 /******************************************************************* 此函 ...
- 十四、51单片机之AD转换
1.AD相关简介 1.1.什么是AD转换? (1)A是指analog.模拟的:D是指digital.数字的. (2)现实世界是模拟的,连续分布的,无法被分成有限份:计算机世界是数字的,离散分布的,是可 ...
- PCF8591模块ad/da转换
A/D转换获取电压值 0x43从滑动变阻器中获得电压 0x41从光敏电阻获得电压 实时电压/51.0 给芯片0~255值控制电压0~5v
最新文章
- 巨杉数据库通过“Mpp数据库基础能力认证”,权威技术认证金融级数据库
- GAN(Generative Adversarial Network,GAN)模型之:SeqGAN、IRGAN、StackGAN、BigBiGAN、GAIN模型
- 尼姆博奕 (Nimm Game) 异或运算;
- Oracle中的Union、Union All、Intersect、Minus 使用用法区别
- 删除Windows 系统快捷方式箭头 Delete Windows Shortcuct Arrows
- 怪物行为树案例_Behavior Designer行为树(简单实现巡逻)
- k8s问题 CrashLoopBackOff
- Qt|OpenGL-天空盒子的创建
- 如何选择漏电保护器规格型号_老师傅告诉你:电路跳闸如何解决
- STM32串口编程易错点
- 英语四级阅读猜题的技巧
- python用户画像_Python爬虫实践之:简书用户画像
- ssh连接不上服务器
- wegame安装包文件MD5校验失败解决方案
- 在线生成透明ICO图标
- 内容协商 Spring ContentNegotiation
- 本人的月末结账步骤备忘
- 蒙特卡洛(Monte Carlo)
- Golang 之 IED 安装(mac)
- 如何获得复权后的股票数据