51串口中断模式发送数据发送

查看: 2544|回复: 8
stc单片机双串口中断收发源程序
双串口中断收发源代码:
0.png (49.38 KB, 下载次数: 19)
21:35 上传
/*---------------------------------------------------------------------*/
/* --- STC MCU International Limited ----------------------------------*/
/* --- STC 1T Series MCU Demo Programme -------------------------------*/
/* --- Mobile: (86) ----------------------------------------*/
/* --- Fax: 86-6,12969 ------------------------*/
/* --- Tel: 86-8,12966 ------------------------*/
/* --- QQ:&& -------------------------------------------------*/
/* 如果要在程序中使用此代码,请在程序中注明使用了宏晶科技的资料及程序& &*/
/*---------------------------------------------------------------------*/
#define MAIN_Fosc& && && && && & L& && &&&//定义主时钟
#include& && &&&&STC15Fxxxx.H&
#define& && && && && & Baudrate1& && &&&115200UL
#define& && && && && & Baudrate2& && &&&115200UL
/*************& && &&&功能说明& && &&&**************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
#define& && &&&UART1_BUF_LENGTH& && &&&32
#define& && &&&UART2_BUF_LENGTH& && &&&32
u8& && &&&TX1_C& && &&&//发送计数
u8& && &&&RX1_C& && &&&//接收计数
u8& && &&&TX2_C& && &&&//发送计数
u8& && &&&RX2_C& && &&&//接收计数
bit& && &&&B_TX1_B& && &&&//发送忙标志
bit& && &&&B_TX2_B& && &&&//发送忙标志
u8& && && &idata RX1_Buffer[UART1_BUF_LENGTH];& && &&&//接收缓冲
u8& && && &idata RX2_Buffer[UART2_BUF_LENGTH];& && &&&//接收缓冲
void& && &&&UART1_config(u8 brt);& && &&&// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
void& && &&&UART2_config(u8 brt);& && &&&// 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
void& && && &PrintString1(u8 *puts);
void& && && &PrintString2(u8 *puts);
//========================================================================
// 函数: void main(void)
// 描述: 主函数。
// 参数: none.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void main(void)
{
& && &&&P0M1 = 0;& && &&&P0M0 = 0;& && &&&//设置为准双向口
& && &&&P1M1 = 0;& && &&&P1M0 = 0;& && &&&//设置为准双向口
& && &&&P2M1 = 0;& && &&&P2M0 = 0;& && &&&//设置为准双向口
& && &&&P3M1 = 0;& && &&&P3M0 = 0;& && &&&//设置为准双向口
& && &&&P4M1 = 0;& && &&&P4M0 = 0;& && &&&//设置为准双向口
& && &&&P5M1 = 0;& && &&&P5M0 = 0;& && &&&//设置为准双向口
& && &&&P6M1 = 0;& && &&&P6M0 = 0;& && &&&//设置为准双向口
& && &&&P7M1 = 0;& && &&&P7M0 = 0;& && &&&//设置为准双向口
& && &&&UART1_config(1);& && &&&// 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
& && &&&UART2_config(2);& && &&&// 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
& && &&&EA = 1;& && && && && && && && && && &&&//允许全局中断
& && &&&
& && &&&PrintString1(&STC15F2K60S2 UART1 Test Prgramme!\r\n&);& && &&&//SUART1发送一个字符串
& && &&&PrintString2(&STC15F2K60S2 UART2 Test Prgramme!\r\n&);& && &&&//SUART2发送一个字符串
& && &&&while (1)
& && &&&{
& && && && && & if((TX1_Cnt != RX1_Cnt) && (!B_TX1_Busy))& && &&&//收到数据, 发送空闲
& && && && && & {
& && && && && && && && &SBUF = RX1_Buffer[TX1_Cnt];
& && && && && && && && &B_TX1_Busy = 1;
& && && && && && && && &if(++TX1_Cnt &= UART1_BUF_LENGTH)& && &&&TX1_Cnt = 0;
& && && && && & }
& && && && && & if((TX2_Cnt != RX2_Cnt) && (!B_TX2_Busy))& && &&&//收到数据, 发送空闲
& && && && && & {
& && && && && && && && &S2BUF = RX2_Buffer[TX2_Cnt];
& && && && && && && && &B_TX2_Busy = 1;
& && && && && && && && &if(++TX2_Cnt &= UART2_BUF_LENGTH)& && &&&TX2_Cnt = 0;
& && && && && & }
& && &&&}
}
//========================================================================
// 函数: void PrintString1(u8 *puts)
// 描述: 串口1发送字符串函数。
// 参数: puts:&&字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void PrintString1(u8 *puts)
{
& & for (; *puts != 0;& && &&&puts++)& && && &&&//遇到停止符0结束
& && &&&{
& && && && && & SBUF = *
& && && && && & B_TX1_Busy = 1;
& && && && && & while(B_TX1_Busy);
& && &&&}
}
//========================================================================
// 函数: void PrintString2(u8 *puts)
// 描述: 串口2发送字符串函数。
// 参数: puts:&&字符串指针.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void PrintString2(u8 *puts)
{
& & for (; *puts != 0;& && &&&puts++)& && && &&&//遇到停止符0结束
& && &&&{
& && && && && & S2BUF = *
& && && && && & B_TX2_Busy = 1;
& && && && && & while(B_TX2_Busy);
& && &&&}
}
//========================================================================
// 函数: SetTimer2Baudraye(u16 dat)
// 描述: 设置Timer2做波特率发生器。
// 参数: dat: Timer2的重装值.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void& && &&&SetTimer2Baudraye(u16 dat)
{
& && &&&AUXR &= ~(1&&4);& && &&&//Timer stop
& && &&&AUXR &= ~(1&&3);& && &&&//Timer2 set As Timer
& && &&&AUXR |=&&(1&&2);& && &&&//Timer2 set as 1T mode
& && &&&TH2 = dat / 256;
& && &&&TL2 = dat % 256;
& && &&&IE2&&&= ~(1&&2);& && &&&//禁止中断
& && &&&AUXR |=&&(1&&4);& && &&&//Timer run enable
}
//========================================================================
// 函数: void& && &&&UART1_config(u8 brt)
// 描述: UART1初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 使用Timer1做波特率.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void& && &&&UART1_config(u8 brt)
{
& && &&&/*********** 波特率使用定时器2 *****************/
& && &&&if(brt == 2)
& && &&&{
& && && && && & AUXR |= 0x01;& && && && && & //S1 BRT Use Timer2;
& && && && && & SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate1);
& && &&&}
& && &&&/*********** 波特率使用定时器1 *****************/
& && &&&else
& && &&&{
& && && && && & TR1 = 0;
& && && && && & AUXR &= ~0x01;& && && && && & //S1 BRT Use Timer1;
& && && && && & AUXR |=&&(1&&6);& && &&&//Timer1 set as 1T mode
& && && && && & TMOD &= ~(1&&6);& && &&&//Timer1 set As Timer
& && && && && & TMOD &= ~0x30;& && && && && & //Timer1_16bitAutoR
& && && && && & TH1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) / 256);
& && && && && & TL1 = (u8)((65536UL - (MAIN_Fosc / 4) / Baudrate1) % 256);
& && && && && & ET1 = 0;& && &&&//禁止中断
& && && && && & INT_CLKO &= ~0x02;& && &&&//不输出时钟
& && && && && & TR1&&= 1;
& && &&&}
& && &&&/*************************************************/
& && &&&SCON = (SCON & 0x3f) | 0x40;& && &&&//UART1模式, 0x00: 同步移位输出, 0x40: 8位数据,可变波特率, 0x80: 9位数据,固定波特率, 0xc0: 9位数据,可变波特率
//& && &&&PS&&= 1;& && &&&//高优先级中断
& && &&&ES&&= 1;& && &&&//允许中断
& && &&&REN = 1;& && &&&//允许接收
& && &&&P_SW1 &= 0x3f;
& && &&&P_SW1 |= 0x80;& && && && && & //UART1 switch to, 0x00: P3.0 P3.1, 0x40: P3.6 P3.7, 0x80: P1.6 P1.7 (必须使用内部时钟)
//& && &&&PCON2 |=&&(1&&4);& && &&&//内部短路RXD与TXD, 做中继, ENABLE,DISABLE
& && &&&B_TX1_Busy = 0;
& && &&&TX1_Cnt = 0;
& && &&&RX1_Cnt = 0;
}
//========================================================================
// 函数: void& && &&&UART2_config(u8 brt)
// 描述: UART2初始化函数。
// 参数: brt: 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void& && &&&UART2_config(u8 brt)& && &&&// 选择波特率, 2: 使用Timer2做波特率, 其它值: 无效.
{
& && &&&if(brt == 2)
& && &&&{
& && && && && & SetTimer2Baudraye(65536UL - (MAIN_Fosc / 4) / Baudrate2);
& && && && && & S2CON &= ~(1&&7);& && &&&// 8位数据, 1位起始位, 1位停止位, 无校验
& && && && && & IE2& &|= 1;& && && && && && && && &//允许中断
& && && && && & S2CON |= (1&&4);& && &&&//允许接收
& && && && && & P_SW2 &= ~0x01;& && &&&
& && && && && & P_SW2 |= 1;& && && && && && && && &//UART2 switch to: 0: P1.0 P1.1,&&1: P4.6 P4.7
& && && && && & B_TX2_Busy = 0;
& && && && && & TX2_Cnt = 0;
& && && && && & RX2_Cnt = 0;
& && &&&}
}
//========================================================================
// 函数: void UART1_int (void) interrupt UART1_VECTOR
// 描述: UART1中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void UART1_int (void) interrupt UART1_VECTOR
{
& && &&&if(RI)
& && &&&{
& && && && && & RI = 0;
& && && && && & RX1_Buffer[RX1_Cnt] = SBUF;
& && && && && & if(++RX1_Cnt &= UART1_BUF_LENGTH)& && &&&RX1_Cnt = 0;
& && &&&}
& && &&&if(TI)
& && &&&{
& && && && && & TI = 0;
& && && && && & B_TX1_Busy = 0;
& && &&&}
}
//========================================================================
// 函数: void UART2_int (void) interrupt UART2_VECTOR
// 描述: UART2中断函数。
// 参数: nine.
// 返回: none.
// 版本: VER1.0
// 日期:
//========================================================================
void UART2_int (void) interrupt UART2_VECTOR
{
& && &&&if((S2CON & 1) != 0)
& && &&&{
& && && && && & S2CON &= ~1;& && &&&//Clear Rx flag
& && && && && & RX2_Buffer[RX2_Cnt] = S2BUF;
& && && && && & if(++RX2_Cnt &= UART2_BUF_LENGTH)& && &&&RX2_Cnt = 0;
& && &&&}
…………限于本文篇幅 余下代码请从51黑下载附件…………
(20.45 KB, 下载次数: 30)
18:21 上传
点击文件名下载附件
双串口中断收发下载积分: 黑币 -5
标记谢谢分享
我要测试下这个可不可以用
谢谢!谢谢!非常感谢!!
我正要找 这个,可不可以用?
谢谢谢谢!非常感谢!!
谢谢谢谢!非常感谢!!
谢谢分享,初学很懵逼
无常 发表于
谢谢分享,初学很懵逼
要测试下这个可不可以用
Powered by51单片机&中断系列--串口中断(二)
51单片机中断系列--串口中断(二)
在51单片机中,与串行口紧密相关的一个特殊功能寄存器是串行口控制寄存器SCON,它用来设定串行口的工作方式,接收.发送控制以及设置状态标志。
串行口控制寄存器SCON
——串行口工作方式控制位
——多机通信控制位
多机通信是工作于方式2和方式3,SM2位主要用于方式2和方式3。接收状态,当串行口工作于方式2或3,以及SM2=1时,只有当接收到第9位数据(RB8)为1时,才把接收到的前8位数据送入SBUF,且置位RI发出中断申请,否则会将接收到的数据放弃。当SM2=0时,就不管第9位数据是0还是1,都会将数据送入SBUF,并发出中断申请。
工作于方式0时,SM2必须为0。
——允许接收位
REN用于控制数据接收的允许和禁止,REN=1时,允许接收,REN=0时,禁止接收。
——发送接收数据位8
在方式2和方式3中,TB8是要发送的——即第9位数据位。(可作为奇偶校验或)。在多机通信中同样亦要传输这一位(可作为地址帧/数据帧的标志位),并且它代表传输的地址还是数据,TB8=0为数据,TB8=1时为地址。。在方式0和1中,该位未用。
——接收数据位8
在方式2和方式3中,RB8存放接收到的第9位数据,用以识别接收到的数据特征。可作为奇偶校验位或地址帧/数据帧的标志位。在方式1时,若SM2=0,则RB8是接收到的停止位。
——发送中断标志位
可寻址标志位。方式0时,发送完第8位数据后,由硬件置位。
其它方式下,在发送或停止位之前由硬件置位。
在中断服务程序中,必须用软件将其清0,取消此中断申请。
——接收中断标志位
可寻址标志位。接收完第8位数据后,该位由硬件置位。
在其他工作方式下,该位由硬件置位,RI=1表示帧接收完成。
在串口中断处理时,TI,RI都需要软件清"0",硬件置位后不可能自动清0,此外,在进行缓冲区操作时,需要ES=0,以防止中断出现。
************************************************************************************************************
*******************************************
& &淫荡的分割线 &
*********************************************
************************************************************************************************************
方式0的应用
其方式0被称为同步移位寄存器的输入/输出方式,主要用于扩展并行输入或输出口。数据由RXD引脚输入或输出,同步移位寄存器由TXD引脚输出。发送和接收均为8位数据,低位在先,高位在后,波特率固定在Fosc/12。在该模式下,串行口的SBUF是作为同步移位寄存器使用的。在串行口发送时,SBUF相当于一个并行进入,串行输出的移位寄存器,由单片机的内部总线并行接收8位数据,并从RXD信号线串行输出。在接收操作时,它相当于一个串行输入,并行输出的移位寄存器。该模式下,SM2,RB8,STB8不起作用。
其数据输出时序图如图
发送操作在TI=0时进行,CPU将数据移入SBUF之后,RXD线上即可发出8位数据,TXD上发送同步脉冲。8位数据发送完成后,TI由硬件置位,并在中断允许的情况下向CPU申请中断。CPU在响应中断后,先由软件使TI清0,然后在SBUF送下一个需要发送的字符,如此重复上面的过程。
其数据输入时序图如下
接收过程是在REN=1和RI=0的条件下启动的。此时,串行数据由RXD线输入,TXD线输出同步脉冲。接收电路接收到8位数据后,RI自动置位并在中断允许的条件向CPU发送中断请求。CPU查询到RI为1或者响应中断以后便将SBUF中的数据送到累加器,RI需要软件复位。
需要注意的是,串行口工作模式0并不是一个同步串口通信方式,它的主要用途是与外面的同步移位寄存器相连。以达到扩展单片机输入并行口和输出并行口的目的
典型电路图如下
74LS164是一个8位串行输入,并行输出的移位寄存器。
例题设置单片机串行口工作方式模式为0,间隔循环发送十六进制数0xAA。
#define uchar unsigned char&
#define uint unsigned int&
void delayms(suint xms)
for(i=i&0;i--)
for(sj=110;j&0;j--)
void main()
SCON=0;//选择工作方式 为0
EA=1;//开启总中断
ES=1;//开启串口中断
TI=0;//串口发送中断标志位置0
void ser0() inteerupt 4
TI=0;//由软件清0
方式1的应用
方式1是10位数据的异步通信口,其中1位起始位,8位数据位,一位停止位,TXD为数据发送引脚,EXD为数据接收脚,其波特率是可变的,对于单片机
&,波特率是由定时器1的溢出率决定。通常我们在做单片机与单片机,单片机和计算机串口通信,计算机和计算机的串口通信中,基本上都是采用方式1
下面是方式1的数据输出时序图和数据输入时序图
方式1的数据输出时序图如下
当数据被写入SBUF寄存器后,单片机自动开始从起始位发送数据,发送到停止位的开始时,由内部硬件将TI置1,向CPU申请中断,接下来可以在中断处理函数中进行相应的操作,同样也可以选择不进入中断。
方式1的数据输入时序图如下
用软件置RWN为1时,接收器以所选择波特率的16倍速率采样RXD引脚电平,检测到RXD引脚输入电平发生负跳变时,则说明起始位有效,将其移入移位寄存器。并开始接收这一帧信息的其余位。接收过程中,数据从输入移位寄存器右边移入,起始位移至输入移位寄存器最左边时,控制电路进行最后一次移位。当RI=0,且SM2=0(或接收到的停止位为1时),将接收到的9位数据的前8位数据装入接收SBUF,第9位(停止位)进入RB8,并置RI=1,向CPU请求中断。
在具体操作串行口之前,需要对单片机的一些与串口有关的特殊功能寄存器进行初始化设置,配置波特率的定时器1,串行口控制和中断控制。具体如下
确定T1的工作方式
计算T1的初值,装载到TH1.TL1
启动定时器T1
确定串行口工作方式
配置中断寄存器,开总中断等。
#define uchar unsigned char&
#defince uint unsigned int&
uchar flag,a,i;
uchar code table[]="I get "
void init()
TMOD=0x20;//配置定时器1的工作方式为 8位初值自动重装的8位定时器/计数器8777
TL1=0//配置了9600的波特率的初值
REN=1;//启动串行接收
SM1=1;//配置它的工作方式为1
EA=1;开启总中断
ES=1;//开启串口中断
void main()
if(flag==1)//在串口中断处理函数中将其置为1
ES=0;//关闭串口中断
for(i=0;i&6;i )
SBUF=table[i];//将table数组中的数据送至SBUF中,由SBUF将其发送出去
while(!TI)//等待发送完成 完成TI为1
TI=0;//将TI重新置为0,使其不停的发送数据,直到数组中的数据完全发送出去
SBUF=a;//将所得到的a 重新发送过去
while(!TI)//等待发送完成 完成TI为1
TI=0;//将TI重新置为0
ES=1;//重新开启中断
· flag=0;//重新等待串行中断
void ser0() inteerupt 4
RI=0;//软件清O
a=SBUF;//从连接设备中得到X值
flag=1;//当从与该单片机连接的设备中得到了一个值时,其值赋给该单片机中的A后,触发该单片机的串口中断,将得到的该值冲洗发送回去
串口中断方式二和方式三的应用
方式2和方式3都为11位数据的异步通信口,它们的唯一区别是传输速率不同。TXD为数据发送引脚,RXD为数据接收引脚。用折两种方式传输数据时,起始位1位,数据位9位,(含一位附加的第9位,发送时为SCON中的TB8,接收时为RB8),停止位1位,一帧的数据为11位。方式2的波特率固定为晶振频率的1/64或1/32,方式3的波特率由定时器T1的溢出率决定。一帧数据的传输格式如下
串口方式2和3的数据发生时序图如下
串口方式2和3的数据接收时序图如下
发送开始时,先把起始位0输出到TXD引脚,然后发送移位寄存器的输出位(D0)到TXD引脚,每一个移位脉冲都使输出移位寄存器的各位右移一位,并由TXD引脚输出。第一次移位时,停止位1移入输出移位寄存器的第9位,以后每次移位,左边都移入0,当停止位移至输出位时,左边其余位全为0,检测电路检测到这一条件时,使得控制电路进行最后一次移位,并置T1=1,向CPU请求中断。
接收时,数据从右边移入输入移位寄存器,在起始位0移到最左边时,控制电路进行最后一次移位。当RI=0且SM2=0(或接收到的第9位数据为1)时,接收到的数据装入接收缓冲器SBUF和RB8(接收数据的第9位),置RI=1,向CPU请求中断。如果条件不满足,则数据丢失,且不置位RI,继续搜索RXD引脚的负跳变。
&设置单片机串行口的工作方式2,间隔循环发送十六进制数0xAA&
#define uchar unsigned char&
#define uint unsigned int&
void delayms(uint xms)
for(i=i&0;i )
for(j=110;j&0;j--);
void main()
SM1=0;//设置串口的工作方式
EA=1;//开启总中断
ES=1;//开启串口中断
TI=0;//发送中断标志位清0
delayms(1);
void ser0() interrupt 4
TI=0;//发送中断标志位清0
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。基于飞思卡尔单片机如何写一个串口中断采集实时数据发送给计算机,比如温度等。请把逻辑讲一下,谢谢 - NXP MCU 技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
林超文手把手教你学!
教你1000种电路设计思路
张飞硬件电路之PFC全集
参与免费送VIP+原创视频
运放、ADC、电磁兼容
基于飞思卡尔单片机如何写一个串口中断采集实时数据发送给计算机,比如温度等。请把逻辑讲一下,谢谢
00:16:27  
现在单独的中断发送字符串和单独温度采集可以实现,两个一起就不行,请教大家,麻烦各位了。
#include &hidef.h&& && &/* common defines and macros */
#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& & & & & & & && & & & & && & //总线频率
#define&&OSC_CLOCK& & & & & & & && & & & & && & //晶振频率
#define BAUD 9600
unsigned int zhengshu,
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:/|shop.taobao.com\r\n&;
unsigned char *
/*************************************************************/
/*& && && && && && && & 初始化锁相环& && && && && && && && & */
/*************************************************************/
void INIT_PLL(void)
& & CLKSEL &= 0x7f;& && & //set OSCCLK as sysclk
& & PLLCTL &= 0x8F;& && & //Disable PLL circuit
& & CRGINT &= 0xDF;
& & #if(BUS_CLOCK == )
& && &SYNR = 0x44;
& & #elif(BUS_CLOCK == )
& && &SYNR = 0x43;& &&&
& & #elif(BUS_CLOCK == )
& && &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&&= 0& && &//指定所有通道为输出比较方式
&&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 = 0& & & && &&&// 清除各IC/OC中断标志位
&&ECT_TFLG2 = 0& &&&// 清除自由定时器中断标志位
/*************************************************************/
/*& && && && && && && && & 延时函数2& && && && && && && && & */
/*************************************************************/
void delay1ms(unsigned int n)
& & for(i=0;i&n;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 = 0
&&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 =
/*************************************************************/
/*& && && && && && & 串口中断发送字符串函数& && && && && && &*/
/*************************************************************/
#pragma CODE_SEG __NEAR_SEG NON_BANKED
interrupt void send_string(void)
&&if(*send!=0x00)& && && &//判断字符串是否发送完毕
& & SCI_send(*send);
& & //send =
& & 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];
& & case 2:
& && &CONT1 = 0;
& && &CONT2 = 1;
& && &CONT3 = 0;
& && &CONT4 = 0;
& && &DATA=shuma[data2];
& & case 3:
& && &CONT1 = 0;
& && &CONT2 = 0;
& && &CONT3 = 1;
& && &CONT4 = 0;
& && &DATA=shuma[data3];
& & case 4:
& && &CONT1 = 0;
& && &CONT2 = 0;
& && &CONT3 = 0;
& && &CONT4 = 1;
& && &DATA=shuma[data4];
& & default:
&&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) {
&&DisableI
&&INIT_PLL();
&&//initialize_ect();
&&//Interrupt_Priorrity_Set();
&&//INIT_port();
&&INIT_SCI();
&&LEDCPU_dir=1;
&&LEDCPU=0;
&&send = &data4;
&&//send =
&&delay1ms(1000);
&&wendu=read_T();& && && && && &//读取温度值
& &&&delay1ms(1000);
& &&&wendu=read_T();& && && && && &//读取温度值
& & & & & & & &&&//send = &data4;
& & & & & & & &&&//SCI_send(data4);
& & & & & & & &&&if(wendu&2001)& && && && && & //温度为0上的温度
& & & & & & & &&&{& & & & & & & &
& && &&&wendu&=0x07
& && &&&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 =
已退回3积分
林超文手把手教你学!
教你1000种电路设计思路
张飞硬件电路之PFC全集
参与免费送VIP+原创视频
运放、ADC、电磁兼容
Powered by
供应链服务
版权所有 (C) 深圳华强聚丰电子科技有限公司

我要回帖

更多关于 串口中断模式发送数据 的文章

 

随机推荐