PIC单片机测试例程汇总.docx
- 文档编号:6576757
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:12
- 大小:140.74KB
PIC单片机测试例程汇总.docx
《PIC单片机测试例程汇总.docx》由会员分享,可在线阅读,更多相关《PIC单片机测试例程汇总.docx(12页珍藏版)》请在冰豆网上搜索。
PIC单片机测试例程汇总
目录:
一、端口的定义与while
(1)的使用
二、延时
1、通过语句延时程序(带参数)
2、通过语句延时程序(不带参数)
3、C程序延时时间计算
4、keil时间调试
三、外设
1、单按键检测与蜂鸣器发声(可控制发几声)
2、I2C端口模拟
3、DS18B20数字温度传感器(数码管显示)
-------------------------------------------------------------------------------
一、端口的定义与while
(1)的使用
#include "pic.h"
#defineucharunsignedchar//宏定义
#defineuint unsignedint//宏定义
__CONFIG(0x3B31);//定义配置字
voiddelay();//延时子函数
voidmain()
{
TRISA=0x00;
ADCON1=0xf7; //将PORTA和PORTE口作为IO用
PORTA=0x00;
while
(1)
{
RA5=1;//AN功能口电平不能改变
delay();
RA5=0;
delay();
}
}
voiddelay()
{
uinta;//定义局部变量
for(a=10;a>0;a--){}
}
//PORTA和PORTE口作为IO用的定义
//While
(1)在这里作为一个大循环用,如果后面加“;”号,则程序将停在While
(1)不往下执行。
-----------------------------------------------------------------------------------------------------------------
二、延时
1、通过语句延时程序(带参数)
#include "pic.h"
#defineucharunsignedchar//宏定义
#defineuint unsignedint//宏定义
__CONFIG(0x3B31);//定义配置字
voiddelay(uintx);//声明子函数
voidmain()
{
TRISD2=0;
while
(1)
{
RD2=1;
delay(5);//可以改变程序延时时间,当前5.04mS
RD2=0;
delay(5);//可以改变程序延时时间,当前5.04mS
}
}
voiddelay(uintx)//4M晶振
{
uinta,b;
for(a=x;a>0;a--)//完整嵌套如下
{
for(b=110;b>0;b--)
{
};//分号加亦可,不加亦可
};//分号加亦可,不加亦可
}
//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次
-----------------------------------------------------------
2、通过语句延时程序(不带参数)
#include "pic.h"
#defineucharunsignedchar//宏定义
#defineuint unsignedint//宏定义
__CONFIG(0x3B31);//定义配置字
voiddelay();//声明子函数
voidmain()
{
TRISD2=0;
while
(1)
{
RD2=1;
delay();//延时1.05mS
RD2=0;
delay();//延时1.05mS
}
}
voiddelay()//4M晶振
{
uinta,b;
for(a=10;a>0;a--)//for嵌套
for(b=10;b>0;b--);
}
//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次
-----------------------------------------------------------
3、C程序延时时间计算
voiddelay()
{
uinti;
for(i=0;i<20000;i++);
}
我们怎么来算呢,先将20000转成16进制,得到4E20,然后将高字节4E乘以6得到十进制468,再将468+2=470,然后将十进制470*十六进制20(即十进制32)=15040;所心这个延时函数总共要执行15040个周期,假设所用的晶振为12MHZ,则该段函数总延时:
15.04ms。
有了这个公式我们如果想要设定指定的延时长度就可以用它的己知公式确定。
即:
总时间=[(6*i值的高8位)+2]*i的低8位。
例如:
设要延时125ms。
我们将低字节先赋值十进制200*(即:
C8),然后再算高低节的定值,由式中可知125ms=200*((i值的高字节*6)+2),又可推算出(高低节*6)+2的总延迟时间应等于625us,将625/6=104.1666,取整数得到104,将104转成16进制得到68H,再将高字节和低字节组合起来即得到了定值,即:
十六进制68C8,代入函数即如下:
voiddelay()
{
uinti;
for(i=0;i<0x68C8;i++);
}
如果写十进制就要将68C8转成10进制,即:
26824,代入后得到:
voiddelay()
{
uinti;
for(i=0;i<26824;i++);
}
-----------------------------------------------------------
4、keil时间调试
第一步:
选择单片机晶振
第二步:
全编译
第三步:
按d进入软件调试
第四步:
进入程序设置两个断点:
第五步:
按全速运行至第一个断点:
注意时间是0.000389s
第六步:
再按一次全速运行至第二个断点:
注意时间是1.013412s
-----------------------------------------------------------------------------------------------------------------
三、外设
1、单按键检测与蜂鸣器发声(可控制发几声)
#include "pic.h"
#defineucharunsignedchar//宏定义
#defineuint unsignedint//宏定义
__CONFIG(0x3B31);//定义配置字
/////////////////////////////////////////////////
voidBuzz(ucharnum);//蜂鸣器发声子函数
voiddelay(uintx);//延时子函数
voidscan();//按键扫描子函数
/////////////////////////////////////////////////
voidmain()
{
TRISB=0xff;
TRISE0=0;
RE0=0;
while
(1)
{
scan();//扫描按键蜂鸣器发声
}
}
/////////////////////////////////////////////////
voidscan()
{
if(RB0==0)
{
delay(10);
if(RB0==0)
{
while(!
RB0)
{
Buzz
(2);//发两声
}
}
}
}
/////////////////////////////////////////////////
voidBuzz(ucharnum)
{
ucharBuzz_num;
for(Buzz_num=num;Buzz_num>0;Buzz_num--)
{
RE0=1;
delay(50);
RE0=0;
delay(20);
}
}
/////////////////////////////////////////////////
voiddelay(uintx)//4M晶振
{
uinta,b;
for(a=x;a>0;a--)//完整嵌套如下
{
for(b=110;b>0;b--)
{
};//分号加亦可,不加亦可
};//分号加亦可,不加亦可
}
-----------------------------------------------------------
2、I2C端口模拟
#include "pic.h"
#defineucharunsignedchar//宏定义
#defineuint unsignedint//宏定义
__CONFIG(0x3B31);//定义配置字
uchara;
#definesdaRC1
#definesclRC2
////////////////////////////////////////////////子函数声明
voidstart(); //开始信号
voidstop(); //停止
voidrespons(); //应答
voidinit();
voidwrite_byte(uchardate);//写一个字节
ucharread_byte(); //读一个字节
voidwrite_add(ucharaddress,uchardate);//写任意字节
ucharread_add(ucharaddress); //读任意字节
voiddelay();
voiddelay1(ucharx);
////////////////////////////////////////////////主函数
voidmain()
{
init();
write_add(23,0xaa);
delay1(100);
PORTB=read_add(23);
while
(1);
}
////////////////////////////////////////////////
voidstart() //开始信号
{
TRISC=0x00;
TRISB=0x00;
sda=1;
delay();
scl=1;
delay();
sda=0;
delay();
}
////////////////////////////////////////////////
voidstop() //停止
{
sda=0;
delay();
scl=1;
delay();
sda=1;
delay();
}
////////////////////////////////////////////////
voidrespons() //应答
{
uchari;
scl=1;
delay();
while((sda==1)&&(i<250))i++; //防止死循环
scl=0;
delay();
}
////////////////////////////////////////////////
voidinit()
{
sda=1;
delay();
scl=1;
delay();
}
////////////////////////////////////////////////
voidwrite_byte(uchardate)
{
ucharbit_count;
for(bit_count=0;bit_count<8;bit_count++)
{
if((date< delay(); scl=1; delay(); scl=0; } delay(); sda=1; delay(); } //////////////////////////////////////////////// ucharread_byte() { uchari,k; scl=0; delay(); sda=1; delay(); for(i=0;i<8;i++) { scl=1; delay(); k=(k<<1)|sda; scl=0; delay(); } returnk; //带返回值 } //////////////////////////////////////////////// voidwrite_add(ucharaddress,uchardate) { start(); write_byte(0xa0); //器件地址写操作 respons(); write_byte(address); //要写数据的地址 respons(); write_byte(date); //要写的数据 respons(); stop(); } //////////////////////////////////////////////// ucharread_add(ucharaddress) { uchardate; start(); write_byte(0xa0); //器件地址写操作 respons(); write_byte(address); //要写数据的地址 respons(); start(); write_byte(0xa1); //器件地址读操作 respons(); date=read_byte(); //读一个字节放入date stop(); returndate; } //////////////////////////////////////////////// voiddelay() {;;} //////////////////////////////////////////////// voiddelay1(ucharx) { uchara,b; for(a=x;a>0;a--) for(b=100;b>0;b--); } ----------------------------------------------------------- 3、DS18B20数字温度传感器(数码管显示) #include "pic.h" #defineucharunsignedchar #defineuint unsignedint #defineDQRC1 //定义一个端口 #defineDQ_HIGH()TRISC1=1 #defineDQ_LOW()TRISC1=0;DQ=0 __CONFIG(0x3B31); constuchartable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f}; constuchartable1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd, 0x87,0xff,0xef}; uinttemper; uchara1,a2,a3,a4; voiddelay(uintx); voiddelayus(uint,uchar); voidinit(); voiddisp(ucharnum1,ucharnum2,ucharnum3,ucharnum4); voidwrite_byte(uchardate); ucharread_byte(); voidget_tem(); voidmain() { init(); while (1) { // ucharnum; get_tem(); // for(num=20;num>0;num--) // disp(a1,a2,a3,a4); } } voidreset() { ucharst=1; DQ_HIGH(); NOP();NOP(); while(st) { DQ_LOW(); delayus(70,30); DQ_HIGH(); delayus(4,4); if(DQ==1) st=1; else st=0; delayus(50,10); } } voidwrite_byte(uchardate) { uchari,temp; DQ_HIGH(); NOP();NOP(); for(i=8;i>0;i--) { temp=date&0x01;//01010101 DQ_LOW(); delayus(0,0); if(temp==1) DQ_HIGH(); delayus(2,2); DQ_HIGH(); date=date>>1;//00101010 } } ucharread_byte() { uchari,date; staticbitj; //定义一位 for(i=8;i>0;i--) { date=date>>1; DQ_HIGH(); NOP();NOP(); DQ_LOW(); NOP();NOP();NOP();NOP();NOP();NOP(); DQ_HIGH(); NOP();NOP();NOP();NOP(); j=DQ; if(j==1) date=date|0x80;//10000000 delayus(1,1); } return(date); } voidget_tem() { uchartem1,tem2,num; floataaa; reset(); //复位 write_byte(0xCC);//跳过ROM write_byte(0x44);//温度转换 for(num=100;num>0;num--) disp(a1,a2,a3,a4); reset(); write_byte(0xCC); write_byte(0xBE); tem1=read_byte(); tem2=read_byte(); aaa=(tem2*256+tem1)*6.25;//此处的结果为浮点数 temper=(int)aaa; //强制转换成整型送入temper a1=temper/1000; a2=temper00/100; a3=temper0/10; a4=temper; } voiddelayus(uintx,uchary) { uinti; ucharj; for(i=x;i>0;i--); for(j=y;j>0;j--); } voiddelay(uintx) { uinta,b; for(a=x;a>0;a--) for(b=110;b>0;b--); } voidinit() { TRISD=0; TRISA=0; PORTD=0; PORTA=0; } voiddisp(ucharnum1,ucharnum2,ucharnum3,ucharnum4) { PORTD=table[num1];//显示第一个数码管 PORTA=0x20;//00100000 delay (2); PORTD=table1[num2];//显示第二个数码管 PORTA=0x10;//00010000 delay (2); PORTD=table[num3];//显示第三个数码管 PORTA=0x08;//00001000 delay (2); PORTD=table[num4];//显示第四个数码管 PORTA=0x04;//00000100 delay (2); } -----------------------------------------------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PIC 单片机 测试 例程 汇总