PIC单片机-测试例程汇总

news2024/11/26 9:41:58
内容包括PIC单片机常用外设的测试例程。紫色文字是超链接,点击自动跳转至相关博文。持续更新,原创不易!
目录:
、端口的定义与while(1)的使用
二、延时
1、通过语句延时程序(带参数) 
2、通过语句延时程序(不带参数) 
3、C程序延时时间计算
4、keil时间调试
三、外设
1、单按键检测与蜂鸣器发声(可控制发几声)
2、I2C端口模拟 
3、DS18B20数字温度传感器(数码管显示)
-----------------------------------------

PIC单片机C语言之PIC16F887(4MhZ晶振)

-----------------------------------------------------------------------------------------------------------------

一、端口的定义与while(1)的使用

#include "pic.h"
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
__CONFIG(0x3B31);//定义配置字

void delay();//延时子函数
void main()
{
 TRISA=0x00;
 ADCON1=0xf7;     //将PORTA和PORTE口作为IO用
 PORTA=0x00;
    while(1)
   {
      RA5=1;//AN功能口电平不能改变
      delay();
      RA5=0;
      delay();
    }
}

void delay()
{
 uint a;//定义局部变量
 for(a=10;a>0;a--){ }
}

//PORTA和PORTE口作为IO用的定义
//While(1)在这里作为一个大循环用,如果后面加“;”号,则程序将停在While(1)不往下执行。

-----------------------------------------------------------------------------------------------------------------

二、延时

1、通过语句延时程序(带参数) 

#include "pic.h"
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
__CONFIG(0x3B31);//定义配置字

void delay(uint x);//声明子函数
void main()
{
 TRISD2=0;
        while(1)
 {
  RD2=1;
  delay(5);//可以改变程序延时时间,当前5.04mS
  RD2=0;
  delay(5);//可以改变程序延时时间,当前5.04mS
 }
}

void delay(uint x)//4M晶振
{
 uint a,b;
 for(a=x;a>0;a--)//完整嵌套如下
 {
     for(b=110;b>0;b--)
  {
  };//分号加亦可,不加亦可
 };//分号加亦可,不加亦可
}
//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次

-----------------------------------------------------------

2、通过语句延时程序(不带参数) 

#include "pic.h"
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
__CONFIG(0x3B31);//定义配置字

void delay();//声明子函数
void main()
{
 TRISD2=0;
        while(1)
 {
  RD2=1;
  delay();//延时1.05mS
  RD2=0;
  delay();//延时1.05mS
 }
}

void delay()//4M晶振
{
 uint a,b;
 for(a=10;a>0;a--)//for嵌套
    for(b=10;b>0;b--);
}
//在延时程序的前后两个地方设置断点(Breakpoints),再打开Stopwatch,然后全速运行两次

-----------------------------------------------------------

