PIC单片机C语言编程实例一.docx

上传人:b****2 文档编号:1729776 上传时间:2023-05-01 格式:DOCX 页数:19 大小:20.63KB
下载 相关 举报
PIC单片机C语言编程实例一.docx_第1页
第1页 / 共19页
PIC单片机C语言编程实例一.docx_第2页
第2页 / 共19页
PIC单片机C语言编程实例一.docx_第3页
第3页 / 共19页
PIC单片机C语言编程实例一.docx_第4页
第4页 / 共19页
PIC单片机C语言编程实例一.docx_第5页
第5页 / 共19页
PIC单片机C语言编程实例一.docx_第6页
第6页 / 共19页
PIC单片机C语言编程实例一.docx_第7页
第7页 / 共19页
PIC单片机C语言编程实例一.docx_第8页
第8页 / 共19页
PIC单片机C语言编程实例一.docx_第9页
第9页 / 共19页
PIC单片机C语言编程实例一.docx_第10页
第10页 / 共19页
PIC单片机C语言编程实例一.docx_第11页
第11页 / 共19页
PIC单片机C语言编程实例一.docx_第12页
第12页 / 共19页
PIC单片机C语言编程实例一.docx_第13页
第13页 / 共19页
PIC单片机C语言编程实例一.docx_第14页
第14页 / 共19页
PIC单片机C语言编程实例一.docx_第15页
第15页 / 共19页
PIC单片机C语言编程实例一.docx_第16页
第16页 / 共19页
PIC单片机C语言编程实例一.docx_第17页
第17页 / 共19页
PIC单片机C语言编程实例一.docx_第18页
第18页 / 共19页
PIC单片机C语言编程实例一.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

PIC单片机C语言编程实例一.docx

《PIC单片机C语言编程实例一.docx》由会员分享,可在线阅读,更多相关《PIC单片机C语言编程实例一.docx(19页珍藏版)》请在冰点文库上搜索。

PIC单片机C语言编程实例一.docx

PIC单片机C语言编程实例一

第5章PIC16F877的外围功能模块

5.1.2简单应用实例

该例用于令与PORTD口相连的8个发光二极管前4个点亮,后4个熄灭。

在调试程序前,应使与PORTD口相连的8位拔码开关拔向相应的位置。

例5.1PORTD输出

#include

main()

{

TRISD=0X00;/*TRISD寄存器被赋值,PORTD每一位都为输出*/

while

(1);/*循环执行点亮发光二极管的语句*/

{

PORTD=0XF0;/*向PORTD送数据,点亮LED(由实验模板*/

/*的设计决定相应位置低时LED点亮)。

*/

}

}

5.2.1MSSP模块SPI方式功能简介

下面是一段简单的SPI初始化例程,用于利用SPI工作方式输出数据的场合。

例5.2SPI初始化程序

/*spi初始化子程序*/

voidSPIINIT()

{

PIR1=0;/*清除SPI中断标志*/

SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/

SSPSTAT=0xC0;

TRISC=0x00;/*SDO引脚为输出,SCK引脚为输出*/

}

5.2.3程序清单

下面给出已经在实验板上调试通过的一个程序,可作为用户编制其它程序的参考。

#include

/*该程序用于在8个LED上依次显示1~8等8个字符*/

