找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1712|回复: 2
收起左侧

关于pic单片机的2个程序出现问题,连老师都无法解决

[复制链接]
ID:337979 发表于 2018-5-25 13:10 | 显示全部楼层 |阅读模式
大家好 我是一位在校学生 有两个程序出现了问题 询问老师也没有解决方法
所以请各位大大帮下忙

第一个函数 为计时器   每一秒 pic都会向电脑发送时间


00:00
00:01
00:02
00:03

用timer1来计时

当发生中断时候 数值加1


第二个函数为两部分组成

1 在AN0 接收电压

电压 若为 0到 四分之一电压  则 RB0=1
电压 若为 四分之一电压到 四分之二电压  则 RB0=1 RB1=1
电压 若为 四分之二电压到 四分之三电压  则 RB0=1 RB1=1  RB2=1
电压 若为 四分之三电压到 四分之四电压 则 RB0=1 RB1=1  RB2=1 RB3=1

2加入timer0

timer0只有发生中断时  

RB的门 才会显示电压






#include "configurations_bits.h"
#define  _XTAL_FREQ 4000000

void envoie (char nb); // 发送函数
void cal(char nb);       // 将数字转化为时间
char sec=0,min=0;    // 表面变量 sec为秒  min为分钟
bit c=0;
void timer1(void); //timer1


void main (void)
    {
    timer1();// 调用TIMER1

    SPBRG=25;         //设定串联传输
    TXSTA=0x26;
    RCSTA=0x90;
    BAUDCTL=0x00;

    GIE=1;       //允许中断
    PEIE=1;
    TMR1IE=1;

    while(1)
    {
        if(c==2) // 使用2x500ms 来获得1S的周期
        {
        cal(min);  // 处理数字并发送
        envoie(0x3A); 发送  :
        cal(sec);   //处理数字并发送
        envoie(0x0D);//换行
        envoie(0x0A);
        sec++;// 计数
        if(sec==60)    //如果秒等于60 归零
        {
          sec=0;
          min=min+1;
          if(min==60)
          {
              min=0;
          }
        }
        c=0; //归零
        }
               
    }
    }

    void envoie (char nb)  //发送程序
    {
        TXREG=nb;
        while (TRMT==0);
    }

    void cal(char nb)  //处理并发送的·函数
    {
        short int a,b;
        a=nb/10;
        b=nb-a*10;
        envoie(a+0x30);
        envoie(b+0x30);
    }
               
void timer1(void) // 设定TIMER1周期500ms
{
    T1CON=0x31;
    TMR1L=0xDC;
    TMR1H=0x0B;
    TMR1IF=0;
}

void interrupt interruption (void) //中断程序
{
    if(TMR1IF==1)
    {
     c=c+1;  
    TMR1L=0xDC;
    TMR1H=0x0B;
    TMR1IF=0;
    }
}



#include "configurations_bits.h"
#define  _XTAL_FREQ 4000000

void confi_can ();
void confi_port();
char can ();
bit valide=0;
void timer0 ();
void interrupt inter ();



void interrupt inter () // 中断程序

{
    if(T0IF==1) // 中断
    {
      TMR0=0; //重制 timer0
      T0IF=0;
      valide=1; // 决定值
    }
}
void main ()
{
    char a;

    confi_can ();  //设定can的寄存器
    confi_port();  //设定要用的门

    GIE=1;         // 允许中断
    PEIE=1;
    ADIE=1;
    T0IE=1;

    timer0 ();     //timer0

    while(1)
    {
        if(valide==1) // 中断后启动if函数
        {
            a = can(); 将can所获得的值赋予a // 显示电压
        if((0<a)&&(a<=63))   
        {
            PORTB=0x01;
        }
        if((63<a)&&(a<=127))
        {
            PORTB=0x03;
        }
        if((127<a)&&(a<=191))
        {
            PORTB=0x07;
        }
        if((191<a)&&(a<=255))
        {
            PORTB=0x0f;
        }
        valide=0;   // 重置
        }



    }
}

void confi_can ()
{
    ADCON0=0b01000001;  //已AN0为模拟电位入口
    ADCON1=0b00000000;
    ANSEL=0b00000001;
    ANSELH=0b0000000;
}

void confi_port()  // B门 0 1 2 3 为出口 连接着led
{
    TRISA=0x01;   // AN0对应A0 所以设定A0为入口
    PORTA= 0x00;
    TRISB=0xF0;
    PORTB=0x00;
}

char can ()        // can模块函数
{
    GO = 1;
    while(ADIF==0);
    ADIF==0;
    return(ADRESH);
}

void timer0 () //timer0 函数
{
    OPTION_REG=0b10000111;
    TMR0=0;
    T0IF=0;
}



出现的问题

第一个函数 pic只会发送一个 16位 数值为86 的东西 然后 停下

第二个函数  连接在RB0 1 2 3 的灯根本不会亮。。。
回复

使用道具 举报

ID:111634 发表于 2018-5-26 18:57 | 显示全部楼层
老师也没有解决方法有两种可能:一是老师水平较低;二是老师没有空或不耐烦。大学生应该以自学为主,越好的大学老师讲得越少越简单,越差的大学老师讲得越多越详细。
回复

使用道具 举报

ID:338838 发表于 2018-5-26 21:48 | 显示全部楼层
第一个函数: 请检查你的串口接线,注意,单片机的tx接电脑的rx,同时,看下串口调试软件的串口号是否正确
第二个函数:可以在线看下,是不是模数转换那里配置有问题,导致while(ADIF==0);死住,出不来了

仅供参考
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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