基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机

这篇具有很好参考价值的文章主要介绍了基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1.使用的单片机为IAPI15F2K61S2

2.使用的外设

3.各个外设的作用

1.数码管功能

 2.LED灯

3.蜂鸣器与继电器

4.按键

5.串口通信

4.利用发送单个字符函数

发送字符型的数字值,为一个变量+'0',发送为字符型数字。

4.初始化

5.程序

1.main

2.iic.h

3.onewire.c


1.使用的单片机为IAPI15F2K61S2

2.使用的外设

1.LED灯,继电器与蜂鸣器。

2.数码管与按键。

3.DS18B20 和PCF85911。

4.串口通信。

3.各个外设的作用

1.数码管功能

1.显示室温的温度与转口的电压相互切换。

基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机

 2.LED灯

1.处于温度显示界面时,LED1灯亮。

2.处于电压显示界面时,LED2灯亮。

3.处于锁定界面时,LED3为0.1s为周期。

3.蜂鸣器与继电器

1.电压大于3.60时蜂鸣器响。

2.温度大于28.0度时继电器吸合。

4.按键

1.S4按键按下为锁定,串口发送不能控制单片机。

2.S5按键按下为解除锁定。

3.S12按键按下串口发送当时数码管显示的数值,只在锁定的界面有效。

5.串口通信

1.串口发送'A',数码管显示温度界面,并且收到当时的温度。

2.串口发送'B',数码管显示电压界面,并且收到当时的电压。

3.返回的格式,温度:25.2C,电压:2.33V。

4.利用发送单个字符函数

发送字符型的数字值,为一个变量+'0',发送为字符型数字。

4.初始化

1.默认为温度显示界面

2.蜂鸣器与继电器关闭。

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;		//设置定时初始值
	T2H = 0xD1;		//设置定时初始值
	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;
}
//初始化关闭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;//转换后的电压
void adc_dq()
{
    if(adc_ms>10)
    {
        
        adc_255=ADC(0x43);
        adc_ms=0;
    }
    
    adc_500=adc_255*100/51;
}

char model=0;//显示状态
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位数据,可变波特率
	AUXR |= 0x40;		//定时器时钟1T模式
	AUXR &= 0xFE;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0F;		//设置定时器模式
	TL1 = 0xC7;		//设置定时初始值
	TH1 = 0xFE;		//设置定时初始值
	ET1 = 0;		//禁止定时器%d中断
	TR1 = 1;		//定时器1开始计时
    ES=1;
    EA=1;
}

char coude=0;//判断是否锁定
void Senart(char p)//发送一个字符
{
    SBUF =p;
    while(TI==0);
    TI=0;
}

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

unsigned char cn;//接收串口发送的数据
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;//清除中断标志位
    }
}
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()//报警函数
{
    //温度大于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;  /* 数据线 */
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);
}

//发送应答
void IIC_SendAck(bit ackbit)
{
    SCL = 0;
    SDA = ackbit;  					// 0:应答,1:非应答
    IIC_Delay(DELAY_TIME);
    SCL = 1;
    IIC_Delay(DELAY_TIME);
    SCL = 0; 
    SDA = 1;
    IIC_Delay(DELAY_TIME);
}

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

//通过I2C总线发送数据
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总线上接收数据
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;  //单总线接口

//单总线延时函数
void Delay_OneWire(unsigned int t)  //STC89C52RC
{
    t=t*12;
	while(t--);
}

//通过单总线向DS18B20写一个字节
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读取一个字节
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设备初始化
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文章来源地址https://www.toymoban.com/news/detail-497856.html

#ifndef __ONEWIRE_H
#define __ONEWIRE_H

float ds18b20_read();

#endif

