国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

基于串口通信技術(shù)——讓數(shù)碼管顯示的數(shù)據(jù)發(fā)送給電腦,電腦控制單片機(jī)外設(shè)——15單片機(jī)

這篇具有很好參考價值的文章主要介紹了基于串口通信技術(shù)——讓數(shù)碼管顯示的數(shù)據(jù)發(fā)送給電腦,電腦控制單片機(jī)外設(shè)——15單片機(jī)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

目錄

1.使用的單片機(jī)為IAPI15F2K61S2

2.使用的外設(shè)

3.各個外設(shè)的作用

1.數(shù)碼管功能

?2.LED燈

3.蜂鳴器與繼電器

4.按鍵

5.串口通信

4.利用發(fā)送單個字符函數(shù)

發(fā)送字符型的數(shù)字值,為一個變量+'0',發(fā)送為字符型數(shù)字。

4.初始化

5.程序

1.main

2.iic.h

3.onewire.c


1.使用的單片機(jī)為IAPI15F2K61S2

2.使用的外設(shè)

1.LED燈,繼電器與蜂鳴器。

2.數(shù)碼管與按鍵。

3.DS18B20 和PCF85911。

4.串口通信。

3.各個外設(shè)的作用

1.數(shù)碼管功能

1.顯示室溫的溫度與轉(zhuǎn)口的電壓相互切換。

基于串口通信技術(shù)——讓數(shù)碼管顯示的數(shù)據(jù)發(fā)送給電腦,電腦控制單片機(jī)外設(shè)——15單片機(jī)

?2.LED燈

1.處于溫度顯示界面時,LED1燈亮。

2.處于電壓顯示界面時,LED2燈亮。

3.處于鎖定界面時,LED3為0.1s為周期。

3.蜂鳴器與繼電器

1.電壓大于3.60時蜂鳴器響。

2.溫度大于28.0度時繼電器吸合。

4.按鍵

1.S4按鍵按下為鎖定,串口發(fā)送不能控制單片機(jī)。

2.S5按鍵按下為解除鎖定。

3.S12按鍵按下串口發(fā)送當(dāng)時數(shù)碼管顯示的數(shù)值,只在鎖定的界面有效。

5.串口通信

1.串口發(fā)送'A',數(shù)碼管顯示溫度界面,并且收到當(dāng)時的溫度。

2.串口發(fā)送'B',數(shù)碼管顯示電壓界面,并且收到當(dāng)時的電壓。

3.返回的格式,溫度:25.2C,電壓:2.33V。

4.利用發(fā)送單個字符函數(shù)

發(fā)送字符型的數(shù)字值,為一個變量+'0',發(fā)送為字符型數(shù)字。

4.初始化

1.默認(rèn)為溫度顯示界面

2.蜂鳴器與繼電器關(guān)閉。

5.程序

1.main

#include <STC15F2K60S2.H>
#include "iic.h"
#include "onewire.h"

int ds18b20_ms; //溫度計時
int adc_ms;     //電壓計時
int led_ms;     //燈計時

void Timer2Init(void)		//1ms@12.000MHz
{
	AUXR &= 0xFB;		//定時器時鐘12T模式
	T2L = 0x20;		//設(shè)置定時初始值
	T2H = 0xD1;		//設(shè)置定時初始值
	AUXR |= 0x10;		//定時器2開始計時
    EA=1;
    IE2|=0x04;
}

void Delay1ms(int xms)		//@12.000MHz
{
	unsigned char i, j;
    while(xms--)
    {
    i = 12;
	j = 169;
	do
	{
		while (--j);
	} while (--i);
    }
	
}


void Device(unsigned char p2,unsigned char p0)
{
    P0=p0;
    P2=P2&0x1f|p2;
    P2=P2&0x1f;
}
//初始化關(guān)閉led燈和蜂鳴器與繼電器
void system()
{
    Device(0xa0,0);
    Device(0x80,0xff);
}
//                    0~9 U .
unsigned char nixie[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x3E,0x80};
    
void smg(unsigned n,unsigned m)
{
    int a;
    a=0x01<<n;
    Device(0xc0,0);
    Device(0xe0,~nixie[m]);
    Device(0xc0,a);
    
}

int wdl;//接收溫度
void wd()
{
    if(ds18b20_ms>=10)//10毫秒刷新一次
    {
        wdl=ds18b20_read();
        ds18b20_ms=0;
    }

}

