请问 用PIC 单片机 的 IO 口,怎么同时设置成为输入、输出。

请问 用PIC 单片机 的 IO 口,怎么同时设置成为输入、输出。,第1张

看来这是个比较有争议的话题哟,上面两位都说DHLFAN说的不对,我倒是有点说法了,将端口配置为模拟输入并不代表打开AD模块,ADGO没有置位嘛并且当端口为模拟输入时候内部就等于是悬空的,因为AD模块是通过一个多路开关选择和某个通道接通的,平时不被选中的通道基本等于悬空,选中的通道也基本算是接一个几十PF的保持电容,电流几乎为0。在说说设置为普通输入和输出的问题,当设置为普通输入时,虽说此时为高阻抗,但是芯片内部的整形电路需要工作,(这个不要解释了吧?)此时你再将这个端口悬空的话,因为输入阻抗高的原因,在实际使用时内部的整形电路不断翻转,要消耗不少电流的哦,另外什么WDT BOD,不再问题范围就不说了,还有降低频率这些个地球人都知道!!什么?你不知道内部的整形电路是啥东东?好吧,我就说说,大家都知道设置为普通输入(数字输入)的端口只能读到两个状态,0、1 。但是当此端口的电压为05V时呢?大家都会说为0为1V时呢?大家还是说为0为25V呢????大家会说为1了吧???为什么25V会为1?为什么1V时不为1,(当然事实上还有不同逻辑电平(特性)的输入端。什么施密特输入啊,TTL输入啊就不说了)这个时候就是靠内部的整形电路来将这个端口的电压值转换为0或者1,当设置为普通输入时这个电路就要干活了,而且是每个端口有一个,就等着消耗电流吧。

如何自己搭建AD转换电路
实现RS-232电平和TTL/CMOS电平转换可以用接口芯片来实现,实现数据的串行到并行转换用的是UART,它们是实现串行通信必不可少的两个部分。本发明涉及一种AD转换电路,使用AD7606芯片取代运放电路及MAX1320ECM的AD转换电路,将需转换的模拟信号经两级RC滤波后接到AD7606芯片的8路模拟量输入引脚中,通过该芯片将8路模拟信号同步转换成16位分辨率的数字量信号,再将这16位数字量信号接到FPGA中。所述AD7606芯片具有1MΩ的输入阻抗的输入缓冲器,二阶抗混叠模拟滤波器,具有模拟输入钳位保护功能,有16位数字输出端口,提高了AD转后的分辨率。设计一个 AD0809 模数转换芯片的驱动电路,能将 A0 通道的模拟电压(0-5V)值以 16 位光柱对应显 示。

