作者shuiyuan (C遇瓶颈)
看板ASM
标题Re: [问题] 8051的问题.拜托高手帮忙 悬赏一千P币
时间Wed Nov 26 23:52:00 2008
我写一个P2每秒反相一次,若RS232有接收到任何字元,P3就会反相一次
你必须加上interrupt 4才会正常动作.
以下程式你参考一下吧,希望对你有帮助.
#include <reg52.h>
void RS232_AND_INT(void);
void delay1ms(unsigned int count);
int x50ms=20;
void main(void)
{
delay1ms(10);
RS232_AND_INT();
while(1);
}
void TIME0_INT(void) interrupt 1
{
x50ms--;
if(x50ms==0)
{
x50ms=20;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
P2=~P2;
}
TF0=0;
}
void RS232_AND_INT(void)
{
SCON=0x52;
TMOD=0x21;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=256-(28800/9600);
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
}
void RS232_INT(void) interrupt 4 //串列中断产生中断的时候P3闪烁一次
{
TI=0;
P3=~P3;
delay1ms(1000);
P3=~P3;
RI=0;
}
void delay1ms(unsigned int count)
{
int i,j;
for(i=0;i<count;i++)
for(j=0;j<122;j++);
}
※ 引述《sparc (......)》之铭言:
: ※ [本文转录自 C_and_CPP 看板]
: 作者: sparc (......) 看板: C_and_CPP
: 标题: [问题] 8051的问题.拜托高手帮忙 悬赏一千P币
: 时间: Wed Nov 26 14:17:54 2008
: 新手程式遇到瓶颈 想请高手帮忙看一下
: 使用的装置: 89s52
: 计时器:timer0
: baudrate产生器:timer3
: 想写的东西:
: 让P2所接的一排led会一秒闪烁一次
: 但如果使用者透过rs232以9600的速度传送一个字元 则会立刻闪一次
: 遇到的问题:
: LED闪烁是没有问题
: 但如果RS232接收到一字元 则LED会立刻会停止闪烁
: 验证过的方式:
: 去掉rs232时 led会正确的闪烁
: 去掉timer0时 led也的确会因为收到一个字元而闪一次
: 可是加在一起就不行了
: 非常感谢
: 程式:
: unsigned char timer_count; //设定一秒
: unsigned long timer_second; //使用者输入秒数
: char time_out; //timer out flag 0:时间未到 1:时间已到
: void timer0_initial(unsigned long temp); //initial timer 0 初始使用者设定秒数
: void timer0_start(void);
: void rs232_initial(void);
: void rs232_start(void);
: void main(void)
: {
: P2=0X00; //led灯
: while(1)
: {
: rs232_initial();
: time_out=0;
: timer0_initial(1);
: timer0_start();
: rs232_start();
: while(RI==0 && time_out==0);
: P2=~P2; //led闪烁
: }
: }
: void timer0_initial(unsigned long temp)
: {
: timer_second = temp;
: timer_count=20;
: time_out=0;
: EA=1;
: ET0=1;
: TMOD=0X01;
: TH0=(65536-50000)/256;
: TL0=(65536-50000)%256;
: TR0=0;
: }
: void timer0_start(void)
: {
: TR0=1;
: }
: void timer0_pause(void)
: {
: TR0=0;
: }
: void timer0_int(void) interrupt 1
: {
: if(timer_count<=1)
: {
: if(timer_second<=1)
: {
: time_out=1;
: timer0_pause();
: }
: else
: {
: timer_count=20;
: timer_second=timer_second-1;
: }
: }
: else timer_count=timer_count-1;
: TH0=(65536-50000)/256;
: TL0=(65536-50000)%256;
: }
: void rs232_initial(void)
: {
: TL2C=0XD8;
: TH2C=0XFF;
: TL2=0XD8;
: TH2=0XFF;
: T2CON=0X24;
: SCON=0X50;
: ES=0;
: RI=0;
: }
: void rs232_start(void)
: {
: RI=0;
: ES=1;
: }
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.134.114.49
1F:推 dexders:建议在UART中断设FLAG就好,尽量不要让中断占住程式执行 11/28 00:09
2F:推 utility:推..在中断里用delay...实在是无言. 11/28 23:19