unsigned char adc_255;//接收電壓
int adc_500;//轉(zhuǎn)換后的電壓
void adc_dq()
{
    if(adc_ms>10)
    {
        
        adc_255=ADC(0x43);
        adc_ms=0;
    }
    
    adc_500=adc_255*100/51;
}

char model=0;//顯示狀態(tài)
void smg_show()
{
    //溫度
    if(model==0)
    {
        smg(0,10);
        smg(1,1);
        
        smg(5,wdl/100);
        smg(6,wdl/10%10);
        smg(6,11);
        smg(7,wdl%10);
    }
    
    //電壓
    if(model==1)
    {
        smg(0,10);
        smg(1,2);
        
        smg(5,adc_500/100);
        smg(5,11);
        smg(6,adc_500/10%10);
        smg(7,adc_500%10);
    }
    
}

void UartInit(void)		//9600bps@12.000MHz
{
	SCON = 0x50;		//8位數(shù)據(jù),可變波特率
	AUXR |= 0x40;		//定時器時鐘1T模式
	AUXR &= 0xFE;		//串口1選擇定時器1為波特率發(fā)生器
	TMOD &= 0x0F;		//設(shè)置定時器模式
	TL1 = 0xC7;		//設(shè)置定時初始值
	TH1 = 0xFE;		//設(shè)置定時初始值
	ET1 = 0;		//禁止定時器%d中斷
	TR1 = 1;		//定時器1開始計時
    ES=1;
    EA=1;
}

char coude=0;//判斷是否鎖定
void Senart(char p)//發(fā)送一個字符
{
    SBUF =p;
    while(TI==0);
    TI=0;
}

void senartstring( char* b)//發(fā)送字符串
{
    char s=0;
  do
  {
  Senart(*(b+s));
      s++;
  }while(*(b+s)!='\0');
      
}

unsigned char cn;//接收串口發(fā)送的數(shù)據(jù)
void key()//按鍵
{
    P44=0;P42=1;P3=0xFF;
    //s4
    if(P33==0){Delay1ms(1);if(P33==0){ coude=1;while(P33==0){}}}
    //s5
    if(P32==0){Delay1ms(1);if(P32==0){ coude=0;while(P32==0){}}}
    //s12
     if(coude==1)
     {
     P4=0xff;P3=0xDF;
    if(P33==0){Delay1ms(1);if(P33==0)
    { if(model==0){senartstring("溫度:"); Senart( wdl/100+'0');Senart( wdl/10%10+'0') ;senartstring(".");Senart( wdl%10+'0') ; senartstring("C"); }
      if(model==1){senartstring("電壓:"); Senart( adc_500/100+'0');senartstring(".");Senart( adc_500/10%10+'0');Senart( adc_500%10+'0') ;  senartstring("V"); }    
    while(P33==0){}}}    
     }
    
}

void u1() interrupt 4
{
    
    if(RI==1)
    {
    cn=SBUF;
    if(coude==0)
    {
    switch(cn)
    {
        case 'A':model=0;senartstring("溫度:"); Senart( wdl/100+'0');Senart( wdl/10%10+'0') ;senartstring(".");Senart( wdl%10+'0') ;senartstring("C");break;
        case 'B':model=1;senartstring("電壓:"); Senart( adc_500/100+'0');senartstring(".");Senart( adc_500/10%10+'0');Senart( adc_500%10+'0') ;senartstring("V");break;    
    }
    
    }
    
    RI=0;//清除中斷標(biāo)志位
    }
}
char i=0;//用led閃
void LED()
{
    if(model==0&&coude==0)
    Device(0x80,~0x01);
    
    if(model==1&&coude==0)
    Device(0x80,~0x02);
    
    if(coude==1)
    {
    
    if(led_ms>500&&i==0)
    {
        led_ms=0;
        Device(0x80,~0x04);
        i++;
        i=i%2;
    }
    if(led_ms>500&&i==1)
    {
        led_ms=0;
        Device(0x80,0xff);
        i++;
        i=i%2;
    }
    }
}
void bj()//報警函數(shù)
{
    //溫度大于28時
    if(wdl>280)
    {
    Device(0xa0,0x10);
    }
    else
    {
    Device(0xa0,0);
    }
    //電壓大于3.60時
    if(adc_500>360)
    {
    Device(0xa0,0x40);
    }
    else
    {
    Device(0xa0,0);
    }
}


