大家帮我看个PIC的LED闪烁程序

大家帮我看个PIC的LED闪烁程序,第1张

小哥,问题表达清楚,是要A端口的某一个LED闪烁还是所有A端口LED闪烁;

TRISA=0X07表明RA0,RA1,RA2是作为输入功能的,当然不帆塌能作为输出去控制LED;

另外,想对A端口的某一位 *** 作,可定义成TRISAbits.TRISA3,就是你理态亩圆解耐源的TRISA3

其他的如LATAbits.LATA3、PORTAbits.RA3

楼上没用过PIC的氏伏搜就不要胡乱猜测发言。PIC10、12、16、18、24、32虽然是Microchip公司的PIC系列单片机。但结构却是完全不相同的:

首先,PIC10/PIC12/PIC16是pic八位中档单片机,汇编指令只有三十多条,没有乘法除法指令(用汇编写乘除,只能循环做移位计算),其芯片的引脚数从六个引脚的到六十四个引脚的不等,引脚多的所集成的外设功能也多……第二PIC18系列也是八位的PIC单片机,较前者高档点,集成的功能也多比如USB、CAN总线等等。汇编指令有八十多条,和前者不同,带乘法除法指令和硬件乘法器。

第三PIC24系列的是16位单片机, 近七十条汇编指令。有硬件乘法器和硬件除法器(有了它就可以在一个指令周期内完成一个17*17或32/16的算法)。内部集成的存储器较大。还有一种厅早芯片上面没提到,就是dsPIC系列,这其实就是集成了DSP(数字信号处理)功能的PIC24单片机,在进行某些信号控制的时候需要用到它,但它功耗较大。

第四种就是PIC32,它是三十二位的单片机,它出现的目的就是MICROCHIP公司为了用它来盒和ARM做市场竞争的。简单点说,它跟ARM是一个级别的。

虽然MICROCHIP公司的PIC芯片都是用RICS指令结构,但其内部结构不尽相同,如果你要学PIC单片机,建议先学PIC16F887,这款芯片几乎包括了PIC10~16系列中的大部分外设。推荐这个系列的最好先学汇编指令。先把这个学懂了,然后再用PIC10~16系列的其他芯片,你只需要从Microchip的网站上下载Datasheet仔细阅读以下和PIC16F887的区别就可以(指令都一样的)。而PIC18和PIC24和dsPIC系列的,你需要在原有的基础上,多看DATAHSEET,主要是看指令集的区别。这三个系列的可以直接学C,但也要了解一下汇编。

而PIC32,现在它还比不过ARM芯片,市场前景很难估计,也没有几个企业用这芯片的。不建议你现在学这个。

你的第一个问题,看门狗用了预分频的话,那定时器0就不能再用预分频了。有的PIC芯片还带有看门口自己独用的分频器,这样的话可以给TIMER0让出一个预分频来(比如PIC16F886)。 看门狗如何设成最优,那只能是从你的指令里计算了,还必须根据你的单片机所运行的环境来看,如果电磁环境很恶劣,最好是较短时间就设置一调喂狗指令。

啊,写了一大堆,如果有不明白的可以百度HI问我。 除了歼历PIC32和PIC10外,其他系列的我都用过一些芯片

假设PPWM的脉宽为20,TH是高电平输出时间,TL是低电平输出时间,你只要在程序中满足TH+TL = 20就可以了

假设用延时程序来实现,delay(char i)为延时100us的程序,i为循环次数

void delay(uchar i)

{

uint x,y

for(x=ix>0x--)

for(y=100y>0y--)

}

void main()

{

uchar pwm = 1,h = 20

while(1)

{

RC3 =1

delay(pwm)

RC3 = 0

delay(h - pwm)

}

}

改变pwm的值(1-19)就可以改变输出高电平的宽度

例如:

//利作RC3控制输出PWM信号,控制电机正反转及转速,

