找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1369|回复: 3
打印 上一主题 下一主题
收起左侧

我用的是PIC16F873芯片为什么这样配置B口一直输出低电平呢?求大佬解答

[复制链接]
跳转到指定楼层
楼主
我用的是PIC16F873芯片为什么这样配置B口一直输出低电平呢?求大佬解答
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:342822 发表于 2020-9-21 12:51 | 只看该作者
不全用txt格式重发
回复

使用道具 举报

板凳
ID:712295 发表于 2020-9-21 17:12 | 只看该作者
taotie 发表于 2020-9-21 12:51
不全用txt格式重发

你好
请问能问一下PIC16F873的AD转换怎么算嘛
回复

使用道具 举报

地板
ID:155507 发表于 2020-9-21 17:41 | 只看该作者
我给你来个程序试试




  1. #include <pic.h>           //调用PIC16F87XA单片机的头文件

  2. //根据选项,配置字应该如下所示:
  3. //__CONFIG(HS&WRTEN&WDTDIS&BOREN&PWRTDIS&UNPROTECT&DUNPROT&DEBUGDIS&LVPDIS);

  4. //实际使用中,这样太麻烦,对于默认选项,我们将其忽略掉:
  5. __CONFIG(HS&WDTDIS&LVPDIS);

  6. //---------------------------------------
  7. //1602液晶相关I/O设置
  8. #define E   RB3            //1602液晶的E脚接在RB3口上
  9. #define RW  RB4            //1602液晶的RW脚接在RB4口上
  10. #define RS  RB5            //1602液晶的RS脚接在RB5口上
  11. //---------------------------------------

  12. //---------------------------------------
  13. //A/D转换用寄存器设置
  14. unsigned int ADbuf;    //10位A/D转换,设置16位的unsigend int型寄存器用来暂存A/D转换结果
  15. //---------------------------------------


  16. void Delay1602(unsigned int t)
  17. {
  18.      unsigned int k;      //定义一个16位寄存器用来做延时用
  19.      for(k=0;k<t;k++);    //延时
  20. }



  21. void LCD1602_busy(void)
  22. {
  23.      TRISD7=1;            //将RD7口设置为输入口,为读做准备
  24.      RS=0;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
  25.      RW=1;                //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
  26.      E=1;                 //RS=0、RW=1、E=1时,忙信号输出到DB7,由RD7读入
  27.      while(RD7==1);       //由RD7读入1,表示1602液晶忙,需要等待
  28.      E=0;                 //读完以后,恢复E的电平
  29.      TRISD7=0;            //将RD7口设置为输出口
  30. }



  31. void LCD1602_Write_com(unsigned char combuf)
  32. {
  33.      RS=0;                //选择指令寄存器
  34.      RW=0;                //选择写状态
  35.      PORTD=combuf;        //将命令字通过RD口送至DB
  36.      E=1;                 //E高电平将命令字写入1602液晶
  37.      asm("NOP");          //添加一个空操作,使高电平至少维持1us
  38.      E=0;                 //写完以后,恢复E的电平
  39. }



  40. void LCD1602_Write_com_busy(unsigned char combuf)
  41. {
  42.      LCD1602_busy();            //调用忙检测函数
  43.      LCD1602_Write_com(combuf); //调用忙检测函数
  44. }



  45. void LCD1602_Write_data_busy(unsigned char databuf)
  46. {
  47.      LCD1602_busy();      //调用忙检测函数
  48.      RS=1;                //选择数据寄存器
  49.      RW=0;                //选择写状态
  50.      PORTD=databuf;        //将命令字通过RD口送至DB
  51.      E=1;                 //E高电平将命令字写入1602液晶
  52.      asm("NOP");          //添加一个空操作,使高电平至少维持1us
  53.      E=0;                 //写完以后,恢复E的电平
  54. }



  55. void LCD1602_Write_address(unsigned char x,unsigned char y)
  56. {
  57.      x&=0x0f;             //列地址限制在0-15间
  58.      y&=0x01;             //行地址限制在0-1间
  59.      if(y==0)             //如果是第一行
  60.          LCD1602_Write_com_busy(x|0x80);        //将列地址写入
  61.      else                 //如果是第二行
  62.          LCD1602_Write_com_busy((x+0x40)|0x80); //将列地址写入
  63. }



  64. void LCD1602_init(void)
  65. {
  66.      Delay1602(1500);          //调用延时函数
  67.      LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  68.      Delay1602(500);           //调用延时函数
  69.      LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  70.      Delay1602(500);           //调用延时函数
  71.      LCD1602_Write_com(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  72.      LCD1602_Write_com_busy(0x38);  //8位数据总线,两行显示模式,5*7点阵显示
  73.      LCD1602_Write_com_busy(0x08);  //显示功能关,无光标
  74.      LCD1602_Write_com_busy(0x01);  //清屏
  75.      LCD1602_Write_com_busy(0x06);  //写入新的数据后,光标右移,显示屏不移动
  76.      LCD1602_Write_com_busy(0x0C);  //显示功能开,无光标
  77. }



  78. void LCD1602_Disp(unsigned char x,unsigned char y,unsigned char buf)
  79. {
  80.      LCD1602_Write_address(x,y);    //先将地址信息写入
  81.      LCD1602_Write_data_busy(buf);  //再写入要显示的数据
  82. }



  83. void main(void)            //主函数,单片机开机后就是从这个函数开始运行
  84. {

  85.     TRISA=0B11111111;      //初始化RA5-RA0的输入输出方向
  86.     TRISB=0B11000111;      //初始化RB7-RB0的输入输出方向
  87.     TRISD=0B00000000;      //初始化RD7-RD0的输入输出方向
  88.     PORTA=0B00000000;      //初始化RA5-RA0数值
  89.     PORTB=0B00000000;      //初始化RB7-RB0的数值
  90.     PORTD=0B00000000;      //初始化RD7-RD0的数值

  91.     LCD1602_init();        //调用1602液晶初始化函数

  92.     //****A/D模块初始化****
  93.     ADCON1=0B10001110;     //RA0为A/D输入口;ADFM=1,转换后数据右移,ADRESL为低8位数据
  94.     ADIE=0;                //禁止A/D中断
  95.     //*********************

  96.         LCD1602_Disp(2,0,'-');          
  97.         LCD1602_Disp(3,0,'-');                  
  98.         LCD1602_Disp(4,0,'A');
  99.         LCD1602_Disp(5,0,'N');          
  100.         LCD1602_Disp(6,0,'0');
  101.                
  102.         LCD1602_Disp(8,0,'T');
  103.         LCD1602_Disp(9,0,'E');          
  104.         LCD1602_Disp(10,0,'S');                  
  105.         LCD1602_Disp(11,0,'T');
  106.         LCD1602_Disp(12,0,'-');          
  107.         LCD1602_Disp(13,0,'-');

  108.     while(1)               //死循环,单片机初始化后,将一直运行这个死循环
  109.     {

  110.     //***启动一次A/D转换***
  111.         ADCON0=0B00000001;     //选择AN0通道准备进行A/D转换,启动A/D模块
  112.         asm("NOP");            //略做延时
  113.         asm("NOP");            //略做延时
  114.         asm("NOP");            //略做延时
  115.         asm("NOP");            //略做延时
  116.         ADGO=1;                //开始进行A/D转换
  117.         while(ADGO) continue;  //等待A/D转换结束
  118.         ADbuf=ADRESH*256+ADRESL;//将10位A/D转换结果暂存在ADbuf               
  119.     //*********************  
  120.     //*******************************
  121.                 LCD1602_Disp(5,1,'A');          
  122.                 LCD1602_Disp(6,1,'D');                  
  123.                 LCD1602_Disp(7,1,'=');
  124.     //***1602液晶显示0-255***
  125.                 LCD1602_Disp(8,1,(ADbuf/1000)+'0');       //在第2行的第9列显示百位
  126.         LCD1602_Disp(9,1,((ADbuf%1000)/100)+'0');       //在第2行的第10列显示百位
  127.         LCD1602_Disp(10,1,(ADbuf%100)/10+'0'); //在第2行的第11列显示十位
  128.         LCD1602_Disp(11,1,ADbuf%10+'0');       //在第2行的第12列显示个位
  129.     //***********************

  130.     }
  131. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表