完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
pc端通过串口助手显示温度,格式是 ‘符号(0/1)’ ‘8位2进制数(整数部分)’ ‘小数点。’ ‘8位2进制数(小数部分)’。主要是两个中断不知道用的对不对。下面是主函数
#include #include #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];//启动发送 } } } |
|
相关推荐
5个回答
|
|
|
|
|
|
int sendPosi=0;这个要放在外面的,要不每次进中断又变成0 了
|
|
|
|
你好,这个是串口中断函数,你说放在外面应该是什么位置呢? |
|
|
|
做成全局变量,
在函数里面叫局部变量,每次进入函数的时候上次的值会改变的, 你要想做成局部的然后上次的值还要保留,那就必须做成静态的,比如static int sendPosi=0; |
|
|
|
好的谢谢,我试试 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
195 浏览 0 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
172 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
453 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
697 浏览 2 评论
602 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11986 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 12:47 , Processed in 0.628097 second(s), Total 77, Slave 61 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号