//RC2为按键,默认为上拉高电平,当RC2按下为低电平时,RC1为电机以一定的速度转动,(松开默认为停止)长按停止

//MOS3205控制电机的管,高电平导通,低电平停止

//PIC16F877A,晶振4MHz

#include<pic.h>

#define uchar unsigned char

#define uint unsigned int

__CONFIG(0X3B31)

//uint initnum,Speed,motor//定义一个溢出中饥哪断的变量

void delay_ms(uint z)

{

uint x,y

for(x=zx>0x--)

for(y=100y>0y--)

}

void init()//初始化接LED的RD端口为输出,及设置OPTION寄存器关闭TMR0定时计时器

{

TRISC0=0

TRISC1=1

TRISC2=1

TRISC3=0

TRISC4=0

RC0=0

RC1=1

RC2=1

RC3=0

RC4=0

/烂野码*

TRISD=0//输出状态

INTCON=0xc0//设置中断控制寄存器为11000000,始终只用到两个位开总中断,开第二外设允许中断

PIE1=0x02//使能定时器1为00000010开中断,始终只用一最后一个其他的不用理会

PR2=200//装初值,定时器2是8位的寄存器有256个数但是可以设定一个周期寄存器到了就可以溢出,如果不设周期寄存器就为256溢出,初值56则200us溢出

TMR2=0//这样用PR2表示初值,在中断函数中就不用加初值了51的模式2中,THn是下限,也就是开始计时的值;PIC中的PR2是上限,也就是计时到这个值就归零

T2CON=0x04//设置预分频器和后分频器就是开始启到动定时器2这里都是1:1的比例

// T2CON=0x05//设置预分频器1:4和后分频器就是开始启到动定时器2这时候的时间是乘以后4倍,原本以200us产生一次中断现在则以800us产生一次中断,即800*1000的时间闪动

// T2CON=0x0d//设置预分频器1:4和后分频器1:2就是开始启到动定时器2这时候的时间是乘以后4倍,再乘以2倍,原本以200us产生一次中断现在则以1600us产生一次中断即1600*1000的时间闪动

// PR2=100设置周期寄存器,值设为100,到了就溢出,同时要将其脊稿初值设置为零才够精确

*/

}

void delay_us(uint i)//1表示100us,2表示200us

{

uint a,b

for(a=ia>0a--)

{

for(b=7b>0b--)

}

}

/*

void pwm()

{

uchar pwm=10,h=20//要输出pwm500hz的频率脉宽是2ms

while(1)

{

RC3=1

delay_us(pwm)

RC3=0

delay_us(h-pwm)

if(RC2==1)//加上这两句就可以退出了

break

}

}*/

void main()

{

uchar aa,pwm=10,h=20

init()

while(1)////判断按键状态////长按可以调光

{

if(RC2==0)//判断RC2按下

{

delay_ms(10)

while(!RC2)

{

for(aa=0aa<255aa++)//当前输出延时一段时间,这样才能看出速度的变化

{

RC3=1

delay_us(pwm)

RC3=0

delay_us(h-pwm)

}

if(++pwm >19)

pwm = 10

}

}

else

{

RC3=0

}

}

}

/*

void go(uint motor1)//电机的速度参数

{

Speed=motor1//给电机速度参数赋速度参数的变量

motor=0x64+Speed//0x64为100在中间加上速度参数

}

void interrupt time0()//定时器的程序,后面不用写和51单片机那样的序号,也不用就算写在主函数的后面也不用声明

{ //51的模式2中,THn是下限,也就是开始计时的值;PIC中的PR2是上限,也就是计时到这个值就归零

TMR2IF=0//先清零,

TMR2=0

initnum++//加一

if(initnum<motor)

{

RC3=1

RC4=0

}

else

{

RC3=0

RC4=1

}

if(initnum==0xc8)//判断值加1是否不等于200

{

initnum=0

}

}

*/


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存