① PIC 单片机PSP应用
郭德纲这首歌
② PIC16F877单片机的5个端口RA~RE各具什么特色分别适用于什么场合
1. PORTA 总共有6个位(RA0~RA5),PORTA端口模块有3个特殊的寄存器:端口数据寄存器PORTA,端口方向控制寄存器TRISA,A/D转换控制寄存器ADCIN1;PORTA端口各引脚的所复合的功能相同,各引脚的内部结构也不一致。对三个寄存器的设置可控制PORTA端口作为数字I/O端口的应用,而系统重置后,PORTA自动成为模拟输入状态,可读取模拟输入讯号;
PORTB 是8位宽度的数字I/O端口(RB0~RB7),一般只有RB6和RB7两个引脚存在复用功能,它们在芯片编程烧写和在线调试时,RB6作为编程串行时钟引脚PGC,RB7作为编程串行数据引脚PGM,这是一种特殊模式的功能复用类型,它不可能出现在芯片正常工作时。PORTB模块有关的特殊寄存器有4个,PORTB端口作为数字I/0端口的应用可以撰写程序规划输入输出方向、状态;
PORTC 总共有8个位(RC0~RC7),有关的特殊寄存器有2个,单片机上电之后,输出数据寄存器PORTC的值随机值,方向寄存器TRISC的值全为1,因此,起始状态下各个引脚均处于输入方式,对外呈现高阻状态,通过定义TRISC寄存器的值,可以分别指定引脚设置为输入还是输出方式。除了可作为数位I/O外,还和一些特殊功能的周边电路共享接脚;
PORTC 是8位宽度的双向数字I/O端口(RC0~RC7),有关的特殊寄存器有3个,它在基本输入/输出功能的基础上,增加并行从动端口功能;另外每个引脚作I/O引脚使用时,输入信号都要经过其内部的施密特触发输入缓冲器,对于输入信号波形可以起整形作用,而工作于并行从动端口方式时则是经过TTL缓冲器输入。PORTC可作一般数字I/O,并与PSP(Parallel Slave Port)并列传输接口共享。当整体系统需要多单片机时,彼此可以经由并列传输接口来快速传输资料;
PORTE 只有3条引脚的双向I/O端口(RE0~RE2),有关的特殊寄存器有3个,它在基本输入/输出功能的基础上,增加并行从动端口,模拟量输入功能。单片机上电之后,输出数据寄存器PORTE的值随机值,方向寄存器TRISC的值全为1,因此,起始状态下各个引脚均处于输入方式,对外呈现高阻状态,通过定义TRISE寄存器的值,可分别指定引脚设置为输入还是输出方式。
2.由RA4的内部结构可知,RA4和PORTA端口的其它端口有很大的不同,它没有被复用成模拟信号输入。一般其作用有个:普通数字I/O端口和定时TMR0的外部数字脉冲输入端口(TOCKI)。RA4特征如下:
(1)输入时与其它端口一样,都是呈现高阻态。
(2)输出低电平时,与其它端口一样,吸入端口外部电路的电流,引脚上的电压接近0V。
(3)输出高电平时,与其它端口有很大不同,RA4端口只有一个N沟道场效应驱动管,没有P沟道场效应驱动管,所以RA4引脚处于漏极开路状态,输出高电平时为悬空状态。改进方法:尽量设计成低电平有效,若需要高电平来驱动外围电路时,必须在RA4引脚上外加上拉电阻。上拉电阻的取值范围为1KΩ~10KΩ左右。
3.是,选项寄存器POTION也是一个可读/写的寄存器,包含TMR0,分频器和端口RB有关的控制位。端口RB0与外部中断INT共同一引脚,与该引脚有关的2个控制位含义如下:
1=RB 端口弱上拉电路禁止
0=RB 端口弱上拉电路使能
所以该端口内部每条引脚的弱上拉电路是不可单独编
③ porte是什么意思
Porte 英[pɔ:t] 美[pɔrt, port]
n. (=Sublime Porte) 土耳其宫廷;
[例句]The16th Paris Chocolate Exhibition's opening ceremony was held in Paris Portede Versailles Exhibition Center, France.
法国巴黎第16届巧克力展在巴黎凡尔赛门展览中心拉开了序幕。
④ 关于STM32GPIO口的问题
void GPIO_Write(GPIO_TypeDef* GPIOx, u16 PortVal)可以实现,要学会使用库函数。另外,每一个GPIO都有相应的一组寄存器,实现IO输出的寄存器有好几个,如:置位复位寄存器、输出寄存器。建议一下,学stm32要先学会它的编程思路。如果你明白了库函数,我相信只要按照例程练习练习就能上手了
⑤ 单片机 pic c语言
PORTG是单片机里面的寄存器,而lcd_wz8是你在内存里面开出来的一个字节空间。
所以对lcd_wz8空间操作,当然不会对PORTG操作了。
你可以试一下这个结构
union {
struct
{
unsigned b0: 1 _at_ RG0;
unsigned b1: 1 _at_ RG1;
unsigned b2: 1 _at_ RG2;
unsigned b3: 1 _at_ RG3;//bit_wz8的低四位
unsigned b4: 1 _at_ RA0;
unsigned b5: 1 _at_ RA1;
unsigned b6: 1 _at_ RA2;
unsigned b7: 1 _at_ RA3; //bit_wz8的高四位
} bit_wz8;
unsigned char xs_wz8;
} lcd_wz8;
这个联合我也没试过,你可以试下下。
也就是分配变量时候,指定存储地址。把存储地址跟寄存器地址匹配成一样,应该就可以了。
⑥ 在51单片机上如何让数码管流水式的显示16进制数,
这个简单啊,你建一个表就行了,直接取表数据放上去显示。
数码管用动态扫描。下面是AVR的代码,你参考一下就行了。
#include <iom64v.h>
#include <macros.h>
#define SEG PORTA // 数码管段码
#define SCAN PORTC // 数码管位选
#define uchar unsigned char
#define uint unsigned int
///////////////////////////////////////////////////////////
// Name : 段码和位选
// In :
// Out :
// Function :
// Explain : 数码管为共阳,低电平时选通数码管
///////////////////////////////////////////////////////////
uchar seg[]={ 0xc0,0xf9,0xa4,0xb0,0x99, // 0-4 (共阳)
0x92,0x82,0xf8,0x80,0x98, // 5-9
0xff }; // 灭
uchar sel[]={ 0xfe,0xfd,0xfb,0xf7, // 从右向左选择(低电平选通)
0xef,0xdf,0xbf,0x7f };
///////////////////////////////////////////////////////////
// Name : 8个数码管的状态
// In :
// Out :
// Function :
// Explain : 10代表灭,其它数字代表真实的显示值
///////////////////////////////////////////////////////////
uchar display[]={ 7,10,10,10,10,10,10,10, // 右边第一个数码管显示7,第二个灭……
6,7,10,10,10,10,10,10, // 右边第一个数码管显示6,第二个显示7,第三个灭……
5,6,7,10,10,10,10,10, // 右边第一个数码管显示5,第二个显示6,第三个显示7,第四个灭……
4,5,6,7,10,10,10,10, // 以此类推,得到76543210向左移动的效果!
3,4,5,6,7,10,10,10,
2,3,4,5,6,7,10,10,
1,2,3,4,5,6,7,10,
0,1,2,3,4,5,6,7
};
///////////////////////////////////////////////////////////
// Name : 延时函数
// In :
// Out :
// Function : 用于延时一定时间
// Explain : 用12M晶振时,大概延时1ms,
///////////////////////////////////////////////////////////
void delay_1ms(uint x) // 用12M晶振时,延时1ms,
{
uint i,j;
for(i=0; i<x; i++)
for(j=0; j<1720; j++);
}
///////////////////////////////////////////////////////////
// Name : 端口定义
// In :
// Out :
// Function : 用于定义端口方向等
// Explain :
///////////////////////////////////////////////////////////
void port_init(void)
{
PORTA = 0x00;
DDRA = 0xff; // PA口设置成输出,数码管段码
PORTB = 0x00;
DDRB = 0x00;
PORTC = 0x00; // m103 output only
DDRC = 0xff; // PC口设置成输出,数码管位选
PORTD = 0x00;
DDRD = 0x00;
PORTE = 0x00;
DDRE = 0x00;
PORTF = 0x00;
DDRF = 0x00;
PORTG = 0x00;
DDRG = 0x00;
}
///////////////////////////////////////////////////////////
// Name : 初始化函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
// call this routine to initialize all peripherals
void init_devices(void)
{
// stop errant interrupts until set up
CLI(); // disable all interrupts
XDIV = 0x00; // xtal divider
XMCRA = 0x00; // external memory
port_init(); // 端口初始化
MCUCR = 0x00;
EICRA = 0x00; // extended ext ints
EICRB = 0x00; // extended ext ints
EIMSK = 0x00;
TIMSK = 0x00; // timer interrupt sources
ETIMSK = 0x00; // extended timer interrupt sources
SEI(); // re-enable interrupts
// all peripherals are now initialized
}
///////////////////////////////////////////////////////////
// Name : 主函数
// In :
// Out :
// Function :
// Explain :
///////////////////////////////////////////////////////////
void main(void)
{
uint a,b,c,cnt;
init_devices(); // 初始化
delay_1ms(500);
while(1)
{
for(b=0; b<8; b++) // 总共显示8幅(8个左移效果)
for(c=0; c<500; c++) // 显示一幅,一幅包括8个数码管的显示值
{
SCAN=0xff; // 送数据时,先关闭显示,以避免重影现象
SEG=seg[display[cnt+b*8]]; // 送数据
SCAN=~sel[cnt]; // 送出数据后,打开显示
delay_1ms(1); // 延时1ms,动态扫描,让人看得到
cnt++; // 指向下一个状态
if(cnt==8) // 判断是否取完8个数码管的状态
cnt=0;
};
}
}
⑦ PIC单片机清零指令 CLRF PORTD ;PORTD 清零 BCF PORTE ;RE0清零 这两个清零指令除了一个是清除所有的,和
CLRF 影响标志位,BCF不影响标志位.并没有其它的区别了,两个指令运行的效率是一样的.
⑧ 单片机为什么能按位寻址
以Atmega16单片机为例吧,这单片机的A、B、C、D四个端口的所有寄存器地址处于0x10~0x1B的地址范围内,而单片机的SBI、CBI指令能将0x20之前所以地址中任意位清零或者置一。所以PORTB.2=1对应的汇编指令就是SBI 0x18,2。如果端口的地址大于0x20,那就只能使用IN、OUT指令完成了。
这是CVAVR中Atmega128单片机中语句编译的结果:
; 182 PORTA.0=1;
SBI 0x1B,0
; 183 DDRA.2=0;
CBI 0x1A,2
; 184
; 185 PORTB.1=1;
SBI 0x18,1
; 186
; 187 PORTC.2=1;
SBI 0x15,2
; 188
; 189 PORTD.3=0;
CBI 0x12,3
; 190
; 191 PORTE.4=1;
SBI 0x3,4
对于PORTF和PORTG则不能这样操作。
CVAVR是直接编译这些语句的,没有使用结构体。 并且结构体中也没有PORTB.2这种写法,结构体成员不能是直接的数值!
⑨ AVR单片机问题 undeclared identifier DDRE
这单片机有没有E口?你把你包含的头文件打开,看里面都定义了什么端口,没有定义的,你用了就会出错。
⑩ 飞思卡尔单片机串口中断
如果是仿真, 得先虚拟串口对才行
如果是下到单片机中, 你看看你数据缓冲区有没有问题
我不懂C