找回密码
 立即注册

QQ登录

只需一步,快速开始

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

大家帮看一下,PIC单片机程序为什么得不到正确的返回值?

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
跳转到指定楼层
楼主
ID:206067 发表于 2019-3-19 12:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
MCU是PIC12F675

#include<pic.h>
#include <xc.h>

#pragma config FOSC = INTRCIO   // Oscillator Selection bits (INTOSC oscillator: I/O function on GP4/OSC2/CLKOUT pin, I/O function on GP5/OSC1/CLKIN)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-Up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = OFF      // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = OFF      // Brown-out Detect Enable bit (BOD disabled)
#pragma config CP = OFF         // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)

#define ad GP2
#define led1 GP4//??
#define led2 GP5//??


#define uchar unsigned char
#define uint unsigned int



uchar adnum1;
uchar adnum2;

uchar i;
uint get_ad();


void delay(void)
{
    unsigned int i;
    for(i=0;i<20000;i++);
}

void display(uchar adnum1,uchar adnum2)
{
        for(i=0;i<adnum1;i++)
        {
        led1=0;led2=0;delay();//开灯GP4低电平有效,GP5高电平有效
        led1=1;led2=0; delay();//关灯
        }
    delay();

    for(i=0;i<adnum2;i++)
        {
        led1=1;led2=1;delay();
        led1=1;led2=0; delay();
        }
}

uint get_ad()
{
    uint adval;//=0;   
    adval=0b1000101100;
    return(adval);
}

void advalue()
{
    uint adnum;
    uint advin;
    float vin;
    while(1)
    {
        //advin=get_ad;//用这得不到正确的get_ad返回值
       advin=0b1000101100;//用这验证是OK的
        vin=(4.6*advin)/1023;
        adnum=vin*1000;
        adnum1=adnum/1000;
        adnum2=adnum%1000/100;
        display(adnum1,adnum2);
        delay();

    }
}


void init()
{
    OSCCAL=0b00000000;//????
    TRISIO=0b00001111;//????
    OPTION_REG=0b10000000;//??????
    ADCON0=0b00001011;//
    ANSEL=0b00110100;//
    ADFM=0;
    delay();
}
void main()
{
    init();
    while(1)
    {
        advalue();
    }
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:206067 发表于 2019-3-21 09:19 | 只看该作者
有朋友看到了吗
回复

使用道具 举报

板凳
ID:18297 发表于 2019-3-21 13:33 | 只看该作者
uint get_ad()
{
    uint adval;//=0;   
    adval=0b1000101100;
    return(adval);
}
这个AD采集肯定不行的。
正确的方法是:
1)写入通道选择CHS1:CHS0;
2)左右对齐选择ADFM;
3)开启AD(ADON=1);
4)延时50us;
5)设置GO/DONE位开启AD检测;
6)while(ADCON0bits.GO);判断GO是否为0,即AD转换结束。
7)读取ADRESH:ADRESL,
8)AD结束。
回复

使用道具 举报

地板
ID:206067 发表于 2019-3-23 09:20 | 只看该作者
zjjhtony 发表于 2019-3-21 13:33
uint get_ad()
{
    uint adval;//=0;   

我知道不是这么写 在测试现在是数据都不能返回过去
回复

使用道具 举报

5#
ID:206067 发表于 2019-3-25 18:26 | 只看该作者
为什么这么少人看到,还没解决这个问题啊
回复

使用道具 举报

6#
ID:18297 发表于 2019-3-25 20:44 | 只看该作者

  1. uint get_ad()
  2. {
  3.     uint adval;//=0;  
  4.     GO=1;
  5.     while(GO);
  6.     adval=ADRESL;
  7.     adval |=((uint)ADRESH)<<8;
  8.     return(adval);
  9. }

  10. void advalue()
  11. {
  12.     uint adnum;
  13.     uint advin;
  14.     float vin;   
  15.     while(1)
  16.     {
  17.         advin=get_ad();//用这得不到正确的get_ad返回值
  18.         //advin=0b1000101100;//用这验证是OK的
  19.         vin=(4.6*advin)/1023;
  20.         adnum=(uint)(vin*1000);
  21.         adnum1=adnum/1000;
  22.         adnum2=adnum%1000/100;
  23.         display(adnum1,adnum2);
  24.         delay();   

  25.     }
  26. }


  27. void init()
  28. {
  29.     OSCCAL=0b00000000;//????
  30.     TRISIO=0b00001111;//????
  31.     OPTION_REG=0b10000000;//??????
  32.     ADCON0=0b10001001;//
  33.     IOC=0;
  34.     ANSEL=0b00000100;//
  35.     delay();
  36. }
  37. void main()
  38. {
  39.     init();
  40.     led1=0;
  41.     while(1)
  42.     {
  43.         advalue();
  44.     }
  45. }
复制代码

部分代码如上,其他自己加上吧!程序修改了。
回复

使用道具 举报

7#
ID:206067 发表于 2019-3-30 00:37 | 只看该作者
zjjhtony 发表于 2019-3-25 20:44
部分代码如上,其他自己加上吧!程序修改了。

谢谢回复,你改的程序是可以的,昨天用MCV08重新写了一遍也成功了,还在想是不是我的12F675有问题,今天拿你的对了一下,发现根本的问题是漏了一个()     advin=get_ad();就是这个括号 忏愧啊
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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