单片机课设求助

2019-07-16 16:38发布

数码管显示的直流电压检测电路设计,单片机课设题目,需要程序,原理图,连线方法,用的芯片是12C5A16S2,跪请各位大神帮忙,谢谢。a) 设计实现功能
STC12C5A60S2(引脚排序及基本功能同AT89S51)作为主控芯片,设计0-5V直流电压检测电路。一是利用单片机内部的A/D转换器测量外接直流电压;二是利用数码管显示当前信号的电压值;三是根据不同的电压大小控制发光管点亮指示。
b) 原理图设计
1.原理图设计要符合项目的工作原理,连线要正确。
2.图中所使用的元器件要合理选用,电阻、电容等器件的参数要正确标明。
3.原理图要完整,CPU、外围器件、外扩接口、输入/输出装置要一应俱全。
c) 程序调计
1.根据要求,将总体功能分解成若干个子功能模块,每个功能模块完成一个特定的功能。
2.根据总体要求及分解的功能模块,确定各功能模块之间的关系,设计出完整的程序流程图。
d) 程序调试
1.编写相关程序,并进行仿真
2.将程序下载到单片机,进行运行调试。
e) 设计说明书
1.原理图设计说明
简要说明设计目的,原理图中所使用的元器件功能及在图中的作用,各器件的工作过程及顺序。
2.程序设计说明
对程序设计总体功能及结构进行说明,对各子模块的功能以及各子模块之间的关系作较详细的描述。
3.画出工作原理图,程序流程图并给出相应的程序清单。
帮帮忙,各位大神
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
韦尚菊
1楼-- · 2019-07-17 07:10
wangweijie2016 发表于 2015-12-18 22:00

#include "reg51.h"
#include "intrins.h"
#include"absacc.h"
#include"math.h"
typedef unsigned char BYTE;
typedef unsigned int WORD;
sbit led=P1^1;        //声光报警控制端
BYTE code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳极0~9
BYTE code table1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//共阳极0.~9.


/* AD 转换寄存器 */
sfr P1ASF = 0x9D; //P1 口功能控制寄存器
sfr ADC_CONTR = 0xBC; //AD 控制寄存器
sfr ADC_RES = 0xBD; //AD 转换结果高位
sfr ADC_RESL = 0xBE; //AD 转换结果低位
sfr AUXR1 = 0xA2; //AD 转换结果寄存器
#define ADC_POWER 0x80 //AD 转换电源开启
#define ADC_FLAG 0x10 //AD 转换标志位
#define ADC_START 0x08 //AD 转换开始位
#define ADRJ1 0x40 //AD 转换结果:高2 位+低8 位
#define ADC_SPEEDLL 0x00 //AD 转换速度控制,540 个时钟周期
#define ADC_SPEEDL 0x20 //AD 转换速度控制,360 个时钟周期
#define ADC_SPEEDH 0x40 //AD 转换速度控制,180 个时钟周期
#define ADC_SPEEDHH 0x60 //AD 转换速度控制,90 个时钟周期

unsigned char AD_val_h; //AD 转换结果高位
unsigned char AD_val_l; //AD 转换结果低位
unsigned long AD_val;
float AD_float;
void InitADC();
void SendData(BYTE dat);
//void GetADCResult(BYTE ch);
void Delay(WORD n);
void Delay2(WORD n);
void ShowResult(BYTE ch);


/*********************************************************
*延时n微秒程序
**********************************************************/
void DelayXus(WORD n)
{
    while(--n);
}

void GetADCResult(BYTE ch) //AD 转换
{
AUXR1 &=~ADRJ1;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL|ch|ADC_START;
_nop_();
_nop_();
_nop_();
_nop_();
while(!(ADC_CONTR & ADC_FLAG));
ADC_CONTR &=~ADC_FLAG;
AD_val_h=ADC_RES;
AD_val_l=ADC_RESL;
AD_val=AD_val_h*4+AD_val_l;
}
void InitADC()
{
P1ASF=0xff;
ADC_RES=0;
ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
Delay(1);
}
void Delay(WORD n)
{
WORD x;
while(n--)
{
x=500;
while(x--);
}
}
void Delay2(WORD n)
{
WORD x;
while(n--)
{
x=5000;
while(x--);
}
}
void display(float f1)
{                BYTE qian,bai,shi,ge;
        WORD f;
                   f=f1*1000;
                qian=(int)f/1000;
                bai=(int)f/100%10;
                shi=(int)f/10%10;
                ge=(int)f%10;

                P2=0xf7;
                P0=table1[qian];
                WR=0;
                Delay(5);
                P0=0XFF;
                WR=1;

                P2=0xfb;
                P0=table[bai];
                WR=0;
                Delay(5);
                P0=0XFF;
                WR=1;

                P2=0xfd;
                P0=table[shi];
                WR=0;
                Delay(5);
                P0=0XFF;
                WR=1;

                P2=0xfe;
                P0=table[ge];
                WR=0;
                Delay(5);
                P0=0XFF;
                WR=1;
}

void main()
{
SP=0x60;
InitADC();
AUXR1 &=~ADRJ1;
while(1)
{
GetADCResult(0);
AD_float=AD_val*5.0/1024.0;
display(AD_float);
if(AD_float>4.0)
{led=0;}
else led=1;
if(AD_float>=3.0&&AD_float<4.0)
        P0=0xf0;
if(AD_float>=2.0&&AD_float<3.0)
        P0=0xf8;
if(AD_float>=1.0&&AD_float<2.0)
  P0=0xfc;
if(AD_float>=0.0&&AD_float<1.0)
  P0=0xfe;
//Delay2(10);
}display(AD_float);
} 还是之前的那个课设,这是我写的程序,但有点小问题,能帮忙看看不

一周热门 更多>