完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想把数组里的4个值传个pc,下面是程序,串口助手上什么都没显示,求助下哪里改错了?
#include #include unsigned char TempData[3]; //存储显示值的全局变量 void InitUART (void); void main (void) { InitUART(); TempData[0]='-';//负号标志 TempData[1]=0xff; TempData[2]='.'; TempData[3]=0xff; while (1) //主循环 { } } void InitUART (void) { SCON = 0x50; // SCON: 模式 1, 8-bit UART, 使能接收 TMOD |= 0x20; // TMOD: timer 1, mode 2, 8-bit 重装 TH1 = 0xFA; // TH1: 重装值 9600 波特率 晶振 11.0592MHz TL1 = 0xFA; TI=0; TR1 = 1; // TR1: timer 1 打开 EA = 1; //打开总中断 ES = 1; //打开串口中断 } void UART_SER (void) interrupt 4 { static unsigned int sendPosi=0; if(TI) { TI = 0; if(sendPosi < 4) //判断是否发送完成 { SBUF = TempData[sendPosi];//启动发送 sendPosi++; //发送一次计数器加一 } } } |
|
相关推荐
|
|
网上有人帮我改了一下,把中断函数直接写到主函数的while循环里,然后就有结过了。不过因为我是想用两个中断,一个定时器0中断采集温度,再串口中断发数据的,改完后我最终的程序里发送数据给pc的时间不知道怎么控制了。我把我的程序再贴出来。#include #include #include "18b20.h" #include "delay.h" bit ReadTempFlag;//定义读时间标志 unsigned char TempData[3]; //存储显示值的全局变量 unsigned int sendPosi=0; void Init_Timer0(void);//定时器初始化 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]=0xAB;//负号标志 temp=~temp; // 取反加1 temp +=1; } else TempData[0]=0xBA; TempH=temp>>4; TempH&=0xFF; //8位2进制数,表示整数部分 TempL=temp&0x0F; //8位2进制数,表示小数部分 TempL=TempL*6/10;//小数近似处理 TempData[1]=TempH; TempData[2]=0xcd; TempData[3]=TempL; */ TempH=temp>>8; TempH&=0xFF; TempL=temp&0xFF; TempData[0]=TempH; TempData[1]=TempL; //TempData[0]=0xAA; //TempData[1]=0xBB; } if(sendPosi <2) //判断是否发送完成 { SBUF = TempData[sendPosi];//启动发送 sendPosi++; //发送一次计数器加一 while(!TI); TI=0; } if(sendPosi>=2) { DelayMs(1000); sendPosi=0; } } } /*------------------------------------------------ 定时器初始化子程序 ------------------------------------------------*/ 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 重装 //PCON |= 0x80; TH1 = 0xFD; // TH1: 重装值 9600 波特率 晶振 11.0592MHz TL1 = 0xFD; TR1 = 1; // TR1: timer 1 打开 } |
|
|
|
|
|
|
|
|
|
|
|
有区别啊!要不你把编译文件和仿真文件上传一下。否则不会有人帮你的,你想他熟悉并调试你程序不说,还需要自己建立工程,更可是的是#include "18b20.h" #include "delay.h"你让他去猜吗!你换位思考一下,是不? |
|
|
|
|
|
|
|
|
|
|
|
下面是我的工程
|
|
|
|
|
|
|
|
|
|
|
|
不好才看!工作很忙。 先说第一个程序吧,缺少一个触发条件。 你想想,如何进入中断,需要一个发送完成的条件。 也就说,你先发送一跳任意一跳就可以了。 |
|
|
|
|
|
中断中做变量是全局变量,但是我一般都放在外部一个指定区域定义,看个人,但是你的定时时间有问题啊!
我帮你改了,最下面的程序是对第一个程序中断问题的修改。
11111.zip
(153.12 KB, 下载次数: 7
)
评分
|
||||
|
||||
|
||||
|
|
|
|
|
|
5998 浏览 3 评论
7266 浏览 1 评论
7508 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
9294 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1271 浏览 0 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-21 13:24 , Processed in 0.759374 second(s), Total 72, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号