#include<stc15.h> void UartInit(void); void main() { unsigned int i; UartInit(); EA=1; ES=1; // while(1) // { // while(!RI); // RI=0; // i=SBUF; // SBUF=i; // while(!TI); // TI=0; //} //for(i=0;i<256;i++) //{ // SBUF=i; // while(!TI); // TI=0; //} // // // while(1); } void uartlsv() interrupt 4 { unsigned char i; if(RI) { RI=0; i=SBUF; if(i==35) { ES=0; for(i=65;i<91;i++) { SBUF=i; // while(!TI); // TI=0; } ES=1; } } } void UartInit(void) //115200bps@11.0592MHz { SCON = 0x50; //8位数据,可变波特率 AUXR |= 0x40; //定时器1时钟为Fosc,即1T AUXR &= 0xFE; //串口1选择定时器1为波特率发生器 TMOD &= 0x0F; //设定定时器1为16位自动重装方式 TL1 = 0xE8; //设定定时初值 TH1 = 0xFF; //设定定时初值 ET1 = 0; //禁止定时器1中断 TR1 = 1; //启动定时器1 }
时间: 2023-06-20 07:05:12 浏览: 75
这是一段8051单片机的程序,实现了串口通信功能。程序中定义了UartInit()函数用于初始化UART通信参数,main()函数中调用了该函数,并开启了全局中断和串口中断。在串口中断函数uartlsv()中,当接收到字符“#”时,关闭串口中断,循环发送从“A”到“Z”的26个字母,然后再开启串口中断。程序中还有一段注释掉的代码,分别实现了从串口接收数据并发送回去,以及循环发送0到255之间的所有数。
相关问题
#include <reg52.h> #include <intrins.h> sfr AUXR = 0x8e; sbit D5 = P2^0; void UartInit(void) { SCON = 0x50; PCON = 0x00; TMOD =0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; } void Delay1000ms() { unsigned char i, j, k; _nop_(); i = 8; j = 1; k = 243; do { do { while (--k); } while (--j); } while (--i); } void sendByte(char data_msg) { SBUF = data_msg; while(TI==0); TI =0; } void sendString(char* str) { while(*str !='\0') { sendByte(*str); str++; } } void main() { char cmd; UartInit(); while(1) { if(RI==1) { RI = 0 ; cmd = SBUF; if (cmd == 'o') { D5 =0; } if (cmd == 'f') { D5 =1; } } } }添加注释
```
#include <reg52.h> // 用于STC89C52单片机的头文件
#include <intrins.h> // 包含了一些内嵌汇编指令
sfr AUXR = 0x8e; // 定义AUXR寄存器的地址,用于控制定时器
sbit D5 = P2^0; // 定义P2口的0号引脚为D5
void UartInit(void) { // 初始化串口函数
SCON = 0x50; // SCON寄存器设置,其中SM0=0、SM1=1为模式1:8位数据,可变波特率
PCON = 0x00; // PCON寄存器设置,用于波特率的计算
TMOD = 0x20; // TMOD寄存器设置,其中M1=1,M0=0为定时器1工作模式2:8位自动重装计数器
TH1 = 0xFD; // 定时器1的初值,用于波特率的计算
TL1 = 0xFD; // 定时器1的初值,用于波特率的计算
TR1 = 1; // 启动定时器1
}
void Delay1000ms() { // 延时函数,用于控制程序执行的速度
unsigned char i, j, k;
_nop_(); // 内嵌汇编指令,用于延时
i = 8; // 根据定时器的设置,需要延时8次才能达到1秒
j = 1;
k = 243;
do {
do {
while (--k); // 内嵌汇编指令,用于延时
} while (--j);
} while (--i);
}
void sendByte(char data_msg) { // 发送单个字节的数据
SBUF = data_msg; // 将数据写入SBUF寄存器
while(TI==0); // 等待数据发送完成
TI = 0; // 发送完成后清除TI标志位
}
void sendString(char* str) { // 发送字符串
while(*str !='\0') { // 判断字符串是否结束
sendByte(*str); // 逐个字节发送
str++; // 指向下一个字节
}
}
void main() {
char cmd; // 定义接收到的指令
UartInit(); // 初始化串口
while(1) {
if(RI==1) { // 判断是否接收到数据
RI = 0 ; // 清除RI标志位
cmd = SBUF; // 获取接收到的数据
if (cmd == 'o') { // 判断是否为'o'
D5 = 0; // 如果是,将D5引脚输出低电平
}
if (cmd == 'f') { // 判断是否为'f'
D5 = 1; // 如果是,将D5引脚输出高电平
}
}
}
}
```
这是一个基于STC89C52单片机的程序,实现了串口通信和控制P2口的0号引脚(即D5)的输出状态,使其可以控制外部的电路。其中,UartInit()函数是初始化串口的,sendByte()函数是发送单个字节的数据,sendString()函数是发送字符串,main()函数是程序的主函数,通过接收串口传来的指令,判断控制D5的输出状态。
stc89c52单片机利用DS18B20测温度通过串口输出
您好,下面是stc89c52单片机利用DS18B20测温度并通过串口输出的代码示例:
```
#include <REG52.H>
#include <stdio.h>
#define DQ P2_0
sbit DQ = P2^0;
unsigned char temp[2];
unsigned int temperature;
void delay(unsigned int i)
{
while(i--);
}
void Init_DS18B20()
{
unsigned char flag=0;
DQ=1;
delay(8);
DQ=0;
delay(80);
DQ=1;
delay(12);
flag=DQ;
delay(20);
}
unsigned char ReadOneChar()
{
unsigned char i=0;
unsigned char dat=0;
for (i=8; i>0; i--)
{
DQ=0;
dat>>=1;
DQ=1;
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
void WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ=0;
DQ=dat&0x01;
dat>>=1;
delay(4);
DQ=1;
}
}
void ReadTemperature()
{
unsigned char a=0,b=0;
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0x44);
delay(500);
Init_DS18B20();
WriteOneChar(0xcc);
WriteOneChar(0xbe);
a=ReadOneChar();
b=ReadOneChar();
temperature=b;
temperature<<=8;
temperature|=a;
}
void UartInit()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
}
void UartSendStr(unsigned char *s)
{
while (*s != '\0')
{
SBUF = *s++;
while(!TI);
TI=0;
}
}
void main()
{
UartInit();
while(1)
{
ReadTemperature();
temperature = temperature * 0.0625;
sprintf(temp, "%d", temperature);
UartSendStr(temp);
UartSendStr("\r\n");
delay(1000);
}
}
void Uart() interrupt 4
{
if(RI)
{
RI=0;
}
if(TI)
{
TI=0;
}
}
```
该代码使用了stc89c52单片机和DS18B20温度传感器,通过串口将温度值输出。具体实现过程为:
1. 初始化DS18B20传感器,发送开始信号、写指令、延时等操作;
2. 读取温度值,发送读指令、读取温度等操作;
3. 将温度值转换为实际温度值;
4. 将温度值转换为字符串形式,并通过串口发送出去。
需要注意的是,串口通信的初始化需要根据具体的硬件配置进行调整。