staticvolatileinttable[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

volatileunsignedchardata;

#definePORTAIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/

staticbitPORTA_5@PORTAIT(PORTA,5);

/*spi初始化子程序*/

voidSPIINIT()

{

PIR1=0;

SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/

SSPSTAT=0xC0;

TRISC=0x00;/*SDO引脚为输出,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

voidinitial()

{

TRISA=0x00;/*A口设置为输出*/

INTCON=0x00;/*关闭所有中断*/

PORTA_5=0;/*LACK送低电平,为锁存做准备*/

}

/*SPI发送子程序*/

voidSPILED(intdata)

{

SSPBUF=data;/*启动发送*/

do

{

}while(SSPIF==0);/*等待发送完毕*/

SSPIF=0;/*清除SSPIF标志*/

}

/*主程序*/

main()

{

unsignedI;

initial();/*系统初始化*/

SPIINIT();/*SPI初始化*/

for(i=8;i>0;i--)/*连续发送8个数据*/

{

data=table[i];/*通过数组的转换获得待显示的段码*/

SPILED(data);/*发送显示段码显示*/

}

PORTA_5=1;/*最后给锁存信号,代表显示任务完成*/

}

5.3.3程序清单

下面给出已经在实验板上调试通过的程序,可作为用户编制其它程序的参考。

有关显示部分的SPI初始化,请读者参考5.2节。

#include

/*该程序用于按下相应的键时,在第一个8段LED上显示相应的1~4的字符*/

#definePORTAIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/

staticbitPORTA_5@PORTAIT(PORTA,5);

#definePORTBIT(adr,bit)((unsigned)(&adr)*8+(bit))/*绝对寻址位操作指令*/

staticbitPORTB_5@PORTBIT(PORTB,5);

staticbitPORTB_4@PORTBIT(PORTB,4);

staticbitPORTB_1@PORTBIT(PORTB,1);

staticbitPORTB_2@PORTBIT(PORTB,2);

unsignedintI;

unsignedcharj;

intdata;

/*spi初始化子程序*/

voidSPIINIT()

{

PIR1=0;

SSPCON=0x30;

SSPSTAT=0xC0;

TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

voidinitial()

{

TRISA=0xDF;

TRISB=0XF0;/*设置与键盘有关的各口的数据方向*/

INTCON=0x00;/*关闭所有中断*/

data=0X00;/*待显示的寄存器赋初值*/

PORTB=0X00;/*RB1RB2先送低电平*/

j=0;

}

/*软件延时子程序*/

voidDELAY()

{

for(i=6553;--i;)

continue;

}

/*键扫描子程序*/

intKEYSCAN()

{

while

(1)

{

if((PORTB_5==0)||(PORTB_4==0))

break;

}/*等待有键按下*/

DELAY();/*软件延时*/

if((PORTB_5==0)||(PORTB_4==0))

KEYSERVE();/*如果仍有键按下,则调用键服务子程序*/

elsej=0x00;/*如果为干扰,则令返回值为0*/

return(j);

}

/*键服务子程序*/

intKEYSERVE()

{

PORTB=0XFD;

if(PORTB_5==0)j=0X01;

if(PORTB_4==0)j=0X03;

PORTB=0XFB;

if(PORTB_5==0)j=0X02;

if(PORTB_4==0)j=0X04;/*以上根据按下的键确定相应的键值*/

PORTB=0X00;/*恢复PORTB的值*/

while

(1)

{

if((PORTB_5==1)&&(PORTB_4==1))break;/*等待键盘松开*/

}

return(j);

}

/*SPI发送子程序*/

voidSPILED(intdata)

{

SSPBUF=data;/*启动发送*/

do

{

}while(SSPIF==0);/*等待发送完毕

SSPIF=0;

}

/*主程序*/

main()

{

staticinttable[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

initial();/*系统初始化*/

SPIINIT();/*SPI初始化*/

while

(1)

{

KEYSCAN();

if(j!

=0)/*如果j=0,证明先前的按键为干扰,则不予显示*/

{

data=table[j];

PORTA_5=0;/*LACK信号清0,为锁存做准备*/

SPILED(data);

PORTA_5=1;/*最后给锁存信号,代表显示任务完成*/

}

}

}

5.4.1PORTB端口“电平变化中断”简介

例5.3PORTB口“电平变化中断”初始化子程序

/*B口“电平变化中断”初始化子程序*/

voidPORTBINT()

{

TRISB=0XF0;/*设置相应口的输入输出方式*/

OPTION=0x7F;/*B口弱上拉有效*/

PORTB=0X00;/*RB1,RB2先送低电平*/

RBIE=1;/*B口变位中断允许*/

PORTB=PORTB;/*读B口的值,以锁存旧值,为变位中断创造条件*/

}

5.4.3程序清单

下面给出一个调试通过的例程,以供读者参考。

有关显示的部分请读者参考前面章节。

该程序中寄存器的位都用头文件中定义的位,如RB5表示PORTB的第5位,而不像前面几节那样自己定义。

#include

/*该程序用于通过PORTB的"电平变化中断"进行键盘的识别。

*/

/*程序设置一个键值寄存器j,当按下S9键时j=1,按下S11键时*/

/*j=2,按下S10键时,j=3,按下S12键时j=4*/

unsignedchardata;

unsignedintI;

unsignedcharj;

constchartable[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0XD8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0x7f,0xbf,0x89,0xff};

/*B口“电平变化中断”初始化子程序*/

voidPORTBINT()

{

TRISB=0XF0;/*设置相应口的输入输出方式*/

OPTION=0x7F;

PORTB=0X00;/*RB1,RB2先送低电平*/

RBIE=1;/*B口变位中断允许*/

PORTB=PORTB;/*读B口的值,为变位中断创造条件*/

}

/*spi初始化子程序*/

voidSPIINIT()

{

PIR1=0;

SSPCON=0x30;

SSPSTAT=0xC0;

TRISC=0xD7;/*SDO引脚为输出,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

voidinitial()

{

TRISA=0xDF;

INTCON=0x00;/*关闭所有中断*/

data=0X00;/*待显示的寄存器赋初值*/

}

/*键服务子程序*/

voidKEYSERVE()

{

PORTB=0XFD;

if(RB5==0)j=0X01;

if(RB4==0)j=0X03;

PORTB=0XFB;

if(RB5==0)j=0X02;

if(RB4==0)j=0X04;/*以上通过逐行逐列扫描,以确定是何键按下*/

PORTB=0X00;/*恢复PORTB的值*/

}

/*软件延时子程序*/

voidDELAY()

{

for(i=6553;--i;)

continue;

}

/*SPI发送子程序*/

voidSPILED(intdata)

{

SSPBUF=data;/*启动发送*/

do

{

}while(SSPIF==0);

SSPIF=0;

}

voidIDEDIS()

{

KEYSERVE();/*进行键盘的识别*/

data=table[j];/*获得需要送出显示的段码*/

RA5=0;/*LACK信号清0,为锁存做准备*/

SPILED(data);

RA5=1;/*最后给一个锁存信号,代表显示任务完成*/

}

/*中断服务程序*/

voidinterruptkeyint(void)

{

DELAY();/*软件延时*/

if((RB5==0)||(RB4==0))/*该语句除了能够确认按键是否为干扰外,*/

/*还可以屏蔽一次键松开时引起的中断*/

IDEDIS();/*键识别和显示模块*/

PORTB=PORTB;/*读B口的值,改变中断发生的条件,避免键*/

/*一直按下时,连续进行键识别*/

RBIF=0;/*键扫描时可能会产生"电平变化"而使RBIF*/

/*置1,再清除一次RBIF以避免额外中断*/

}

main()

{

initial();/*系统初始化*/

PORTBINT();/*B口变位中断初始化*/

SPIINIT();/*利用SPI显示初始化*/

ei();/*总中断允许*/

while

(1)

{

}/*等待中断*/

}

5.5.2程序清单

下面给出一个调试通过的例程,可作为读者的参考。

调试该程序把模板J7上的短路跳针拔下,以免产生冲突。

#include

volatileunsignedchardata;

/*spi初始化子程序*/

voidSPIINIT()

{

PIR1=0;

SSPCON=0x30;/*SSPEN=1;CKP=0,FOSC/4*/

SSPSTAT=0xC0;

TRISC=0x10;/*SDI引脚为输入,SCK引脚为输出*/

}

/*系统各输入输出口初始化子程序*/

voidinitial()

{

TRISA=0x00;

TRISD=0x00;/*D口为输出方式*/

INTCON=0x00;/*关闭所有中断*/

}

/*SPI接收子程序*/

intSPIIN()

{

RA4=0;/*74HC165并行置数使能,将8位开关量置入器件*/

/*(LOAD为低电平时8位并行数据置入74HC165)*/

RA4=1;/*74HC165移位置数使能(LOAD为高电平时芯*/

/*片才能串行工作)*/

SSPBUF=0;/*启动SPI,此操作只用于清除SSPSTAT的

*BF位,因此W中的实际数据无关紧要*/

do{

}while(SSPIF==0);/*查询数据接收完毕否?

*/

SSPIF=0;

data=SSPBUF;

return(data);/*返回接收到的数据*/

}

/*把SPI接收的数据通过D口显示在8个发光二极管上的子程序*/

voidSPIOUT(intdata)

{

PORTD=~data;

}

/*主程序*/

main()

{

initial();/*系统初始化*/

SPIINIT();/*SPI初始化*/

while

(1)

{

SPIIN();/*SPI接收外部数据*/

SPIOUT(data);/*送出数据显示*/

}

}

5.6.1CCP模块的PWM工作方式简介

下面给出一个CCP模块设置为PWM操作时的初始化程序

例5.4CCP模块设置为PWM方式时的初始化程序

/*CCP1模块的PWM工作方式初始化子程序*/

voidCCP1INIT()

{

CCPR1L=0X7F;

CCP1CON=0X3C;/*设置CCP1模块为PWM工作方式,且其工作循环

*的低2位为11,高8位为01111111=7F*/

INTCON=0X00;/*禁止总中断和外围中断*/

PR2=0XFF;/*设置PWM的工作周期*/

TRISC=0XFB;/*设置CCP1引脚为输出方式*/

}

该初始化子程序设置CCP1模块输出分辨率为10位的PWM波形,且占空比为50%。

5.6.3程序清单

下面给出一个调试通过的例程,可作为读者编制程序的参考。

#include

/*该程序用于使CCP1模块产生分辨率为10位的PWM波形,占空比为50%*/

/*CCP1模块的PWM工作方式初始化子程序*/

voidCCP1INIT()

{

CCPR1L=0X7F;

CCP1CON=0X3C;/*设置CCP1模块为PWM工作方式,且其工作

*循环的低2位为11,高8位为01111111=7F*/

INTCON=0X00;/*禁止总中断和外围中断*/

PR2=0XFF;/*设置PWM的工作周期*/

TRISC=0XFB;/*设置CCP1引脚为输出方式*/

}

/*主程序*/

main()

{

CCP1INIT();/*CCP1模块的PWM工作方式初始化*/

T2CON=0X04;/*打开TMR2,且使其前分频为0,

*同时开始输出PWM波形*/

do

{

}while

(1);/*系统开始输出PWM波形。

如果系统是

*多任务的,则可以在此执行其它任务,而

*不会影响PWM波形的产生*/

}

5.7.3应用程序

2.程序清单

#include

/*此程序实现"看门狗"WDT的功能*/

unsignedlongI;

/*系统初始化子程序*/

voidinitial()

{

OPTION=0X0F;/*把前分频器分配给WDT,且分频倍率为1:

128*/

TRISD=0X00;/*D口设为输出*/

}

/*延时子程序*/

voidDELAY()

{

for(i=19999;--i;)

continue;

}

/*主程序*/

main()

{

initial();/*初始化,设定看门狗的相关寄存器*/

PORTD=0X00;/*D口送00H,发光二极管亮*/

DELAY();/*给予一定时间的延时*/

PORTD=0XFF;/*D口送FFH,发光二极管灭*/

while

(1)

{

}/*死循环,等待看门狗溢出复位*/

}

5.8.3程序清单

该例在PIC16F877休眠前使8个发光二极管的高4个发光,然后进入休眠工作方式;若按键引起的中断将其激活,则低4个发光。

用C语言编写程序时,语句SLEEP()相当于汇编语言中的语句“sleep”,使单片机进入休眠状态。

#include

/*该程序实现PIC16F877的休眠工作方式,并由实验板上的按键产生"电平变化中断"将其*从休眠状态中激活。

休眠与激活的状态由与D口相连的8个LED显示。

休眠时高4个

*LED发光,低4个LED熄灭;激活以后高4个LED熄灭,低4个LED发光*/

unsignedlongi;

/*系统初始化子程序*/

voidinitial()

{

di();/*全局中断禁止,"电平变化中断"只执行唤醒功能*/

RBIE=1;/*PORTB口电平变化中断允许*/

RBIF=0;/*清除B口电平变化中断标志*/

TRISB4=1;

TRISB5=1;

TRISB2=0;

TRISB1=0;/*设置与键盘有关的各I/O口的输入输出方式*/

TRISD=0X00;/*D口为输出*/

PORTB=0X00;/*键盘的行线送低电平,为“电平变化中断”作准备*/

PORTB=PORTB;/*读PORTB的值,锁存旧值,也为“电平变化

*中断”作准备*/

}

/*主程序*/

main()

{

initial();/*初始化*/

PORTD=0X0F;/*高4个LED灯亮*/

SLEEP();/*单片机开始进入休眠状态*/

PORTD=0XF0;/*激活后,低4个LED灯亮*/

while

(1)

{

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2