pic单片机timer0怎么用啊

pic单片机timer0怎么用啊,第1张

实例说明:

 假设时钟周期为4MHZ,每隔50MS点亮LED,每隔50MS灭掉LED。这样的程序要如何做到呢。

 这50ms如何做到

1,得到指令周期

  4MHz/4=1MHz

  1/1MHz=00000001s=1us

2,得到预分频

     定时器定时的最大时间要超过这50mS,所以预分频器要选择256

     预分频X256=最大的定时时间。256X256=65536us=65536ms 大于50ms

3,  计算定时器初始值

  (定时器最大值+1)- (定时时间/预分频)=定时器的初始值。

  255+1=256

  50000/256=1953125

  256-1953125=606875 四舍五入 定时器初始值为61

设置相关的寄存器。

OPTION_REG寄存器中我们一般需要设置三处。

PS<2:0>设置用来设置预分频预分频范围从2 ~256

PSA设置成0   讲预分频器分配给Timer0模块

TMR0CS设置成0 内部指令周期时钟。

实例程序:

/开发环境 MPLAB X IDE 型号PIC16LF1823/

#include<pich>  

__CONFIG(FOSC_INTOSC&WDTE_OFF&PWRTE_ON&MCLRE_OFF&CP_ON&CPD_OFF

                                                 &BOREN_ON&CLKOUTEN_OFF&IESO_ON&FCMEN_ON);

__CONFIG(PLLEN_OFF&LVP_OFF) ;

#define LED  LATA5/也可用 #define LED RA5,只是PIC16LF1823 输出电平的时候,直接控制LATA5执行速度更快,因为传给RA5的数据最终也是传给LATA5才执行的/

void init_fosc(void)

{

    OSCCON= 0x68;//时钟设置为4MHz

}

void init_gpio(void)

{

    PORTA = 0;

    LATA = 0;

    ANSELA = 0;

    TRISAbitsTRISA5=0; //RA5口设置成输出 用来控制LED

}

void init_timer0(void)

{

    OPTION_REG=0x87; //预分频为256

}

int main(int argc, char argv)

{

    init_fosc();

    init_gpio();

    init_timer0();

    TMR0IF=0;//清除TMR0中断标志位

    TMR0=61;//设置中断初始值61

    while(1)

    {

        if(TMR0IF==1)//定时时间到了吗??

        {

            LED = ~LED;//改变LED的状态

            TMR0IF=0;//清除TMR0中断标志位

            TMR0=61;//设置中断初始值61为下次50ms定时做准备

        }

    }

}

楼上的朋友的方法可以实现效果,但是个人认为将其中的PictureBox隐藏并不是很好的解决方案。我的方式是通过点击Pic2的时候,刷新Pic1,致使引发Pic1的Paint事件。然后通过一个Bool变量来判断是否需要进行绘制来达到效果。

public partial class Form1 : Form

{

public Form1()

{

InitializeComponent();

}

PictureBox picDraw1 = new PictureBox();

PictureBox picDraw2 = new PictureBox();

private void Form1_Load(object sender, EventArgs e)

{

picDraw1Size=new SystemDrawingSize(100,100);

picDraw1BackColor=ColorYellow;

picDraw1Paint += new PaintEventHandler(picDraw1_Paint);

picDraw2Size=new SystemDrawingSize(100,100);

picDraw2BackColor=ColorGray;

picDraw2Location = new Point(100, 0);

picDraw2Click += new EventHandler(picDraw2_Click);

thisControlsAdd(picDraw1);

thisControlsAdd(picDraw2);

}

bool isPic2Send = false;

void picDraw1_Paint(object sender, PaintEventArgs e)

{

if (isPic2Send)

{

eGraphicsDrawEllipse(new Pen(ColorGreen, 2), 10, 10, 30, 30);

}

}

void picDraw2_Click(object sender, EventArgs e)

{

isPic2Send = true;

picDraw1Refresh();

}

}

'先下载按键精灵第六版,主要是要引用按键精灵QMDispatchdll 里的函数

'解压缩后把目录下所有的dll档 复制到 C:\WINNT\system32下面

'开始 执行 输入regsvr32 C:\WINNT\system32\QMDispatchdll

'然后到vb里面 专案>设定引用项目

'打以下程式码,把要找的图 放在d:\ 档名用iconbmp

'找到会秀出座标,完成

'我在vb6 sp6下执行成功 没问题

Option Explicit

Private Declare Function FindPic Lib "QMDispatch" () As Long

Private Sub Command1_Click()

Dim pos As Long

Dim QMDispatchObj As Object

Set QMDispatchObj = CreateObject("QMDispatchQMFunction")

'参数 左, 上, 右, 下, 寻找的路径, 相似度

pos = QMDispatchObjFindPic(0, 0, 1280, 1024, "d:\iconbmp", 09)

MsgBox Int(pos / 8192) 'X左边

MsgBox pos Mod 8192 'Y左边

End Sub

以前做过类似 应该有效 你可以到按键论坛找新的DLL

没时间尝试了

从原理上来说,导入的应当是继承BitmapData类的,

也就是说Pic是BitmapData的一个子类

构造函数参数要跟BitmapData一样参数

BitmapData允许有4个参数, 但后两个可以省略不写

前两个参数代表的宽和高

也就是说你新建的pic的宽和高应该都是1

想看看结果是不是这样的话加上这些代码:

var _pic :Bitmap = new Bitmap(pic);

addChild(_pic);

然后测试,舞台左上角应该会显示一些东西的

以上就是关于pic单片机timer0怎么用啊全部的内容,包括:pic单片机timer0怎么用啊、C#中两个picturebox控件,完全重合,上面的透明,怎么能实现单击上面某处的可以在下面的相应位置画圆啊、vb里如何调用VBS findpic的例子 高手请教啊等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9846576.html

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

发表评论

登录后才能评论

评论列表(0条)

保存