到了这里,关于基于串口通信技术——让数码管显示的数据发送给电脑,电脑控制单片机外设——15单片机的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 实验三 基于FPGA的数码管动态扫描电路设计 quartus/数码管/电路模块设计

    源文件的链接放在最后啦 实验目的: (1) 熟悉7段数码管显示译码电路的设计。 (2) 掌握数码管显示原理及静态、动态扫描电路的设计。 实验任务: (1) 基本任务1:利用FPGA硬件平台上的4位数码管做静态显示,用SW0-3输入BCD码,用SW4-7控制数码管位选; (2) 基本任务

    2024年02月07日
    浏览(39)
  • 基于51单片机的数码管闹钟设计

    系统功能:利用定时器实现时钟,时钟可以通过独立按键设置,设有一个闹钟,闹钟时间可通过按键进行设置,时钟界面和闹钟界面可通过按键切换,当时钟和闹钟时间相同,蜂鸣器响,提示闹钟时间到等。 此系统重点在于:数码管动态驱动的使用方法,单片机内部定时器的

    2024年02月11日
    浏览(35)
  • 基于FPGA的超声波测距——数码管显示

    环境: 1、Quartus18.1 2、vscode 3、板子型号:EP4CE6F17C8N 4、超声波模块:HC_SR04 要求: 使用 EP4CE6F17C8开发板驱动 超声波检测模块(HC_SR04 ),并将所测得数据显示到开发板上的数码管上 HC-SR04超声波测距模块可提供2cm-400cm的非接触式距离感测功能,测距精度可达高到3mm;模块包括超

    2024年02月06日
    浏览(25)
  • 基于STM32的四位数码管计数器设计与实现

    ✅作者简介:热爱科研的嵌入式开发者,修心和技术同步精进, 代码获取、问题探讨及文章转载可私信。  ☁ 愿你的生命中有够多的云翳,来造就一个美丽的黄昏。 🍎获取更多嵌入式资料可点击链接进群领取,谢谢支持!👇 点击领取更多详细资料 本文介绍了一种基于STM

    2024年02月02日
    浏览(35)
  • 基于51单片机直流电机转速数码管显示控制系统

    一、系统方案 本文主要研究了利用MCS-51系列单片机控制PWM信号从而实现对直流电机转速进行控制的方法。本文中采用了三极管组成了PWM信号的驱动系统,并且对PWM信号的原理、产生方法以及如何通过软件编程对PWM信号占空比进行调节,从而控制其输入信号波形等均作了详细的

    2024年02月12日
    浏览(33)
  • 43、基于51单片机数码管温控温度控制风扇系统设计

    温控风扇在现代社会中的生产以及人们的日常生活中都有广泛的应用,如工业生产中大型机械散热系统中的风扇、现在笔记本电脑上的广泛应用的智能CPU风扇等。本文设计了基于单片机的温控风扇系统,采用单片机作为控制器,利用温度传感器DS18B20作为温度采集元件,并根据

    2024年02月04日
    浏览(45)
  • 基于FPGA的四位数码管显示按键计数器设计(verilog编程)

    软件:Vivado 2022.2 硬件:BASYS 3 设计描述:通过开发板上的四个按键,按下一次记数加一,分别由四个数码管从左到右分别显示四个按键记数情况。 例: 1.初始值为0000,意为无记数 2.当按下第一个按键,记数加一,数码管显示1000 3.再次按下一第一个按键,记数加一,数码管显

    2024年02月08日
    浏览(37)
  • 基于51单片机的简易6位密码锁(数码管 led 矩阵)

      本文章是基于51单片机的简易密码锁,无掉电保护,所以没有用到I^C总线协议,仅用到数码管显示,矩阵键盘扫描,led显示。   本例程主要实现功能为:定义一个六位数的初始密码,用矩阵输入,输入正确后led被点亮,错误不点亮;摁下任意一个按键蜂鸣器发出声音,松下

    2024年02月11日
    浏览(27)
  • 基于STM32单片机的温度报警器(数码管)(Proteus仿真+程序)

            本设计由STM32F103单片机最小系统+DS18B20温度传感器+数码管显示模块+声光报警模块+独立按键组成。 1、主控制器是STM32F103单片机 2、DS18B20温度传感器测量温度 3、数码管显示温度值,精度0.1摄氏度 4、三个按键可设置温度上限、下限报警值,温度超过上限、或者温度低

    2024年02月07日
    浏览(42)
  • 基于RASC的keil电子时钟制作(瑞萨RA)(6)----定时器驱动数码管

    要想让每个数码管显示不同的数字,但是数码管必须依次地被持续驱动,数码管之间的刷新速度应该足够快,这样就看不出来数码管之间在闪烁。刷新频率可以设置为2ms刷新一次,这样人眼就看不出闪烁了。 首先需要准备一个开发板,这里我准备的是芯片型号R7FA2E1A72DFL的开

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包