void main()   
{
    Timer2Init();
     system();
     UartInit()	;
    while(1)
    {
     smg_show();
      
      bj();
    }
    
}

void t2() interrupt 12
{
     ds18b20_ms++;
     adc_ms++;
     led_ms++;
     wd();
     adc_dq();
     LED();
     key();
}

2.iic.c

#include "reg52.h"
#include "intrins.h"

#define DELAY_TIME 5

#define SlaveAddrW 0xA0
#define SlaveAddrR 0xA1

//總線引腳定義
sbit SDA = P2^1;  /* 數(shù)據(jù)線 */
sbit SCL = P2^0;  /* 時鐘線 */

void IIC_Delay(unsigned char i)
{
    do{_nop_();}
    while(i--);        
}
//總線啟動條件
void IIC_Start(void)
{
    SDA = 1;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 0;
    IIC_Delay(DELAY_TIME);
    SCL = 0;	
}

//總線停止條件
void IIC_Stop(void)
{
    SDA = 0;
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//發(fā)送應(yīng)答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:應(yīng)答,1:非應(yīng)答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

//等待應(yīng)答
bit IIC_WaitAck(void)
{
    bit ackbit;
	
    SCL  = 1;
    IIC_Delay(DELAY_TIME);
    ackbit = SDA;
    SCL = 0;
    IIC_Delay(DELAY_TIME);
    return ackbit;
}

//通過I2C總線發(fā)送數(shù)據(jù)
void IIC_SendByte(unsigned char byt)
{
    unsigned char i;

    for(i=0; i<8; i++)
    {
        SCL  = 0;
        IIC_Delay(DELAY_TIME);
        if(byt & 0x80) SDA  = 1;
        else SDA  = 0;
        IIC_Delay(DELAY_TIME);
        SCL = 1;
        byt <<= 1;
        IIC_Delay(DELAY_TIME);
    }
    SCL  = 0;  
}

//從I2C總線上接收數(shù)據(jù)
unsigned char IIC_RecByte(void)
{
    unsigned char i, da;
    for(i=0; i<8; i++)
    {   
    	SCL = 1;
	IIC_Delay(DELAY_TIME);
	da <<= 1;
	if(SDA) da |= 1;
	SCL = 0;
	IIC_Delay(DELAY_TIME);
    }
    return da;    
}

 char ADC(char a)
{
    char ad;
    IIC_Start();
    IIC_SendByte(0x90);
    IIC_WaitAck();
    IIC_SendByte(a);
    IIC_WaitAck();
    
    IIC_Start();
    IIC_SendByte(0x91);
    IIC_WaitAck();
    
    ad=IIC_RecByte();
    IIC_SendAck(1);
    IIC_Stop();
    
    return ad;
    
}

2.iic.h

#ifndef _IIC_H
#define _IIC_H

unsigned char ADC(char a);

#endif

3.onewire.c

#include "reg52.h"

sbit DQ = P1^4;  //單總線接口

//單總線延時函數(shù)
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
    t=t*12;
	while(t--);
}

//通過單總線向DS18B20寫一個字節(jié)
void Write_DS18B20(unsigned char dat)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		DQ = 0;
		DQ = dat&0x01;
		Delay_OneWire(5);
		DQ = 1;
		dat >>= 1;
	}
	Delay_OneWire(5);
}

//從DS18B20讀取一個字節(jié)
unsigned char Read_DS18B20(void)
{
	unsigned char i;
	unsigned char dat;
  
	for(i=0;i<8;i++)
	{
		DQ = 0;
		dat >>= 1;
		DQ = 1;
		if(DQ)
		{
			dat |= 0x80;
		}	    
		Delay_OneWire(5);
	}
	return dat;
}

//DS18B20設(shè)備初始化
bit init_ds18b20(void)
{
  	bit initflag = 0;
  	
  	DQ = 1;
  	Delay_OneWire(12);
  	DQ = 0;
  	Delay_OneWire(80);
  	DQ = 1;
  	Delay_OneWire(10); 
    initflag = DQ;     
  	Delay_OneWire(5);
  
  	return initflag;
}

float ds18b20_read()
{
    int hignet,low;
    float rd;
    init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0x44);
    
    init_ds18b20();
    Write_DS18B20(0xcc);
    Write_DS18B20(0xbe);
    
    low=Read_DS18B20();
    hignet=Read_DS18B20();
    
    rd=((hignet<<8)|low)*0.625;
    
     if(rd<700)   
     return rd; //除去一上電的85
    
}





