if(DeviceFlag == 0x55)
{
amount++;
switch(amount%2)
{
case 1: Command_Out =1; break;
case 0: Command_Out =0; break;
}
if(amount==8)//16*8=128ms
{
amount=0;
DeviceStatus = TurnOn;
DeviceFlag = 0xFF;
}
}
//发出波形的方式很多种,
1、可用两个定时器,第一用作定时占空比,并且执行一次就关闭,由另外一个定时器开启,另外一个定时器作为定时周期。
1 //----------发送命令变量----------------------------
2 static unsigned int current; //延时计数器
3 static unsigned char irdata_silent[]={0,1,0,1,2,0,1,0,1,2,0,1,0,1,2}; //kaiji指令
4 static unsigned char irdata_TurnOn[]={1,0,1,0,2,1,0,1,0,2,1,0,1,0,2};//guanji zhiling
5 /***************************************************************
6 *总体格式:静默指令(共三帧指令):0101 S 0101 S 0101 S(左移) ASASAS
7 * 开启指令(共三帧指令):1010 S 1010 S 1010 S(左移) 5S5S5S
8 *左移:0101,0x05,开;1010,0x0A,关;“S”代码(STOP):1mS高电平+9mS低电平
9 ***************************************************************/
10 void SendCommand(unsigned char data)
11 {
12 p_irdate = data;
13 switch(p_irdate)
14 {
15 case 0: Timer01_Init(); //1ms
16 Timer35_Init(); //5ms
17 break;
18 case 1: Timer04_Init(); //4ms
Timer35_Init(); //5ms
19 break;
20 case 2: Timer01_Init(); //1ms
21 Timer310_Init(); //10ms
22 break;
23 }
24 T0CONbits.TMR0ON = 1;
25 T3CONbits.TMR3ON = 1;
26 Command_Out = 1;
27 }
28 /*******************************
29 *中断处理函数
30 *******************************/
31 #pragma code high_vector=0x08
32 void interrupt_at_high_vector(void)
33 {
34 _asm goto high_isr _endasm
35 }
36 #pragma code
37
38 #pragma code low_vector=0x18
39 void interrupt_at_low_vector(void)
40 {
41 _asm goto low_isr _endasm
42 }
43 #pragma code
44
45 #pragma interrupt high_isr
46 void high_isr(void) //TMR0
47 {
48 if(INTCONbits.TMR0IF==1)
49 {
50 INTCONbits.TMR0IF=0;
51 Command_Out = !Command_Out;
52 mLED_1_Off();
53 T0CONbits.TMR0ON = 0;
54 }
55
56 }
57
58 #pragma interruptlow low_isr
59 void low_isr(void)
60 {
61 if(PIR2bits.TMR3IF==1)
62 {
63 PIR2bits.TMR3IF=0;
64 Command_Out = 1;
65 mLED_1_On();
66 current++;
67 if(current<15)
68 {
69 SendCommand(irdata_silent[current]);
70 }
71 else
72 {
73 current =0;
74 SendCommand(irdata_silent[current]);//
}
75 //T3CONbits.TMR3ON = 0;
76 //T0CONbits.TMR0ON = 1;
77 }
78 }
另外一种是用一个定时器,根据时间分段。
PIC18FXXXXX系列单片机的TMR0寄存器的读写编程技巧
TMR0工作原理:Timer0即可用作定时器亦可用作计数器;具体的模式由T0CS位(T0CON<5>)选择。在定时器模式下(T0CS=0),除非选择了不同的预分频值,否则,默认情况下在每个时钟周期该模块的计时都会递增。如果写入TMR0寄存器,那么在随后的两个指令周期内,计时将不再递增。用户可通过将校正后的值写入TMR0寄存器来解决上述问题。通过将T0CS位置1选择计数器模式。在计数器模式下,Timer0可在RA4/T0CKI引脚信号的每个上升沿或下降沿递增。触发递增的边沿Timer0时钟源边沿选择位T0SE(T0CON<4>)决定。清零此位选择上升沿递增。
TMR0的16位读写过程:TMR0H并不是16位模式下Timer0的高字节,而是Timer0高字节的缓冲寄存器,且不可以被直接读写。在读TMR0L时使用Timer0高字节的内容更新TMR0H.这样可以一次读取Timer0 的高16位,而无需验证读到的高字节和低字节的有效性(在高、低字节分两次连续读取的情况下,由于可能存在进位,因此需要验证读到字节的有效性)。同样,写入Timer0的高字节也是通过TMR0H缓冲寄存器来操作的。在写入TMR0L的同时,使用TMR0H的内容更新Timer0的高字节。这样一次就可以完成Timer0全部16位的更新。
TMR0的16位读写编程技巧(SP9608-PIC单片机增强型开发板)验证TMR0作为外部计数的程序段:
初始化:
T0CON=0X3F;将TMR0设置为16位的外部RA4/T0CKI计数功能
TMR0H=0;
TMR0L=0;
T0CONbit.TMR0ON=1;启动TMR0工作
读取TMR0寄存器中的内容,并合成到一个整形变量
Temp=TMR0L;
Temp=TMR0H;
Temp<<==8;
Temp|=TMR0L;
上一篇:使用TEMIC感应卡技术的智能电子门锁系统
下一篇:pic单片机计数
推荐阅读最新更新时间:2024-03-16 15:27
设计资源 培训 开发板 精华推荐
- 【 有奖直播】 掌握潮流~TI DLP®技术在汽车上的创新及全新应用
- 看视频赢京东卡 | 泰享实测之水哥秘籍第二期
- EEWorld 2018年度最具影响力网友评选
- 月度原创精选评选2018年7月(总第6期)
- 如何利用WEBENCH快速设计?
- 有奖直播:DIY 家用监控边缘 AI Box——基于 8TOPS 算力,售价 199 美元的开发套件搭建深度学习案例
- 报名Keysight感恩月,天天抽示波器、直流电源、万用表……
- 是德科技有奖直播:如何让你的Wi-Fi测试“兔”飞猛进?
- Keysight感恩月:每天送出一台示波器,一次注册即可参与
- TI 处理器主题月:三场直播精彩这个八月!报名且看直播就能得好礼!更有提问奖相送!