找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 8726|回復(fù): 7
收起左側(cè)

單片機(jī)LM35溫度采集設(shè)計(jì)制作 原理圖程序源碼+教程數(shù)碼管顯示

  [復(fù)制鏈接]
ID:118735 發(fā)表于 2018-12-28 11:56 | 顯示全部樓層 |閱讀模式
最近新做了LM35仿真溫度電路設(shè)計(jì)加上LM358十倍放大!

電路原理圖如下:

仿真截圖

仿真截圖



下邊是單片機(jī)代碼!!!第一次發(fā)帖
#include <reg52.h>

#define                uchar                 unsigned char
#define                uint                        unsigned int

//===========================
//ADC0809相關(guān)引腳定義
//===========================
#define                ADC_DATA                P1
sbit                          ADC_EOC                         = P3^3;              
sbit                          ADC_CLK                         = P3^4;               
sbit                          ADC_START                 = P3^6;            
sbit                          ADC_OE                         = P3^7;  

//===========================
//4位共陽(yáng)數(shù)碼管相關(guān)
//===========================
uchar code                         seg[10]={        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90                };                //0~9 小數(shù)點(diǎn)不亮
uchar code         seg_dot[10]={        0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10        };                //0~9 小數(shù)點(diǎn)亮

#define                SEG_DATA                 P2                        //數(shù)碼管段選碼,共陽(yáng)數(shù)碼管,低電平選通段選碼
sbit                         SEG_SEL_0                =        P0^3;                //數(shù)碼管位選:第0位,共陽(yáng)數(shù)碼管,高電平選通位選碼
sbit                         SEG_SEL_1                =        P0^2;                //數(shù)碼管位選:第1位
sbit                         SEG_SEL_2                =        P0^1;                //數(shù)碼管位選:第2位
sbit                         SEG_SEL_3                =        P0^0;                //數(shù)碼管位選:第3位

//===========================
//警報(bào):LED與蜂鳴器引腳
//===========================
sbit         LED         = P0^5;                                //低電平亮
sbit                BEEP         = P0^4;                                //高電平響

#define         LED_ON        LED=0
#define         LED_OFF        LED=1
#define         BEEP_ON        BEEP=1
#define         BEEP_OFF        BEEP = 0

//===========================
//粗略延時(shí)函數(shù)  AT89C51 & 12MHz
//===========================
void delayms(unsigned int ms)
{                    
        unsigned char a,b,c;
        while(ms--)
        {
                for(c=1;c>0;c--)
                        for(b=142;b>0;b--)
                                for(a=2;a>0;a--);
        }
}
/*
//===========================
//粗略延時(shí)函數(shù)  STC12C5A60S2 & 12MHz
//===========================
void delayms(unsigned int ms)
{                    
        unsigned char a,b,c;
        while(ms--)
        {
                for(c=1;c>0;c--)
                        for(b=222;b>0;b--)
                                for(a=12;a>0;a--);
        }
}
*/
//===========================
//定時(shí)器初始化,配置ADC0809時(shí)鐘
//===========================
void timer_init(void)
{
        //配置定時(shí)器0
        ET0 = 1;
        TMOD &= 0xF0;
        TMOD |= 0x02;                //定時(shí)器0,模式2,自動(dòng)重裝定時(shí)器
        TH0 = 200;                        //自動(dòng)重裝值
        TL0 = 200;
        TR0 = 1;                        
        
        //配置定時(shí)器1
        ET1 = 1;
        TMOD &= 0x0F;                //清除定時(shí)器1配置,不改動(dòng)定時(shí)器0的配置
        TMOD |= 0x10;                        //定時(shí)器1模式一,不改動(dòng)定時(shí)器0的模式
        TH1 = (65536 - 2000)/256;
        TL1 = (65536 - 2000)%256;
        TR1 = 1;
        
        EA = 1;
}
//===========================
//定時(shí)器0中斷,為ADC0809提供時(shí)鐘信號(hào)
//===========================
void timer0() interrupt 1
{
        ADC_CLK = ~ADC_CLK;
}
//============================
//ADC0809 轉(zhuǎn)換函數(shù)
//============================
uchar ADC0809_GET(void)
{
        ADC_START = 0;
        ADC_OE = 0;
        ADC_START = 1;
        ADC_START = 0;
        while(ADC_EOC == 0);
        ADC_OE = 1;
        return ADC_DATA;
}
//============================
//定時(shí)器1中斷函數(shù),用于刷新數(shù)碼管
//============================
uchar t1_flag = 0;                //用于標(biāo)記顯示第幾位數(shù)碼管
uchar seg0 = 0;                //第0位數(shù)碼管的值        
uchar seg1 = 1;                //第1位數(shù)碼管的值        
uchar seg2 = 2;                //第2位數(shù)碼管的值        
uchar seg3 = 3;                //第3位數(shù)碼管的值        

