完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
单独的串口中断发送字符串和温度采集都没问题,发送实时变量data4就不行?
VECTOR ADDRESS 0xFFD4 send_string #include #include "derivative.h" /* derivative-specific definitions */ #include "18B20.h" #define CONT1 PORTK_PK3 #define CONT2 PORTK_PK2 #define CONT3 PORTK_PK1 #define CONT4 PORTK_PK0 #define CONT1_dir DDRK_DDRK3 #define CONT2_dir DDRK_DDRK2 #define CONT3_dir DDRK_DDRK1 #define CONT4_dir DDRK_DDRK0 #define DATA PTP #define DATA_dir DDRP #define LEDCPU PORTK_PK4 #define LEDCPU_dir DDRK_DDRK4 #define BUS_CLOCK 32000000 //总线频率 #define OSC_CLOCK 16000000 //晶振频率 #define BAUD 9600 unsigned int wendu; unsigned int zhengshu,xiaoshu; byte data1 = 0; byte data2 = 10; byte data3 = 0; byte data4 = 0x00; byte single = 1; byte shuma[20]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, //0~9对应的段码 0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //0~9后加小数点对应的段码 unsigned char putstring[]="http:/|shop62148944.taobao.comrn"; unsigned char *send; /*************************************************************/ /* 初始化锁相环 */ /*************************************************************/ void INIT_PLL(void) { CLKSEL &= 0x7f; //set OSCCLK as sysclk PLLCTL &= 0x8F; //Disable PLL circuit CRGINT &= 0xDF; #if(BUS_CLOCK == 40000000) SYNR = 0x44; #elif(BUS_CLOCK == 32000000) SYNR = 0x43; #elif(BUS_CLOCK == 24000000) SYNR = 0x42; #endif REFDV = 0x81; //PLLCLK=2×OSCCLK×(SYNR+1)/(REFDV+1)=64MHz ,fbus=32M PLLCTL =PLLCTL|0x70; //Enable PLL circuit asm NOP; asm NOP; while(!(CRGFLG&0x08)); //PLLCLK is Locked already CLKSEL |= 0x80; //set PLLCLK as sysclk } /************************************************************/ /* 初始化ECT模块 */ /************************************************************/ void initialize_ect(void){ ECT_TSCR1_TFFCA = 1; // 定时器标志位快速清除 ECT_TSCR1_TEN = 1; // 定时器使能位. 1=允许定时器正常工作; 0=使主定时器不起作用(包括计数器) ECT_TIOS = 0xff; //指定所有通道为输出比较方式 ECT_TCTL1 = 0x00; // 后四个通道设置为定时器与输出引脚断开 ECT_TCTL2 = 0x00; // 前四个通道设置为定时器与输出引脚断开 ECT_DLYCT = 0x00; // 延迟控制功能禁止 ECT_ICOVW = 0x00; // 对应的寄存器允许被覆盖; NOVWx = 1, 对应的寄存器不允许覆盖 ECT_ICSYS = 0x00; // 禁止IC及PAC的保持寄存器 ECT_TIE = 0x01; // 允许通道0定时中断 ECT_TSCR2 = 0x07; // 预分频系数pr2-pr0:111,,时钟周期为4us, ECT_TFLG1 = 0xff; // 清除各IC/OC中断标志位 ECT_TFLG2 = 0xff; // 清除自由定时器中断标志位 } /*************************************************************/ /* 延时函数2 */ /*************************************************************/ void delay1ms(unsigned int n) { unsigned int i; for(i=0;i { ECT_TFLG1_C1F = 1; //清除标志位 ECT_TC1 = ECT_TCNT + 250; //设置输出比较时间为1ms while(ECT_TFLG1_C1F == 0); //等待,直到发生输出比较事件 } } /*************************************************************/ /* 初始化端口 */ /*************************************************************/ void INIT_port(void) { CONT1_dir = 1; CONT2_dir = 1; CONT3_dir = 1; CONT4_dir = 1; CONT1 = 0; CONT2 = 0; CONT3 = 0; CONT4 = 0; DATA_dir = 0xff; DATA = 0x00; } /*************************************************************/ /* 初始化SCI */ /*************************************************************/ void INIT_SCI(void) { SCI1BD = BUS_CLOCK/16/BAUD; //设置SCI0波特率为9600 SCI1CR1 = 0x00; //设置SCI0为正常模式,八位数据位,无奇偶校验 SCI1CR2 = 0x88; //允许发送数据,允许发送中断功能 } /*************************************************************/ /* 串口发送函数 */ /*************************************************************/ void SCI_send(unsigned char data) { while(!SCI1SR1_TDRE); //等待发送数据寄存器(缓冲器)为空 SCI1DRL = data; } /*************************************************************/ /* 串口中断发送字符串函数 */ /*************************************************************/ #pragma CODE_SEG __NEAR_SEG NON_BANKED interrupt void send_string(void) { if(*send!=0x00) //判断字符串是否发送完毕 SCI_send(*send); else //send = putstring; send = &data4; } //#pragma CODE_SEG DEFAULT /*************************************************************/ /* 中断扫描函数 */ /*************************************************************/ //#pragma CODE_SEG __NEAR_SEG NON_BANKED /* interrupt void scan(void) { if(ECT_TFLG1_C0F == 1) { ECT_TFLG1_C0F = 1; ECT_TC0 = ECT_TCNT + 1250; //设置输出比较时间为5ms } switch(single) { case 1: CONT1 = 1; CONT2 = 0; CONT3 = 0; CONT4 = 0; if(data1==20) DATA=0x40; else if(data1==0) DATA=0; else DATA=shuma[data1]; break; case 2: CONT1 = 0; CONT2 = 1; CONT3 = 0; CONT4 = 0; DATA=shuma[data2]; break; case 3: CONT1 = 0; CONT2 = 0; CONT3 = 1; CONT4 = 0; DATA=shuma[data3]; break; case 4: CONT1 = 0; CONT2 = 0; CONT3 = 0; CONT4 = 1; DATA=shuma[data4]; break; default: break; } single +=1; if(single == 5) single = 1; } */ #pragma CODE_SEG DEFAULT /*************************************************************/ /* 设置中断优先级 */ /*************************************************************/ void Interrupt_Priorrity_Set(void) { INT_CFADDR=0xE0; INT_CFDATA7=0x06; INT_CFADDR=0xD0; INT_CFDATA2=0x05; } /*************************************************************/ /* 主函数 */ /*************************************************************/ void main(void) { DisableInterrupts; INIT_PLL(); //initialize_ect(); //Interrupt_Priorrity_Set(); //INIT_port(); INIT_SCI(); LEDCPU_dir=1; LEDCPU=0; send = &data4; //send = putstring; EnableInterrupts; delay1ms(1000); wendu=read_T(); //读取温度值 for(;;) { delay1ms(1000); wendu=read_T(); //读取温度值 //send = &data4; //SCI_send(data4); if(wendu<2001) //温度为0上的温度 { wendu&=0x07ff; zhengshu=wendu/16; //计算温度的整数部分 xiaoshu=(wendu*25/4)%100; //计算温度的小数部分 data1=(zhengshu%100)/10; data2=zhengshu%10+10; //显示小数点 data3=xiaoshu/10; data4=xiaoshu%10; } else { wendu=~(wendu-1); zhengshu=wendu/16; //计算温度的整数部分 xiaoshu=(wendu*25/4)%100; //计算温度的小数部分 data1=20; if(zhengshu/10==0) //计算温度的各位的值 { data2 = zhengshu%10+10; data3 = xiaoshu/10; data4 = xiaoshu%10; } else { data2=zhengshu/10; data3=zhengshu%10+10; data4=xiaoshu/10; } } //send = &data4; //send = putstring; } } |
|
相关推荐
2个回答
|
|
最终想写一个下位机不停的通过串口发实时数据,而上位机也可以发送指令控制下位机的一些开关设备,现在单独的中断发送和中断接收,温度采集等都可以实现了,但是怎么把它们结合起来?困扰好几天了
|
|
|
|
大家可以去我这个号的帖子里回复,有微薄积分可以拿,欢迎大家讨论,最终实现会把代码总结分享出来
|
|
|
|
只有小组成员才能发言,加入小组>>
1834个成员聚集在这个小组
加入小组我的项目我做主,使用GN+Ninja来完成构建系统(VSCode开发RT106X)
36078 浏览 0 评论
NXP IMX8应用处理器快速入门必备:技巧、使用、设计指南
4214 浏览 0 评论
5804 浏览 1 评论
6586 浏览 0 评论
NXP i.MX6UL开发板(linux系统烧录+规格+硬件+模块移植)使用手册
4031 浏览 0 评论
475浏览 2评论
求助,S32G上Core M启动后如何让Core A在Flash指定位置加载uboot?
446浏览 2评论
ESP32-WROVER-IE + LAN8720以太网,GPIO0电压只有1.6v,无法正常进入spi flash boot模式如何解决?
447浏览 2评论
求分享适用于PN7160 Android的NFC工厂测试应用程序
535浏览 2评论
576浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-24 14:21 , Processed in 0.931883 second(s), Total 83, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号