微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > pic单片机16f877a程序的问题

pic单片机16f877a程序的问题

时间:10-02 整理:3721RD 点击:
我需要用单片机实现1khz,1V的幅值的正弦信号峰峰值的数码管显示,请问这个程序怎么编写啊!
这是我写的,有什么问题吗!~望高手们帮忙解决。谢谢~!

  1. #include <pic.h>
  2. #define UCHAR unsigned char
  3. #define UINT unsigned int
  4. __CONFIG(0X3B31);
  5. UINT aa;
  6. UINT max,min;

  7. const UCHAR table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  8.                     0x7f,0x6f,0x77,0x39,0x5e,0x79,0x71};//数码表

  9. void DELAY_ms(UINT x)
  10. {
  11.         UINT a,b;
  12.         for(a=x;a>0;a--)
  13.                 for(b=110;b>0;b--);
  14. }

  15. void Init()
  16. {
  17.         TRISA=0X01;
  18.         TRISD=0;
  19.         PORTA=0;
  20.         PORTD=0;
  21.         ADCON0=0X41;
  22.         ADCON1=0X8E;
  23.         DELAY_ms(10);
  24. }
  25. UINT AD_GET()
  26. {
  27.         UINT ADVAL,i=0;
  28.         GO=1;

  29.         ADVAL=ADRESH;
  30.         ADVAL=ADVAL<<8|ADRESL;
  31.         aa=ADVAL;
  32.         GO=0;
  33. }
  34. UINT JISUAN()
  35. {
  36.         UINT i,hh;
  37.         i=0;max=0;min=0;
  38.         while(i<2500)
  39.         {
  40.                 aa=AD_GET();
  41.                 if(aa>max) {max=aa;}
  42.                 if(aa<min) {min=aa;}
  43.                 i++;       
  44.         }
  45.         hh=max-min;
  46.         return hh;
  47. }


  48. void disp(UCHAR num1, UCHAR num2,UCHAR num3,UCHAR num4)
  49. {
  50.         PORTD=table[num1];
  51.         PORTA=0X20;
  52.         DELAY_ms(2);
  53.         PORTD=table[num2];
  54.         PORTA=0X10;
  55.         DELAY_ms(2);
  56.         PORTD=table[num3];
  57.         PORTA=0X08;
  58.         DELAY_ms(2);
  59.         PORTD=table[num4];
  60.         PORTA=0X04;
  61.         DELAY_ms(2);
  62. }


  63. void main()
  64. {
  65.         UCHAR a1,a2,a3,a4;
  66.         UINT lednum;
  67.         Init();
  68.         while(1)
  69.         {
  70.                 lednum=JISUAN();
  71.                 a1=lednum/1000;
  72.                 a2=lednum%1000/100;
  73.                 a3=lednum%100/10;
  74.                 a4=lednum%10;
  75.                 disp(a1,a2,a3,a4);
  76.         }
  77. }

复制代码

#include <pic.h>
#define UCHAR unsigned char
#define UINT unsigned int
__CONFIG(0X3B31);
UINT aa;
UINT max,min;
const UCHAR table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x39,0x5e,0x79,0x71};//数码表
void DELAY_ms(UINT x)
{
        UINT a,b;
        for(a=x;a>0;a--)
                for(b=110;b>0;b--);
}
void Init()
{
        TRISA=0X01;
        TRISD=0;
        PORTA=0;
        PORTD=0;
        ADCON0=0X41;
        ADCON1=0X8E;            //未开AD采样通道 即ANSEL=?
        DELAY_ms(10);
}
UINT AD_GET()                   //AD采样函数写的有问题 建议再查查手册。
{
        UINT ADVAL,i=0;
        GO=1;
        ADVAL=ADRESH;
        ADVAL=ADVAL<<8|ADRESL;
        aa=ADVAL;
        GO=0;
}
UINT JISUAN()
{
        UINT i,hh;
        i=0;max=0;min=0;
        while(i<2500)           //采样这么多次,能知道占用多少机器及周期吗?
        {
                aa=AD_GET();
                if(aa>max) {max=aa;}
                if(aa<min) {min=aa;}
                i++;        
        }
        hh=max-min;
        return hh;
}
void disp(UCHAR num1, UCHAR num2,UCHAR num3,UCHAR num4)
{
        PORTD=table[num1];
        PORTA=0X20;
        DELAY_ms(2);
        PORTD=table[num2];
        PORTA=0X10;
        DELAY_ms(2);
        PORTD=table[num3];
        PORTA=0X08;
        DELAY_ms(2);
        PORTD=table[num4];
        PORTA=0X04;
        DELAY_ms(2);
}
void main()
{
        UCHAR a1,a2,a3,a4;
        UINT lednum;
        Init();
        while(1)
        {
                lednum=JISUAN(); //占用多久时间?
                a1=lednum/1000;
                a2=lednum%1000/100;
                a3=lednum%100/10;
                a4=lednum%10;
                disp(a1,a2,a3,a4);  //建议用定时器刷屏。
        }
}

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top