久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 8448|回復: 7
打印 上一主題 下一主題
收起左側

單片機LM35溫度采集設計制作 原理圖程序源碼+教程數碼管顯示

  [復制鏈接]
跳轉到指定樓層
樓主
最近新做了LM35仿真溫度電路設計加上LM358十倍放大!!

電路原理圖如下:



下邊是單片機代碼!!!第一次發帖
#include <reg52.h>

#define                uchar                 unsigned char
#define                uint                        unsigned int

//===========================
//ADC0809相關引腳定義
//===========================
#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位共陽數碼管相關
//===========================
uchar code                         seg[10]={        0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90                };                //0~9 小數點不亮
uchar code         seg_dot[10]={        0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10        };                //0~9 小數點亮

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

//===========================
//警報: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

//===========================
//粗略延時函數  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--);
        }
}
/*
//===========================
//粗略延時函數  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--);
        }
}
*/
//===========================
//定時器初始化,配置ADC0809時鐘
//===========================
void timer_init(void)
{
        //配置定時器0
        ET0 = 1;
        TMOD &= 0xF0;
        TMOD |= 0x02;                //定時器0,模式2,自動重裝定時器
        TH0 = 200;                        //自動重裝值
        TL0 = 200;
        TR0 = 1;                        
        
        //配置定時器1
        ET1 = 1;
        TMOD &= 0x0F;                //清除定時器1配置,不改動定時器0的配置
        TMOD |= 0x10;                        //定時器1模式一,不改動定時器0的模式
        TH1 = (65536 - 2000)/256;
        TL1 = (65536 - 2000)%256;
        TR1 = 1;
        
        EA = 1;
}
//===========================
//定時器0中斷,為ADC0809提供時鐘信號
//===========================
void timer0() interrupt 1
{
        ADC_CLK = ~ADC_CLK;
}
//============================
//ADC0809 轉換函數
//============================
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;
}
//============================
//定時器1中斷函數,用于刷新數碼管
//============================
uchar t1_flag = 0;                //用于標記顯示第幾位數碼管
uchar seg0 = 0;                //第0位數碼管的值        
uchar seg1 = 1;                //第1位數碼管的值        
uchar seg2 = 2;                //第2位數碼管的值        
uchar seg3 = 3;                //第3位數碼管的值        

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位數碼管
                SEG_SEL_1 = 0;
                SEG_SEL_2 = 0;
                SEG_SEL_3 = 0;
                SEG_DATA = seg[seg0];                //顯示帶小數點的數
        }
        else if(t1_flag == 1)
        {
                SEG_DATA = seg_dot[seg1];
                SEG_SEL_0 = 0;                        
                SEG_SEL_1 = 1;                        //選通第1位數碼管
                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位數碼管
                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位數碼管
        }
        t1_flag++;                                //自加1
        t1_flag =  t1_flag%4;                //讓t1_flag 在0和3之間循環
}

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

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

評分

參與人數 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:118735 發表于 2018-12-28 11:56 | 只看該作者
工程可以直接使用!。!
回復

使用道具 舉報

板凳
ID:156220 發表于 2018-12-28 17:25 | 只看該作者
很詳細。謝謝樓主的分享,
回復

使用道具 舉報

地板
ID:460365 發表于 2019-1-8 15:46 來自手機 | 只看該作者
樓主adc0808的時鐘信號,直接拿一個時鐘源可以嗎,然后頻率設為640mhz
回復

使用道具 舉報

5#
ID:118735 發表于 2019-1-12 00:35 | 只看該作者
哇哈 發表于 2019-1-8 15:46
樓主adc0808的時鐘信號,直接拿一個時鐘源可以嗎,然后頻率設為640mhz

但是給時鐘你也需要讀取數據。如果數據沒穩定就開始讀,那么你讀的是錯誤的。還是單片機給比較穩定
回復

使用道具 舉報

6#
ID:374552 發表于 2019-1-12 11:11 | 只看該作者
可以可以,繼續加油啊
回復

使用道具 舉報

7#
ID:424197 發表于 2019-4-10 18:29 | 只看該作者
王企鵝 發表于 2018-12-28 11:56
工程可以直接使用。。。

沒有仿真文件
回復

使用道具 舉報

8#
ID:853730 發表于 2020-12-3 23:25 | 只看該作者
溫度為什么顯示40.2不變化呀?
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲人人 | 亚洲精品天堂 | 精品国产乱码久久久久久丨区2区 | 免费在线观看av网址 | 一区二区三区国产精品 | 狠狠干网| 亚洲视频在线观看免费 | 宅女噜噜66国产精品观看免费 | 操操网站| 欧美一区二区三区视频 | 国产精品中文字幕在线 | 一级视频黄色 | 爱爱爱av| 国产精品高潮呻吟久久 | 久久亚洲一区二区三区四区 | 日日操av| 日韩中文字幕区 | 99精品视频一区二区三区 | 中文字幕一区二区三区在线视频 | 亚洲午夜精品一区二区三区 | 精品九九在线 | 1级黄色大片 | 黄色a级一级片 | 蜜桃久久 | 欧美a区 | 四虎影音| 国产一区二区三区在线 | 欧洲一区二区视频 | 尤物在线精品视频 | 国产精品99久久久久久www | av 一区二区三区 | 97视频免费 | 日本成人二区 | www.成人免费视频 | 精品一级 | 韩国毛片一区二区三区 | 久久青草av| 婷婷福利 | 国产成在线观看免费视频 | 91久久精品国产免费一区 | 91精品国产综合久久国产大片 |