打印
[电源]

我的毕业设计更新中

[复制链接]
楼主: junpeng324
手机看帖
扫描二维码
随时随地手机跟帖
21
junpeng324|  楼主 | 2018-1-22 20:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览
现在基本做好了,已经可正常工作了,好开心。

使用特权

评论回复
22
junpeng324|  楼主 | 2018-1-22 20:47 | 只看该作者
加了一个频率产生装置,用51单片机来模拟产生方波

使用特权

评论回复
23
junpeng324|  楼主 | 2018-1-22 20:53 | 只看该作者


单片机最小系统加573驱动电路用于驱动数码管

使用特权

评论回复
24
junpeng324|  楼主 | 2018-1-22 20:57 | 只看该作者

复位电路,用于系统复位

使用特权

评论回复
25
junpeng324|  楼主 | 2018-1-22 20:58 | 只看该作者

晶振电路 。这里我接的是25M的晶振,代码部分和12M有点区别,特别是在单总线部分。

使用特权

评论回复
26
junpeng324|  楼主 | 2018-1-22 21:01 | 只看该作者


6个共阳极的数码管 分别用来显示频率和温度

使用特权

评论回复
27
junpeng324|  楼主 | 2018-1-22 21:03 | 只看该作者


LM317 可调电源电路 这个比较简单按照原理图连接即可,和适当增加散热。

使用特权

评论回复
28
junpeng324|  楼主 | 2018-1-22 21:07 | 只看该作者
代码部分:单总线用到的延时

void Delay1ms(uint y)
{
        uint x;
        for( ; y>0; y--)
        {
                for(x=110; x>0; x--);
        }
}


使用特权

评论回复
29
junpeng324|  楼主 | 2018-1-22 21:10 | 只看该作者
DS18B20初始化 这个是关键,调试的重点 本代码适合25M晶振


/*******************************************************************************
* 函 数 名         : Ds18b20Init
* 函数功能                   : 初始化
* 输    入         : 无
* 输    出         : 初始化成功返回1,失败返回0
*******************************************************************************/


uchar Ds18b20Init()
{
        uchar i;
        DSPORT = 0;                         //将总线拉低480us~960us
        i = 140;       
        while(i--);//延时642us
        DSPORT = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低
        i = 0;
        while(DSPORT)        //等待DS18B20拉低总线
        {
                Delay1ms(1);
                i++;
                if(i>5)//等待>5MS
                {
                        return 0;//初始化失败
                }
       
        }
        return 1;//初始化成功
}


使用特权

评论回复
30
junpeng324|  楼主 | 2018-1-22 21:11 | 只看该作者
/*******************************************************************************
* 函 数 名         : Ds18b20WriteByte
* 函数功能                   : 向18B20写入一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


根据DS18B20 时序来写,有点C的功底基本不是事
void Ds18b20WriteByte(uchar dat)
{
        uint i, j;


        for(j=0; j<8; j++)
        {
                DSPORT = 0;                       //每写入一位数据之前先把总线拉低1us
                i++;
                DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始
                i=6;
                while(i--); //延时68us,持续时间最少60us
                DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值
                dat >>= 1;
        }
}

使用特权

评论回复
31
junpeng324|  楼主 | 2018-1-22 21:12 | 只看该作者
接着就是读一个字节,为读取温度做基础。
/*******************************************************************************
* 函 数 名         : Ds18b20ReadByte
* 函数功能                   : 读取一个字节
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


uchar Ds18b20ReadByte()
{
        uchar byte, bi;
        uint i, j;       
        for(j=8; j>0; j--)
        {
                DSPORT = 0;//先将总线拉低1us
                i++;
                DSPORT = 1;//然后释放总线
                i++;
                i++;//延时6us等待数据稳定
                bi = DSPORT;         //读取数据,从最低位开始读取
                /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/
                byte = (byte >> 1) | (bi << 7);                                                  
                i = 4;                //读取完之后等待48us再接着读取下一个数
                while(i--);
        }                               
        return byte;
}

使用特权

评论回复
32
junpeng324|  楼主 | 2018-1-22 21:15 | 只看该作者
在开始读取温度之前需要发送开始转换温度的命令


/*******************************************************************************
* 函 数 名         : Ds18b20ChangTemp
* 函数功能                   : 让18b20开始转换温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


void  Ds18b20ChangTemp()
{
        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 
        Ds18b20WriteByte(0x44);            //温度转换命令
//        Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了
   
}

使用特权

评论回复
33
junpeng324|  楼主 | 2018-1-22 21:17 | 只看该作者
接着就是发送读取温度命令
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTempCom
* 函数功能                   : 发送读取温度命令
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


void  Ds18b20ReadTempCom()
{       


        Ds18b20Init();
        Delay1ms(1);
        Ds18b20WriteByte(0xcc);         //跳过ROM操作命令
        Ds18b20WriteByte(0xbe);         //发送读取温度命令
}

使用特权

评论回复
34
junpeng324|  楼主 | 2018-1-22 21:19 | 只看该作者
终于可以读取温度了 ,主函数在调用读取温度之前需要初始化DS18B20
/*******************************************************************************
* 函 数 名         : Ds18b20ReadTemp
* 函数功能                   : 读取温度
* 输    入         : 无
* 输    出         : 无
*******************************************************************************/