#include
<stc12c2052adh>
#include
<intrinsh>
#define
uchar
unsigned
char
#define
uint
unsigned
int
#define
AD_SPEED
0x60
//0110,0000
1
1
270个时钟周期转换一次,
/江苏淮安欢迎您!&&&&布衣欢迎您!/
/qq:42814761壮丽江南,魅力楚州/
//
sbit
M=P1^5;
//过压指示灯
sbit
N=P1^3;
//欠压指示灯
sbit
LED=P1^7;
//工作正常灯
sbit
CONTRL=P3^4;
//输出控制端
sbit
PWM=P3^7;
//
void
pwm();
void
delayms(uint);
uint
ADC();
void
InitADC();
void
baohu();
float
voltage=00;
uint
V;
float
VCC=505;
uchar
mtab[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
/8/
void
main()
{
CONTRL=0;//先关闭输出
delayms(700);
V=40;
//这些是我差错的时候添上去的。目的在于弄明白到底AD转换了没有。
voltage=40;//实践证明,更换数值没用,说明没AD
LED=0;
CONTRL=1;
voltage=VVCC/25600500;
delayms(1000);
PWM=1;
CONTRL=1;//继电器工作,是保护状态
delayms(1000);
M=0;
N=0;
LED=0;
delayms(2000);
M=1;
N=1;
LED=1;
pwm();//产生PWM波形
delayms(7000);
delayms(100);//延时
InitADC();
delayms(20);
V=
ADC();
baohu();
while(1)
{
V=
ADC();
baohu();
delayms(300);
}
}
//
//
void
pwm()
{
//PCA模块工作于PWM模式
C程序
CMOD
=
0x04;
//用定时器0溢出做PCA脉冲
CL
=
0x00;
//PCA定时器低8位
地址:E9H
CH
=
0x00;
//PCA高8位
地址
F9H
CCON=0x00;
CCAP0L
=
0x60;
//PWM模式时他俩用来控制占空比
CCAP0H
=
0x60;
//0xff-0xc0=0x3f
64/256=25%
占空比(溢出)
CCAPM0
=
0x42;
//0100,0010
Setup
PCA
module
0
in
PWM
mode
//
ECOM0=1使能比较
PWM0=1
使能CEX0脚用作脉宽调节输出
/
PCA
模块工作模式设置
(CCAPMn
寄存器
n=
0-3四种)
7
6
5
4
3
2
1
0
-
ECOMn
CAPPn
CAPNn
MATn
TOGn
PWMn
ECCFn
选项:
0x00
无此 *** 作
0x20
16位捕捉模式,由
CEXn上升沿触发
0x10
16位捕捉模式,由CEXn下降沿触发
0x30
16位捕捉模式,由CEXn的跳变触发
0x48
16位软件定时器
0x4c
16位高速输出
0x42
8位PWM输出
每个PCA模块另外还对应两个寄存器:CCAPnH和CCAPnL

捕获或者比较时,它们用来
保存16位计数值,当工作于PWM模式时,用来控制占空比
/
TMOD=0x02;
TH0=0x06;
TL0=0x06;
CR=1;
//Start
PCA
Timer
TR0=1;
}
//AD转换初始化
----打开ADC电源
void
InitADC()
{
P1=0xff;
ADC_CONTR|=0x80;
delayms(80);
//这两个寄存器用来设置
P1口四种状态,每一位对应一个P1引脚
,按状态组合 *** 作
/
P1M0
和P1M1
寄存器位
7
6
5
4
3
2
1
0
P17
P16
P15
P14
P13
P12
P11
P10
同理P3M0
P3M0
也是。因为STC12C2052AD只有两个P口,所以只有这俩组
STC12C5410AD还多P2M0
P1M0
有三组
P1M0
P1M1

0
0
普通I0口
(准双向)
P1寄存器位
7
6
5
4
3
2
1
0
0
1
强推挽输出
(20MA电流
)尽量少用
P17
P16
P15
P14
P13
P12
P11
P10
1
0
仅做输入
A/D转换时可用此模式
1
1
开漏
,A/D转换时可用此模式
例如:
要设置P12为
AD
输入口

P1M0=0X02
;
P1M1=0X02;
开漏即可
当不用AD时,最好
关闭ADC电源
,恢复为IO口状态
/
P1M0=0x02;//这两个寄存器用来设置
P1口四种状态,每一位对应一个P1引脚
,按状态组合 *** 作
P1M1=0x02;//设置P11为开漏状态
}
//
AD转换程序
/
注意:这个函数里注释的命令是通用命令,可以针对所有AD通道使用,我这就认准了P11一个通道,所以直接
//赋值,省点"流量"!折磨我的问题就出在这个函数里的while等待语句
while
(1)
//等待A/D转换结束
{
if
(ADC_CONTR
&
0x10)
//0001,0000
测试A/D转换结束否
{
break;
}
}

把你家的大铁锅或其他物品,(反正是圆的,往里凹的,能反射信号的就行要尽量大些小了信号弱或者无信号)至于接收装置,(锅中间的哪个东东)外面有卖的,或者去别人家的锅里借一个,至于机顶盒,家里的DVD肯定不行了,可以把家里的多媒体功放机,所为功放机也是功率放大器,也是信号功率放大器,把输入的小电流进行放大。(那种后面带视频输出的那种)把这个拆掉,有个信号输入端,把锅的线接在这里,至于输出到电视的端口,信号功率放大器的后面板会有一个hdmi接口,楼主是想DIY么?你可以试试,相信对你有帮助


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12726051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-27
下一篇 2023-05-27

发表评论

登录后才能评论

评论列表(0条)

保存