3、C程序延时时间计算
void delay()
{
        uint i;
        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,代入函数即如下:

void delay()
{
        uint i;
        for(i=0;i<0x68C8;i++);
}
如果写十进制就要将68C8转成10进制,即:26824,代入后得到:
void delay()
{
        uint i;
        for(i=0;i<26824;i++);

}

-----------------------------------------------------------

4、keil时间调试

第一步:选择单片机晶振

第二步:全编译

第三步:按d进入软件调试

第四步:进入程序设置两个断点:

第五步:按全速运行至第一个断点:注意时间是0.000389s

第六步:再按一次全速运行至第二个断点:注意时间是1.013412s

-----------------------------------------------------------------------------------------------------------------

三、外设

1、单按键检测与蜂鸣器发声(可控制发几声)

#include "pic.h"
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
__CONFIG(0x3B31);//定义配置字
/
void Buzz(uchar num);//蜂鸣器发声子函数
void delay(uint x);//延时子函数
void scan();//按键扫描子函数
/
void main()
{
 TRISB=0xff;
 TRISE0=0;
 RE0=0;
    while(1)
 {
  scan();//扫描按键蜂鸣器发声
   }
}
/
void scan()
{
 if(RB0==0)
 {
  delay(10);
  if(RB0==0)
  {
   while(!RB0)
   {
    Buzz(2);//发两声
   }
  }
 }
}

/
void Buzz(uchar num)
{
 uchar Buzz_num;
 for(Buzz_num=num;Buzz_num>0;Buzz_num--)
 {
  RE0=1;
  delay(50);
  RE0=0;
  delay(20);
 }
}
/
void delay(uint x)//4M晶振
{
 uint a,b;
 for(a=x;a>0;a--)//完整嵌套如下
 {
     for(b=110;b>0;b--)
  {
  };//分号加亦可,不加亦可
 };//分号加亦可,不加亦可
}
-----------------------------------------------------------

2、I2C端口模拟

#include "pic.h"
#define uchar unsigned char//宏定义
#define uint  unsigned int//宏定义
__CONFIG(0x3B31);//定义配置字
uchar a;
#define sda RC1
#define scl RC2
子函数声明
void start();    //开始信号
void stop();     //停止
void respons();  //应答
void init();
void write_byte(uchar date); //写一个字节
uchar read_byte();           //读一个字节
void write_add(uchar address,uchar date); //写任意字节
uchar read_add(uchar address);            //读任意字节
void delay();
void delay1(uchar x);
主函数
void main()
{
 init();
 write_add(23,0xaa);
 delay1(100);
 PORTB=read_add(23);
 while(1);
}

void start()  //开始信号
{
  TRISC=0x00;
  TRISB=0x00;
  sda=1;
  delay();
  scl=1;
  delay();
  sda=0;
  delay();
}

void stop()   //停止
{
 sda=0;
 delay();
 scl=1;
 delay();
 sda=1;
 delay();
}

void respons()  //应答
{
 uchar i;
 scl=1;
 delay();
 while((sda==1)&&(i<250))i++;      //防止死循环
 scl=0;
 delay();
}

void init()
{
 sda=1;
 delay();
 scl=1;
 delay();
}

void write_byte(uchar date)
{
       uchar bit_count;
       for (bit_count=0;bit_count<8;bit_count++)
       {
                if ((date<<bit_count)&0x80) {sda=1;}
                     delay();                     
              scl=1;            
              delay();
              scl=0;
        }
 delay();
 sda=1;
 delay();
}

uchar read_byte()
{
 uchar i,k;
 scl=0;
 delay();
 sda=1;
 delay();
 for(i=0;i<8;i++)
 {
  scl=1;
  delay();
  k=(k<<1)|sda;
  scl=0;
  delay();
 }
 return k;         //带返回值
}

void write_add(uchar address,uchar date)
{
 start();
 write_byte(0xa0);       //器件地址 写操作
 respons();
 write_byte(address);    //要写数据的地址
 respons();
 write_byte(date);       //要写的数据
 respons();
 stop();
}

uchar read_add(uchar address)
{
 uchar date;
 start();
 write_byte(0xa0);      //器件地址 写操作
 respons();
 write_byte(address);   //要写数据的地址
 respons();
 start();
 write_byte(0xa1);      //器件地址 读操作
 respons();
 date=read_byte();      //读一个字节放入date
 stop();
 return date;
}

void delay()
{ ;; }

void delay1(uchar x)
{
 uchar a,b;
 for(a=x;a>0;a--)
  for(b=100;b>0;b--);
}
-----------------------------------------------------------

3、DS18B20数字温度传感器(数码管显示)

#include "pic.h"
#define uchar unsigned char
#define uint  unsigned int
#define DQ RC1   //定义一个端口
#define DQ_HIGH() TRISC1=1
#define DQ_LOW() TRISC1=0;DQ=0
__CONFIG(0x3B31);
const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f};
const uchar table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
                        0x87,0xff,0xef};
uint temper;
uchar a1,a2,a3,a4;
void delay(uint x);
void delayus(uint,uchar);
void init();
void disp(uchar num1,uchar num2,uchar num3,uchar num4);
void write_byte(uchar date);
uchar read_byte();
void get_tem();
void main()
{
 init();
 while(1)
 {

 // uchar num;
  get_tem();
 // for(num=20;num>0;num--)
 //  disp(a1,a2,a3,a4);
 } 
}
void reset()
{
 uchar st=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);
 }
}
void write_byte(uchar date)
{
 uchar i,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
 }
}
uchar read_byte()
{
 uchar i,date;
 static bit j;  //定义一位
 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;//1000 0000
  delayus(1,1);
 }
 return (date);
}