unsigned char Ds18b20ReadTemp()
{
        unsigned char temp = 0;
        uchar tmh, tml;
        Ds18b20ChangTemp();                                 //先写入转换命令
        Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令
        tml = Ds18b20ReadByte();                //读取温度值共16位,先读低字节
        tmh = Ds18b20ReadByte();                //再读高字节
        temp =(tmh<<4)|(tml>>4);
        return temp;
}


使用特权

评论回复
35
junpeng324|  楼主 | 2018-1-23 12:51 | 只看该作者
头文件包含部分:这里我们用的是51单片机,只需要包含温度采集的头文件即可
#include "reg52.h"
#include"temp.h"


使用特权

评论回复
36
junpeng324|  楼主 | 2018-1-23 12:53 | 只看该作者
用到了6个数码和2个573芯片,我们需要位定义段码控制端与位码控制端
sbit du=P2^2;         //段码控制端
sbit we=P2^1;     //位码控制端
sbit fan=P3^5;    //风扇控制端

使用特权

评论回复
37
junpeng324|  楼主 | 2018-1-23 12:55 | 只看该作者
方便后面的书写我们定义了两个宏来代替 unsigned int  与unsigned char   也可以定义为 u8  u16
define uint  unsigned int            
#define uchar unsigned char

使用特权

评论回复
38
junpeng324|  楼主 | 2018-1-23 12:59 | 只看该作者
定义了 共阳极数码管的段码与位码存储数组以及显示数码管的中间变量、温度变量、中断计数变量、频率计数变量
uchar table_du[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};  //段码
uchar table_we[]={0x01,0x02,0x04,0x08,0x20,0x10}; //位码
uchar yi,er,san,si,wu,liu;  //显示数码管的中间变量
uchar temp; //存储的温度变量
uchar count;  //中断计数变量
uint frenum=0; //频率计数变量

使用特权

评论回复
39
junpeng324|  楼主 | 2018-1-23 13:01 | 只看该作者
函数的声明:
void delay_ms(uint z);    //演示函数 11.0592MHZ  1MS延时
void smg1(uchar yi,er);   //前两位数码管显示
void smg2(uchar san,si); //中间两位数码管显示
void smg3(uchar wu,liu); //后两位数码管显示

使用特权

评论回复
40
junpeng324|  楼主 | 2018-1-23 13:02 | 只看该作者
定时器初始化配置
void timer0init()          
{
   TMOD=0x15;      //0001 0101  t1 16位定时 t0 16位计数
   TH0=0;                  //t0 放初值
   TL0=0;
   TH1=(65536-41667)/256;        // t1 放初值定时50ms
   TL1=(65536-41667)%256;
   EA=1;          //开总中断
   ET1=1;          //允许t1中断
   ET0=1;          //允许t0中断
   TR0=1;     //启动定时器T0
   TR1=1;     //启动定时器T1;
}

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则