单片机练习Word文档格式.docx
- 文档编号:17553313
- 上传时间:2022-12-07
- 格式:DOCX
- 页数:13
- 大小:17.69KB
单片机练习Word文档格式.docx
《单片机练习Word文档格式.docx》由会员分享,可在线阅读,更多相关《单片机练习Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
while
(1);
}
voidinterruptINT_SER(void)
{staticcharN=0;
//定义静态变量N,每次退出中断程序返回主程序时,N保留数值
if(T0IF==1)
{T0IF=0;
TMR0=T0_50MS;
//TMR0再赋初值,必须!
N++;
if(N>
=10)
{N=0;
PORTC=PORTC<
<
1;
if(PORTC==0)
PORTC=0b00000001;
//C口再赋初值,必须!
且不可为任意值,当程序中为左移时,此处必须为0b00000001!
}
}
//用TMR0延时中断,控制8盏LED等,间隔12ms循环点亮
#defineT0_12MS69
//定义C口为输出口
OPTION_REG=0b11010101;
//TMR0对内部时钟计数,预分频器给TMR0,分频比为1:
64,其余无关的位均取复位值1
TMR0=T0_12MS;
PORTC=0b10000000;
//C口赋初值,任意一位为1均可,对应任意一盏点亮
{if(T0IF==1)
//清TMR0溢出中断标志位
TMR0=T0_12MS;
//TMR0重新赋初值,必须!
PORTC=PORTC<
//C口各位左移1位
if(PORTC==0)
PORTC=0b00000001;
//C口重新赋初值,左移的情况下必须为0b00000001!
//在0310例子八盏灯单灯移位的基础上,改为双灯移位。
TMR0,中断
//
//
PORTC=0b11000000;
PORTC=PORTC>
>
if(PORTC==0)//这一句可删除
PORTC=0b10000000;
//这一句可删除
elseif(PORTC==0b00000001)//如果删除前两句,此处改为if
PORTC=0b10000001;
elseif(PORTC==0b01000000)//注意!
此处可以写成0b1000000,但是绝对不要写成0b10000000
PORTC=0b11000000;
//仍为八盏灯双灯移位。
TMR0,与T0A.C程序不同的地方在于用的是查询的方法。
GIE=0;
while
(1)
{if(T0IF==1)
{T0IF=0;
TMR0=T0_12MS;
PORTC=PORTC>
PORTC=0b10000000;
elseif(PORTC==0b00000001)
PORTC=0b10000001;
elseif(PORTC==0b01000000)
PORTC=0b11000000;
};
//6MHz晶振,8盏灯单灯移位,间隔100mS,TMR1,中断方式
__CONFIG(0x3F3A);
#defineT1_100MS28036
T1CON=0b00100000;
GIE=1;
PEIE=1;
TMR1IE=1;
TMR1IF=0;
TMR1H=T1_100MS>
8;
TMR1L=T1_100MS;
TMR1ON=1;
{if(TMR1IF==1)
{TMR1IF=0;
TMR1H=T1_100MS>
TMR1L=T1_100MS;
//例2:
TMR1对RC0引脚来的外部脉冲计数,控制一盏LED闪亮,中断方式,每来10个脉冲中断一次
#defineAAA65536-10
#defineLEDRB0
{TRISB0=0;
TRISC0=1;
TMR1H=AAA>
TMR1L=AAA;
T1CON=0b00000011;
LED=1;
TMR1H=AAA>
TMR1L=AAA;
LED=!
LED;
//例1:
4M晶振,利用查询的方法,实现AD转换,采集通道为AN1、AN3、AN6
unsignedintAD_SUB(unsignedchar);
unsignedintAD[3];
{TRISA=0b00001010;
//A口对应AN1,AN3为输入
TRISE=0b00000010;
//E口对应AN6为输入
{AD[0]=AD_SUB
(1);
AD[1]=AD_SUB(3);
AD[2]=AD_SUB(6);
};
unsignedintAD_SUB(unsignedchark)
{unsignedchari;
ADCON1=0b10000000;
//设置ADCON1,参考电压VDD,VSS
ADCON0=0b01000001;
//设置ADCON0,AD转换时钟选择,AD模块使能
ADCON0=ADCON0|(k<
3);
//打开AD通道
for(i=0;
i<
3;
i++)NOP();
//延时20us左右,使输入电压对保持电容充电达到稳定
GO=1;
//启动AD转换
while(GO==1);
//等待AD转换结束
return((ADRESH<
8)+ADRESL);
4M晶振,利用中断的方法,实现A/D转换,采集通道为AN1,AN3,AN6
voidAD_SUB(unsignedchar);
voidDELAY(unsignedint);
unsignedcharN=0;
ADIE=1;
{AD_SUB
(1);
//调用AD子程序
DELAY(10);
//此处必须加一定时间的延时!
!
否则无法进入中断。
因为AD转换需要一定的时间
AD_SUB(3);
AD_SUB(6);
NOP();
voidAD_SUB(unsignedchark)
ADCON0=ADCON0|(k<
for(i=0;
//启动AD
//转换结束触发中断
{if(ADIF==1)
{ADIF=0;
AD[N]=(ADRESH<
8)+ADRESL;
//AD转换结果存入AD[N]
N=N+1;
=3)
N=0;
//======延时(n)ms,4M晶振
voidDELAY(unsignedintn)
{
unsignedintj;
chark;
for(j=0;
j<
n;
j++)
for(k=246;
k>
0;
k--)NOP();
//例3:
4M晶振,利用TMR0定时产生中断,每隔10ms,实现AD转换,采集通道为AN0
#defineT0_10MS100
voidinterruptAD_SUB(void);
volatileunsignedintADRESULT;
{TRISA=0b00000001;
//A口对应AN0为输入
//允许TMR0溢出中断
OPTION_REG=0b10000101;
//TMR0对内部时钟计数,预分频器给TMR0,分频比1:
64
TMR0=T0_10MS;
voidinterruptAD_SUB(void)
if(T0IF==1)
TMR0=T0_10MS;
//TMR0重赋初值
ADCON1=0b10000000;
ADCON0=0b01000001;
//设置ADCON0,AD转换时钟选择,AD模块使能,打开AD通道AN0
for(i=0;
GO=1;
while(GO==1);
ADRESULT=((ADRESH<
//4M晶振,利用按键产生中断,每次按下按键进行AD转换,采集通道为AN0
RB0=1;
//定义RB0为输入
OPTION_REG=0b11000000;
//B口上拉禁止,上升沿触发中断
INTE=1;
if(INTF==1)
{DELAY(500);
INTF=0;
voidDELAY(unsignedintn)
{unsignedintj;
for(j=0;
for(k=246;
CCP2通道捕捉功能,输入方波频率1kHz
//计算:
1kHz方波脉冲由CCP2输入,T=1000us,TMR1取1:
1分频
#defineLEDRC7
//定义易变型变量AAA存放捕捉当前值,AAA0存放上一次捕捉的结果,XXX为两次之间的间隔
volatileunsignedintAAA,AAA0=0,XXX;
{TRISC1=1;
TRISC7=0;
//定义C口RC1输入,RC7输出
CCP2CON=0b00000101;
//定义CCP2CON,0101每个上升沿捕捉
T1CON=0b00000001;
//定义定时器1预分频1:
1
CCP2IE=1;
{if(CCP2IF)
{CCP2IF=0;
AAA=(CCPR2H<
8)+CCPR2L;
if(AAA>
AAA0)
XXX=AAA-AAA0;
else
{AAA0=~AAA0+1;
XXX=AAA0+AAA;
//两句等效XXX=(0-AAA0)+AAA;
}
//XXX为两次捕捉值的差值。
如果后一次捕捉瞬间定时器1当前值大于上一次的值,则直接减(大数-小数)。
//如果后一次小于上一次,则将上一次的值取反加一,再加上后一次的值(小数-大数)!
!
AAA0=AAA;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 练习