void get_tem()
{
 uchar tem1,tem2,num;
 float aaa;
 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;
}
void delayus(uint x,uchar y)
{
 uint i;
 uchar j;
 for(i=x;i>0;i--);
 for(j=y;j>0;j--);
}
void delay(uint x)
{
 uint a,b;
 for(a=x;a>0;a--)
  for(b=110;b>0;b--);
}
void init()
{
 TRISD=0;
 TRISA=0;
 PORTD=0;
 PORTA=0;
}
void disp(uchar num1,uchar num2,uchar num3,uchar num4)
{
 PORTD=table[num1];//显示第一个数码管
 PORTA=0x20;//0010 0000
 delay(2);
 PORTD=table1[num2];//显示第二个数码管
 PORTA=0x10;//0001 0000
 delay(2);
 PORTD=table[num3];//显示第三个数码管
 PORTA=0x08;//0000 1000
 delay(2);
 PORTD=table[num4];//显示第四个数码管
 PORTA=0x04;//0000 0100
 delay(2);
}

-----------------------------------------------------------------------------------------------------------------

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/13064.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

N3-PEG-NHS,Azide-PEG-NHS,叠氮-聚乙二醇-活性酯可用来修饰蛋白质

一、详情介绍 1、名称 英文&#xff1a;N3-PEG-NHS&#xff0c;Azide-PEG-NHS 中文&#xff1a;叠氮-聚乙二醇-活性酯 2、描述 Azide-PEG-NHS的分子量&#xff1a;Azide-PEG-NHS 1k&#xff0c;叠氮-聚乙二醇-活性酯 2k&#xff0c;叠氮-PEG-活性酯 5k&#xff0c;N3-PEG-…

rr来debug你的C/C++程序(Linux)

如何用rr来debug你的C/C程序(Linux) 想象一下如果你的程序某时会崩溃&#xff0c;但是不能稳定复现&#xff0c;你会如何debug它? 用传统debugger面临的问题就是你不知道这次运行的时候能不能复现&#xff0c;你猜测可能某段代码出现了问题&#xff0c;所以进行了一番检查。…

柔性制造物料抓取及加工系统设计

目 录 摘 要 I Abstract II 1 绪论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3六自由度并联机器人介绍 3 1.4研究主要内容 6 1.4.1主要设计要求 6 1.4.2技术参数 7 2柔性制造物料抓取及加工系统的结构及工作原理 8 2.1 并联运动机构概述 8 2.2 六自由度并联加工机器人总…

LTR (Learning to Rank): 排序算法 poitwise, pairwise, listwise常见方案总结

目录1 Learing to Rank介绍2 The Pointwise Approach3 The Pairwise Approach3.1 RankNet4 The Listwise Approach4.1 直接优化评测指标4.1.1 LambdaRank4.1.2 LambdaMART4.2 定义Listwise损失函数4.2.1 ListNet4.2.2 ListMLE5 排序评估指标5.1 Mean Reciprocal Rank (MRR)5.2 …

46-文本编辑器及文本处理

46-文本编辑器及文本处理常见文本编辑器linux文本编辑器介绍Linux文本编辑器-emacsLinux文本编辑器-nanoLinux文本编辑器- geditLinux文本编辑器- keditLinux文本编辑器- viLinux文本编辑器- vim使用vim编辑器vim基础操作-打开文件vim基础操作-移动光标vim基础操作–数据操作vi…

解决——》CommunicationsException:Communications link failure

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 解决——》CommunicationsException:Communications link failure1、操作2、现象3、原因4、解决1&…

大一新生HTML期末作业 学生个人网页设计作业 HTML5响应式个人简历网站模板 web前端网页制作课作业

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

【linux】登录审计

linux登录审计 桥接模式配置互联 VMware的“虚拟网络编辑器” 输入’nm-connection-editor’&#xff0c;配置以太网 为以太网连接配置网卡 配置ipv4 互ping ssh远程登录 ssh -l 用户名 ip地址exit退出ssh远程 [alexalexw-device ~]$ ssh -l alex 1.1.1.2 The au…

数据挖掘——RFM客户价值模型及航空公司客户分析实例

