1. 单片机c语言编程时,假如一个IO已口定义了,但没定义此口是高电平还是低电平,那系统会默认为低电平么
任何一个C语言语句,最终都是经过编译程序编译成汇编语言再由汇编器编译成机器码,但是,定语句则不痛,他们被编译成汇编语言伪指令(不是可执行指令),只要你没有在定义时赋值,就没有实质的机器码产生,也就不会改变寄存器或者内存的状态。
由此,我们可以得出答案,单片机c语言编程时,假如一个IO已口定义了,但没定义此口是高电平还是低电平,那系统不会默认为低电平。这个IO口具体是什么状态,有具体单片机的默认状态决定,且不同的单片机有所不同,对传统单片机,默认状态是弱上拉准IO状态,是高电平。
2. 急求:我编的c语言控制程序,如何更改触发方式(按键判断改为高低电平判断),而保持原程序执行结果。
新建工程
首先新建工程,并加以简单配置,可以参考我的分享:《IAR如何建立工程》,如下为硬件电路图:
PICTL
PICTL可以控制Px口中断触发信号:上升沿触发、下降沿触发。由于按键在未按下时处于高电平,按下后为低电平,松开后又为高电平,所以会产生下降沿触发信号,配置为下降沿触发即可:
PICTL |= BIT0; //falling edge
IEN1
除了配置引脚,还需要开启端口引脚中断使能,如下所示开启PO口中断使能:
IEN1 |= BIT5; //P0 interrupt
PxIFG
在开启中断前需要先清除中断标志,以免误入中断造成系统混乱。
P0IFG &= ~BIT4;
系统中断使能
学习51都知道,在任何中断操作时,都需要开启系统中断:
EA = 1; //system interrupt open
中断函数书写
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
其中wg_waitUs()是延时函数,起到按键消抖作用。
代码框架
void wg_ledInit(void)
{
P1DIR |= BIT0;
P1 |= BIT0;
}
void wg_btnInit(void)
{
P0IEN |= BIT4; // P0.4 button input
PICTL |= BIT0; //falling edge
IEN1 |= BIT5; //P0 interrupt
P0IFG &= ~BIT4;
EA = 1; //system interrupt open
}
void wg_waitUs(uint16 ration)
{
while (ration--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
void main(void)
{
wg_ledInit();
wg_btnInit();
//loop
for(;;)
{
;//
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG &= ~BIT4;
P0IF &= ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
3. c语言中如何将发送的数字串(例如11011110)转换成高低电平波形
voidoutput_high(void)
{
/*具体如何输出高电平,要结合实际情况,如硬件环境*/
}
voidoutput_low(void)
{
/*具体如何输出低电平,要结合实际情况,如硬件环境*/
}
voidmain(void)
{
unsignedchardata=222;//11011110,举例
unsignedchartemp=0;
unsignedinti=0;
for(i=0;i<8;i++)
{
temp=data&1;
if(temp==0)
output_low();
else
output_high();
data=data>>1;
delay();//延时函数,举例
}
}