void timer1() interrupt 3
{
        TH1 = (65536 - 2000)/256;
        TL1 = (65536 - 2000)%256;
        
        SEG_SEL_0 = 0;                        
        SEG_SEL_1 = 0;
        SEG_SEL_2 = 0;
        SEG_SEL_3 = 0;
        SEG_DATA = 0xff;
        
        if(t1_flag == 0)
        {
                SEG_SEL_0 = 1;                        //選通第0位數(shù)碼管
                SEG_SEL_1 = 0;
                SEG_SEL_2 = 0;
                SEG_SEL_3 = 0;
                SEG_DATA = seg[seg0];                //顯示帶小數(shù)點(diǎn)的數(shù)
        }
        else if(t1_flag == 1)
        {
                SEG_DATA = seg_dot[seg1];
                SEG_SEL_0 = 0;                        
                SEG_SEL_1 = 1;                        //選通第1位數(shù)碼管
                SEG_SEL_2 = 0;
                SEG_SEL_3 = 0;
        }
        else if(t1_flag == 2)
        {
                SEG_DATA = seg[seg2];
                SEG_SEL_0 = 0;                        
                SEG_SEL_1 = 0;                        
                SEG_SEL_2 = 1;                        //選通第2位數(shù)碼管
                SEG_SEL_3 = 0;
        }
        else if(t1_flag == 3)
        {
                SEG_DATA = seg[seg3];
                SEG_SEL_0 = 0;                        
                SEG_SEL_1 = 0;                        
                SEG_SEL_2 = 0;
                SEG_SEL_3 = 1;                //選通第3位數(shù)碼管
        }
        t1_flag++;                                //自加1
        t1_flag =  t1_flag%4;                //讓t1_flag 在0和3之間循環(huán)
}

//============================
//顯示電壓值,輸入0~255,顯示0.000~5.000
//============================
uint print_volt(uchar num)
{
        uint volt = 0;
        volt = num/255.0 * 5000 + 0.5;        //除255.0和除255有很大區(qū)別,除255.0會(huì)自動(dòng)轉(zhuǎn)換為float型,小數(shù)才能保持,而volt/255=0,+0.5四舍五入。
        seg0 = volt/1000%10;
        seg1 = volt/100%10;
        seg2 = volt/10%10;
        seg3 = volt%10;
        return volt;
}

//============================
//主函數(shù)
//============================
void main(void)
{
        uchar adc_num = 0;                //ADC采集到的值
        uint volt = 0;                                        //電壓值 0~5000,代表(0~5)V
        
        timer_init();                                        //定時(shí)器0、定時(shí)器1初始化。
        LED_OFF;
        BEEP_OFF;
        
        while(1)
        {
                adc_num = ADC0809_GET();
                volt = print_volt(adc_num);                        //在數(shù)碼管上顯示電壓值,并返回一個(gè)0~5000的值,用于判斷是否要報(bào)警。
                if(volt > 2500)
                {
                        LED_ON;
                        BEEP_ON;
                }
                else
                {
                        LED_OFF;
                        BEEP_OFF;
                }
               
                delayms(100);
        }
}

評(píng)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

ID:118735 發(fā)表于 2018-12-28 11:56 | 顯示全部樓層
工程可以直接使用。。。
回復(fù)

使用道具 舉報(bào)

ID:156220 發(fā)表于 2018-12-28 17:25 | 顯示全部樓層
很詳細(xì)。謝謝樓主的分享,
回復(fù)

使用道具 舉報(bào)

ID:460365 發(fā)表于 2019-1-8 15:46 來(lái)自觸屏版 | 顯示全部樓層
樓主adc0808的時(shí)鐘信號(hào),直接拿一個(gè)時(shí)鐘源可以嗎,然后頻率設(shè)為640mhz
回復(fù)

使用道具 舉報(bào)

ID:118735 發(fā)表于 2019-1-12 00:35 | 顯示全部樓層
哇哈 發(fā)表于 2019-1-8 15:46
樓主adc0808的時(shí)鐘信號(hào),直接拿一個(gè)時(shí)鐘源可以嗎,然后頻率設(shè)為640mhz

但是給時(shí)鐘你也需要讀取數(shù)據(jù)。如果數(shù)據(jù)沒(méi)穩(wěn)定就開(kāi)始讀,那么你讀的是錯(cuò)誤的。還是單片機(jī)給比較穩(wěn)定
回復(fù)

使用道具 舉報(bào)

ID:374552 發(fā)表于 2019-1-12 11:11 | 顯示全部樓層
可以可以,繼續(xù)加油啊
回復(fù)

使用道具 舉報(bào)

ID:424197 發(fā)表于 2019-4-10 18:29 | 顯示全部樓層
王企鵝 發(fā)表于 2018-12-28 11:56
工程可以直接使用。。。

沒(méi)有仿真文件
回復(fù)

使用道具 舉報(bào)

ID:853730 發(fā)表于 2020-12-3 23:25 | 顯示全部樓層
溫度為什么顯示40.2不變化呀?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表