pc端通过串口助手显示温度,格式是 ‘符号(0/1)’ ‘8位2进制数(整数部分)’ ‘小数点。’ ‘8位2进制数(小数部分)’。主要是两个中断不知道用的对不对。下面是主函数
#include<stdio.h>
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "18b20.h"
bit ReadTempFlag;//定义读时间标志
unsigned char TempData[3]; //存储显示值的全局变量
void Init_
timer0(void);//定时器初始化
//void SendStr(unsigned char *s);
void InitUART (void);
/*------------------------------------------------
主函数
------------------------------------------------*/
void main (void)
{
unsigned int TempH,TempL,temp;
Init_Timer0();
InitUART();
while (1) //主循环
{
if(ReadTempFlag==1)
{
ReadTempFlag=0;
temp=ReadTemperature();
if(temp&0x8000)
{
TempData[0]=0x01;//负号标志
temp=~temp; // 取反加1
temp +=1;
}
else
TempData[0]=0;
TempH=temp>>4;
TempH&=0xFF; //8位16进制数,表示整数部分
TempL=temp&0x0F; //8位16进制数,表示小数部分
TempL=TempL*6/10;//小数近似处理
TempData[1]=TempH;
TempData[2]='.';
TempData[3]=TempL;
}
//printf("tmp is %d%d/n",TempH,TempL);
//ES = 1; //打开串口中断
}
}
/*------------------------------------------------
定时器初始化子程序
------------------------------------------------*/
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
//TH0=0x00; //给定初值
//TL0=0x00;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
/*------------------------------------------------
定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int num;
TH0=(65536-2000)/256; //重新赋值 2ms
TL0=(65536-2000)%256;
num++;
if(num==300) //
{
num=0;
ReadTempFlag=1; //读标志位置1
}
}
/*------------------------------------------------
串口初始化
------------------------------------------------*/
void InitUART (void)
{
SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收
TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装
TH1 = 0xF3; // TH1: 重装值 2400 波特率 晶振 12MHz
TL1 = 0xF3;
//delay(1);
TI=0;
RI=0;
TR1 = 1; // TR1: timer 1 打开
EA = 1; //打开总中断
ES = 1; //打开串口中断
}
void UART_SER (void) interrupt 4
{
int sendPosi=0;
if(TI)
{
TI = 0;
if(sendPosi < 4) //判断是否发送完成
{
sendPosi++; //发送一次计数器加一
SBUF = TempData[sendPosi];//启动发送
}
}
}
看贴回帖是一种美德
一周热门 更多>