51单片机基础——串口发送66,数码管显示66


#include <reg52.h>
#include<intrins.h>    //位移头文件_crol_
#define uchar unsigned char
unsigned char flag,i;

sbit wei1=P2^4;//定义第一位LED显示器
sbit wei2=P2^5;//定义第二位LED显示器
sbit wei3=P2^6;//定义第一位LED显示器
sbit wei4=P2^7;//定义第二位LED显示器
char w='0';
char wu[15];
int k=0;
int q=0;
void receive() interrupt 4 //串口中断服务程序
{
	if(RI==1){
	RI=0;   //重新清0等待接收
	w=SBUF;//接收电脑传输过来的数据
	wu[k]=w; //将W的值赋给wu数组
	k++;
	
	SBUF=w;//单片机把接收到的数据返回给电脑	
		
	TI=0;	//清除发送中断标志位
	}
}

//P0共阴极数码管编码表  //****(用P0=)表示;【在显示屏上显示数字(字母)1——F——不显示】
uchar code gy[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                    0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};      //***高电平“1”亮


 
void init(){

SCON=0x50;//串口控制寄存器,等价于SM0=0,SM1=1,SM2=0,串口方式一通信
TMOD=0X20;    //设置定时器1为模式2,做为波特率发生器,8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1
TH1=0xfd;//设置波特率为9600
TL1=0xfd;	
REN=1;//允许串口接收中断?
EA=1;//开全局中断
ES=1;//串口中断允许	
TR1=1;     //启动波特率发生器
}



void delay(unsigned int xms)
{
unsigned int i,j;
	for(i=xms;i>0;i--)
	for(j=112;j>0;j--);
}