3.onewire.h文章來源地址http://www.zghlxwxcb.cn/news/detail-497856.html

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

float ds18b20_read();

#endif

到了這里,關(guān)于基于串口通信技術(shù)——讓數(shù)碼管顯示的數(shù)據(jù)發(fā)送給電腦,電腦控制單片機(jī)外設(shè)——15單片機(jī)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 實(shí)驗(yàn)三 基于FPGA的數(shù)碼管動態(tài)掃描電路設(shè)計 quartus/數(shù)碼管/電路模塊設(shè)計

    實(shí)驗(yàn)三 基于FPGA的數(shù)碼管動態(tài)掃描電路設(shè)計 quartus/數(shù)碼管/電路模塊設(shè)計

    源文件的鏈接放在最后啦 實(shí)驗(yàn)?zāi)康模?(1) 熟悉7段數(shù)碼管顯示譯碼電路的設(shè)計。 (2) 掌握數(shù)碼管顯示原理及靜態(tài)、動態(tài)掃描電路的設(shè)計。 實(shí)驗(yàn)任務(wù): (1) 基本任務(wù)1:利用FPGA硬件平臺上的4位數(shù)碼管做靜態(tài)顯示,用SW0-3輸入BCD碼,用SW4-7控制數(shù)碼管位選; (2) 基本任務(wù)

    2024年02月07日
    瀏覽(25)
  • 基于51單片機(jī)的數(shù)碼管鬧鐘設(shè)計

    基于51單片機(jī)的數(shù)碼管鬧鐘設(shè)計

    系統(tǒng)功能:利用定時器實(shí)現(xiàn)時鐘,時鐘可以通過獨(dú)立按鍵設(shè)置,設(shè)有一個鬧鐘,鬧鐘時間可通過按鍵進(jìn)行設(shè)置,時鐘界面和鬧鐘界面可通過按鍵切換,當(dāng)時鐘和鬧鐘時間相同,蜂鳴器響,提示鬧鐘時間到等。 此系統(tǒng)重點(diǎn)在于:數(shù)碼管動態(tài)驅(qū)動的使用方法,單片機(jī)內(nèi)部定時器的

    2024年02月11日
    瀏覽(15)
  • 基于FPGA的超聲波測距——數(shù)碼管顯示

    基于FPGA的超聲波測距——數(shù)碼管顯示

    環(huán)境: 1、Quartus18.1 2、vscode 3、板子型號:EP4CE6F17C8N 4、超聲波模塊:HC_SR04 要求: 使用 EP4CE6F17C8開發(fā)板驅(qū)動 超聲波檢測模塊(HC_SR04 ),并將所測得數(shù)據(jù)顯示到開發(fā)板上的數(shù)碼管上 HC-SR04超聲波測距模塊可提供2cm-400cm的非接觸式距離感測功能,測距精度可達(dá)高到3mm;模塊包括超

    2024年02月06日
    瀏覽(18)
  • 43、基于51單片機(jī)數(shù)碼管溫控溫度控制風(fēng)扇系統(tǒng)設(shè)計

    43、基于51單片機(jī)數(shù)碼管溫控溫度控制風(fēng)扇系統(tǒng)設(shè)計

    溫控風(fēng)扇在現(xiàn)代社會中的生產(chǎn)以及人們的日常生活中都有廣泛的應(yīng)用,如工業(yè)生產(chǎn)中大型機(jī)械散熱系統(tǒng)中的風(fēng)扇、現(xiàn)在筆記本電腦上的廣泛應(yīng)用的智能CPU風(fēng)扇等。本文設(shè)計了基于單片機(jī)的溫控風(fēng)扇系統(tǒng),采用單片機(jī)作為控制器,利用溫度傳感器DS18B20作為溫度采集元件,并根據(jù)

    2024年02月04日
    瀏覽(21)
  • 基于STM32的四位數(shù)碼管計數(shù)器設(shè)計與實(shí)現(xiàn)

    基于STM32的四位數(shù)碼管計數(shù)器設(shè)計與實(shí)現(xiàn)

    ?作者簡介:熱愛科研的嵌入式開發(fā)者,修心和技術(shù)同步精進(jìn), 代碼獲取、問題探討及文章轉(zhuǎn)載可私信。 ???愿你的生命中有夠多的云翳,來造就一個美麗的黃昏。 ??獲取更多嵌入式資料可點(diǎn)擊鏈接進(jìn)群領(lǐng)取,謝謝支持!?? 點(diǎn)擊領(lǐng)取更多詳細(xì)資料 本文介紹了一種基于STM

    2024年02月02日
    瀏覽(27)
  • 基于51單片機(jī)直流電機(jī)轉(zhuǎn)速數(shù)碼管顯示控制系統(tǒng)

    基于51單片機(jī)直流電機(jī)轉(zhuǎn)速數(shù)碼管顯示控制系統(tǒng)

    一、系統(tǒng)方案 本文主要研究了利用MCS-51系列單片機(jī)控制PWM信號從而實(shí)現(xiàn)對直流電機(jī)轉(zhuǎn)速進(jìn)行控制的方法。本文中采用了三極管組成了PWM信號的驅(qū)動系統(tǒng),并且對PWM信號的原理、產(chǎn)生方法以及如何通過軟件編程對PWM信號占空比進(jìn)行調(diào)節(jié),從而控制其輸入信號波形等均作了詳細(xì)的

    2024年02月12日
    瀏覽(28)
  • 基于51單片機(jī)的簡易6位密碼鎖(數(shù)碼管 led 矩陣)

    基于51單片機(jī)的簡易6位密碼鎖(數(shù)碼管 led 矩陣)

    ? 本文章是基于51單片機(jī)的簡易密碼鎖,無掉電保護(hù),所以沒有用到I^C總線協(xié)議,僅用到數(shù)碼管顯示,矩陣鍵盤掃描,led顯示。? ?本例程主要實(shí)現(xiàn)功能為:定義一個六位數(shù)的初始密碼,用矩陣輸入,輸入正確后led被點(diǎn)亮,錯誤不點(diǎn)亮;摁下任意一個按鍵蜂鳴器發(fā)出聲音,松下

    2024年02月11日
    瀏覽(23)
  • 基于FPGA的四位數(shù)碼管顯示按鍵計數(shù)器設(shè)計(verilog編程)

    基于FPGA的四位數(shù)碼管顯示按鍵計數(shù)器設(shè)計(verilog編程)

    軟件:Vivado 2022.2 硬件:BASYS 3 設(shè)計描述:通過開發(fā)板上的四個按鍵,按下一次記數(shù)加一,分別由四個數(shù)碼管從左到右分別顯示四個按鍵記數(shù)情況。 例: 1.初始值為0000,意為無記數(shù) 2.當(dāng)按下第一個按鍵,記數(shù)加一,數(shù)碼管顯示1000 3.再次按下一第一個按鍵,記數(shù)加一,數(shù)碼管顯

    2024年02月08日
    瀏覽(34)
  • 基于STM32單片機(jī)的溫度報警器(數(shù)碼管)(Proteus仿真+程序)

    基于STM32單片機(jī)的溫度報警器(數(shù)碼管)(Proteus仿真+程序)

    ? ? ? ? 本設(shè)計由STM32F103單片機(jī)最小系統(tǒng)+DS18B20溫度傳感器+數(shù)碼管顯示模塊+聲光報警模塊+獨(dú)立按鍵組成。 1、主控制器是STM32F103單片機(jī) 2、DS18B20溫度傳感器測量溫度 3、數(shù)碼管顯示溫度值,精度0.1攝氏度 4、三個按鍵可設(shè)置溫度上限、下限報警值,溫度超過上限、或者溫度低

    2024年02月07日
    瀏覽(46)
  • 基于51單片機(jī)的波形發(fā)生器proteus仿真數(shù)碼管LCD12864顯示

    基于51單片機(jī)的波形發(fā)生器proteus仿真數(shù)碼管LCD12864顯示

    仿真圖1簡介: 本系統(tǒng)采用51單片機(jī)作為系統(tǒng)的MCU(具體型號見下圖),該系統(tǒng)顯示器為四位數(shù)碼管,可實(shí)時顯示波形的參數(shù)情況 可顯示四種波形,分別是方波、正弦波、三角波、鋸齒波。 該設(shè)計具有電壓表功能,可顯示當(dāng)前所測電壓參數(shù),其中ADC芯片采用的是PCF8591 該設(shè)計

    2023年04月08日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包