#include<SH79F168.H>
#include"LTC6802.H"
//内部晶振 16.6MHz
const uint8 ascii_num[]="0123456789";
volatile uint16 i;
void init_port(void);
void init_timer0(void);
void init_uart(void);
void send_char_com( uint8 ch);
void send_string_com( uint8 *str);
void UART_disp( uint16 voltage);
void init_pwm(void);
void main()
{
Fsys_Fosc_1();//16.6MHz
init_port();
init_timer0();
init_uart();
init_pwm();
//LED1_ON();
//LED2_ON();
send_string_com("welcome!the singlechip is turn on!");
send_char_com(10);
while(1);
}
/**********************************************/
void init_port()
{
P0CR = 0xFF;
P0PCR= 0x00;
P0 = 0x00;
P1CR = 0xFF;
P1PCR=0x00;
P1 = 0x00;
P2CR = 0xFF;
P2PCR=0x00;
P2 = 0x00;
P3CR = 0xFF;
P3PCR=0x00;
P3 = 0x00;
}
/*************************************************/
/*********************串口部分********************/
void init_uart()
{
P3CR &= 0xF9 ; //这个需要将端口设置为输入,不然有可能会产生乱码
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
TH1 = 0x94 ; //Baud:9600 fosc=16.6MHz
TL1 = 0x94 ;
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
PCON = 0x80 ; //SMOD=1;
IEN0 |= 0x90 ; //Enable Serial Interrupt,EA=1,ES=1;
TR1 = 1 ; // timer 1 run
TI = 0;
}
//向串口发送一个字符
void send_char_com( uint8 ch)
{
SBUF = ch;
while (!TI);
TI = 0 ;
}
//向串口发送一个字符串,strlen为该字符串长度
void send_string_com( uint8 *str)
{
uint8 k= 0 ;
do { send_char_com(*(str + k)); k++; }
while (*(str + k)!='\0');
}
//接受串口发送过来的数据,并再次发给串口
void RX_ISR() interrupt 4
{
uint8 Channel;
if(RI&&ES)
{
Channel = SBUF ;
send_string_com("Channel: ");
send_char_com(Channel);
RI=0;
}
}
/**************************************************/
void init_timer0()
{
TMOD=0x00;//选择定时器0 工作方式0
TF0=0;
TL0=0x00;
TH0=0x00;
EA=1;
ET0=1;
TR0=1;
}
void timer0_ISR() interrupt 1
{
i++;
LED1_ON();
if(i<1013)
{
LED2_ON();
}
else if(i>=1013&&i<2026)
{
LED2_OFF();
}
else if(i>=2026)
{
i=0;
}
TF0=0;
}
望熟悉中颖的达人帮我分析,上面程序中LED1_ON(),LED2_ON()是点亮两个LED灯的程序,send_string_com("welcome!the singlechip is turn on!")为发送一个字符串到串口的函数。void RX_ISR() interrupt 4 串行中断函数主要完成接受PC串口发过来的数据,并再次由单片机发送给PC。
程序中不加串口的函数,运行的结果时LED1一直亮着,LED2能够0.5S钟亮灭一次。加上串口的函数却结果变得不正常了。
我要是在while大循环前面写上send_string_com("welcome!the singlechip is turn on!")或者send_char_com(10)其中的一个函数,并且程序中将串行的中断函数void RX_ISR() interrupt 4屏蔽,那么定时器0工作不正常,两个LED灯闪一下就灭了,不再亮起来。但是串口发送字符的功能能够实现。出现上面的情况的时候有两种方法可以使定时器0变得工作正常。
方法一,将屏蔽的中断函数恢复,定时器0就工作正常了,LED灯正常工作,串口也工作正常。
方法二,将void send_char_com( uint8 ch)
{
SBUF = ch;
while (!TI);
TI = 0 ;
} 中的SBUF=ch;屏蔽,定时器0也工作正常了,LED灯正常工作。当然这个时候串口工作就不正常了。
我的问题是,在中颖的串行中断是否一定不管实际中需不需要,必须得写,不然会有不确定的问题出现。 |