引言 背景信息时代的来临使得企业营销焦点从产品转向了客户&#xff0c;客户的管理关系成为企业的核心问题。客户的关系管理问题是客户分群。通过客户分群&#xff0c;进而区分无价值客户和高价值客户。高价值客户代表他们的消费会给企业带来利益最大。企业需要针对不同类别的…

易基因|病毒抗性:全基因组DNA甲基化揭示草鱼年龄相关病毒易感性的表观遗传机制

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 2022年06月02日&#xff0c;淡水生态与生物技术国家重点实验室&#xff08;中国科学院水生生物研究所&#xff09;何利波副研究员为第一作者和通讯作者&#xff0c;汪亚平研究员为共同通…

智慧市政解决方案-最新全套文件

智慧市政解决方案-最新全套文件一、建设背景二、思路架构三、建设方案四、获取 - 智慧市政全套最新解决方案合集一、建设背景 随着中国经济的快速发展&#xff0c;城市化步伐不断加快&#xff0c;为了适应城市发展与管理的需求&#xff0c;解决城市市政管理过程中的问题&#…

PDPS软件:机器人控制输送带运行虚拟仿真操作方法

目录 概述 旋转台设备运动机构介绍 旋转台设备模型导入与安装 旋转台设备操作创建 机器人控制旋转台设备离线程序命令添加 仿真运行 概述 旋转台也是工业机器人生产线中常用的外围设备&#xff0c;工件安装在旋转台的夹紧机构上&#xff0c;旋转台通过旋转实现工作位置的…

【Linux】进程地址空间

文章目录一、前言二、什么是进程地址空间三、进程地址空间如何进行管理四、为什么会存在进程地址空间五、进程地址空间区域的严格划分一、前言 学习Linux系统编程一共要翻越三座大山 – 进程地址空间、文件系统以及多线程&#xff0c;这三部分内容很难但是非常重要&#xff1b…

[附源码]Python计算机毕业设计java高校社团管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

GitCode / 1024程序员开源挑战赛(10.23-11.14)

目录 csdn也有云计算了 这个挑战赛&#xff0c;主要是向大家宣布了&#xff0c;咱们csdn也有自己的云计算了&#xff01; 比较有特色的 云容器 云IDE 猿如意 也是有个有特色的工具&#xff0c;可以试用下。​编辑 问题 csdn也有云计算了 这个挑战赛&#xff0c;主…

0097 弗洛伊德算法,马踏棋盘算法

import java.util.Arrays; /* * 弗洛伊德算法 * 1.和迪杰斯特拉算法一样&#xff0c;弗洛伊德算法也是一种用于寻找给定的加权图中顶点间最短路径的算法 * 2.迪杰斯特拉算法用于计算图中某一顶点到其他顶点的最短路径 * 弗洛伊德算法计算图中各个顶点之间的最短路径 * …

IT就业专业为什么要选择大数据技术应用?

IT就业专业为什么要选择大数据技术应用&#xff1f;目前大数据领域从业人员的薪资高涨幅空间大&#xff0c;大数据人才供不应求。各大数据开发方向&#xff0c;数据挖掘、数据分析和机器学习方向&#xff0c;大数据运维和云计算方向。 一、大数据技术应用发展前景好&#xff1…

物联网协议MQTT

物联网协议MQTT 1.MQTT简介 MQTT(消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在 TCP/IP协议族上&#xff0c;是为硬件性能低下的远程设备以及网络状况糟糕的情况下而设计的发布/订阅型消息协议&#xff0c;为此&#xff0c;它需要一…

必考设计模式

文章目录一、单例模式&#xff08;创建型&#xff09;1、饿汉式2、懒汉式3、双重检验锁&#xff08;DCL&#xff09;4、sync.once实现单例二、工厂模式&#xff08;创建型&#xff09;1、简单工厂模式2、工厂方法模式3、抽象工厂模式&#xff08;暂时不写&#xff09;三、装饰模…

高通SDX12:SFE(shortcut-fe)软加速驱动效果调测

背景 USB转PHY RTL8153不支持高通IPA硬加速,所以采用SFE软加速 调试设备为基于Cat.6通信模组的整机 SFE软加速前:UXM环境实际测速100Mbps,设备内部sirq 87% SFE软加速驱动调测 SFE驱动代码路径:sdx12-ap\shortcut-fe\shortcut-fe SFE驱动编译文件路径:sdx12-ap\poky\m…