void main()  
{
	
	init();
	 wei1=1;
	 wei2=1;
	 wei3=0;
	 wei4=0;

 while(1)
	{ 


			if(w=='\n') //当发送了新行时,
			{
				k=0; //数组里的元素清零
				for(q=0;q<20;q++)
				{
					wu[q]=0;
				}
				q=0;
			}


		  if(wu[0]=='6'&&wu[1]=='6') 
			{  
				k=0; //数组里的元素清零
				while(1)
				{
					P0=0x7d;	
				}
			 }		

		
			
	}
}


  • 2
    点赞
  • 63
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于51单片机与mlx90614将温度显示到lcd1602显示器上的程序代码: ```c #include <reg51.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #include "lcd1602.h" #define FOSC 11059200L //晶振频率 #define BAUD 9600 //串口波特率 #define PRESCALER 12 //定时器1分频系数 #define T1MS (65536-FOSC/1000/PRESCALER) //定时器1的重载值 #define DELAY_MS(x) {unsigned int i; for(i=0;i<x;i++) Delay1ms();} //延时函数 sbit SDA=P1^1; //IIC数据线 sbit SCL=P1^0; //IIC时钟线 sbit ADDR0=P1^2; //IIC地址位 sbit ADDR1=P1^3; //IIC地址位 unsigned char code Init_Temp[]={0x02,0x00,0x00,0x00,0x01,0x60,0x00,0x01}; //初始化命令 unsigned char code Read_Temp[]={0x02,0x00,0x00,0x00,0x00,0x60,0x02,0x00}; //读取温度命令 unsigned char IIC_Start(void); //IIC总线起始信号 void IIC_Stop(void); //IIC总线停止信号 void IIC_SendByte(unsigned char byte); //IIC发送字节 unsigned char IIC_RecvByte(void); //IIC接收字节 unsigned char MLX90614_Init(void); //初始化mlx90614温度传感器 float MLX90614_ReadTemp(void); //从mlx90614传感器读取温度数据 void Delay1ms(void); //1ms延时函数 void InitUART(void); //初始化UART void SendChar(unsigned char ch); //发送字符 void SendString(unsigned char *s); //发送字符串 void SendFloat(float num, unsigned char point); //发送浮点数 void main(void) { float temperature; unsigned char str[20]; LCD1602_Init(); //初始化LCD1602显示器 InitUART(); //初始化UART MLX90614_Init(); //初始化mlx90614温度传感器 while(1) { temperature = MLX90614_ReadTemp(); //从mlx90614传感器读取温度数据 sprintf(str, "Temp: %.1f C", temperature); //将温度数据格式化为字符串 LCD1602_WriteString(0, 0, str); //在LCD1602显示器上显示温度数据 SendString(str); //通过串口发送温度数据 DELAY_MS(1000); //延时1s } } unsigned char IIC_Start(void) { SDA=1; SCL=1; DELAY_MS(1); if(!SDA) return 0; SDA=0; DELAY_MS(1); if(SDA) return 0; SCL=0; DELAY_MS(1); return 1; } void IIC_Stop(void) { SDA=0; SCL=1; DELAY_MS(1); SDA=1; DELAY_MS(1); } void IIC_SendByte(unsigned char byte) { unsigned char i; for(i=0; i<8; i++) { SDA = byte>>7-i & 0x01; SCL=1; DELAY_MS(1); SCL=0; DELAY_MS(1); } SDA=1; SCL=1; DELAY_MS(1); SCL=0; DELAY_MS(1); } unsigned char IIC_RecvByte(void) { unsigned char i, byte=0; SDA=1; for(i=0; i<8; i++) { byte <<= 1; SCL=1; DELAY_MS(1); byte |= SDA; SCL=0; DELAY_MS(1); } return byte; } unsigned char MLX90614_Init(void) { unsigned char i; IIC_Start(); IIC_SendByte(0xB4); if(IIC_RecvByte() != 0x00) { IIC_Stop(); return 0; } for(i=0; i<sizeof(Init_Temp); i++) { IIC_SendByte(Init_Temp[i]); if(IIC_RecvByte() != Init_Temp[i]) { IIC_Stop(); return 0; } } IIC_Stop(); return 1; } float MLX90614_ReadTemp(void) { unsigned char i; unsigned char buf[3]; float temp; IIC_Start(); IIC_SendByte(0xB4); if(IIC_RecvByte() != 0x00) { IIC_Stop(); return 0; } for(i=0; i<sizeof(Read_Temp); i++) { IIC_SendByte(Read_Temp[i]); if(IIC_RecvByte() != Read_Temp[i]) { IIC_Stop(); return 0; } } IIC_Stop(); DELAY_MS(5); IIC_Start(); IIC_SendByte(0xB5); if(IIC_RecvByte() != 0x00) { IIC_Stop(); return 0; } for(i=0; i<3; i++) { buf[i] = IIC_RecvByte(); if(i == 1) buf[i] &= 0x1F; //取温度数据的低13位 } IIC_Stop(); temp = (float)((buf[1]<<8) + buf[0]) * 0.02 - 273.15; //将温度数据转换为摄氏度 return temp; } void Delay1ms(void) { unsigned char i, j; i = T1MS / 256; j = T1MS % 256; do { while(--j); } while(--i); } void InitUART(void) { TMOD |= 0x20; //定时器1工作在模式2,8位自动重载 TH1 = 256 - FOSC/12/16/BAUD; //计算波特率重载值 TL1 = TH1; TR1 = 1; //启动定时器1 SCON = 0x50; //串口工作在模式1,允许接收 ES = 1; //允许串口中断 EA = 1; //开启总中断 } void SendChar(unsigned char ch) { SBUF = ch; while(!TI); TI = 0; } void SendString(unsigned char *s) { while(*s) { SendChar(*s++); } } void SendFloat(float num, unsigned char point) { unsigned char str[20]; sprintf(str, "%.*f", point, num); SendString(str); } void UART_ISR() interrupt 4 { if(RI) { RI = 0; } if(TI) { TI = 0; } } ``` 该程序使用了LCD1602显示器和UART串口,通过IIC总线与mlx90614温度传感器通信,实现了从mlx90614传感器读取温度数据并显示到LCD1602显示器上,并通过串口发送温度数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值