|
|
如果只需要串口發(fā)送不需要串口接收就不必開(kāi)串口接收中斷。你的主要問(wèn)題是按鍵掃描程序放在主循環(huán)外了。給你改了下,無(wú)關(guān)的語(yǔ)句都屏蔽了,你試試。
#include"reg52.h"
#define uchar unsigned char
#define uint unsigned int
sbit key=P3^1;
/*
uchar code duan[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,
0x79,0x71}; */
uchar key_count;
bit k;
//此為延時(shí)函數(shù),就是前面的延時(shí)都是需要調(diào)用這一個(gè)函數(shù)
void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//串口初始化
void UARTInit()
{
TMOD &= 0x0f;
TMOD |= 0x20;//定時(shí)器1,工作模式2 8位自動(dòng)重裝
TH1 = 0xfd;
TL1 = 0xfd;//設(shè)置比特率9600
TR1 = 1;//啟動(dòng)定時(shí)器1
TR1 = 1;//啟動(dòng)定時(shí)器1
SM0 = 0;
SM1 = 1;//串口工作方式1,8位UART波特率可變
// EA = 1; //打開(kāi)總中斷
// ES = 1; //打開(kāi)串口中斷
}
//按鍵掃描
void keyscan()
{
key=1;
if(key==0)
{
delayms(50);
if(key==0)
{
key_count++;
if(key_count==10)
key_count=0;
k=1;//允許發(fā)送標(biāo)志置1
while(!key);
}
}
}
/*
void timer0Init()
{
EA = 1; //打開(kāi)總中斷
ET0 = 1;//打開(kāi)定時(shí)器0中斷
TR0 = 1; //啟動(dòng)定時(shí)器0
REN = 1;//允許串口接收
TMOD |= 0X01; //定時(shí)器工作模式1,16位定時(shí)模式
TH0 = 0xED;
TL0 = 0xFF; //定時(shí)5ms
}*/
void main()
{
// timer0Init();//定時(shí)器0初始化
UARTInit();//串口初始
while(1)
{
keyscan();
if(k==1) //如果允許發(fā)送
{
k=0; //發(fā)送標(biāo)志清0,防止重復(fù)發(fā)送
SBUF=key_count; //發(fā)送數(shù)據(jù)
while(!TI); //等待發(fā)送中斷請(qǐng)求標(biāo)志位為1(已發(fā)送)
TI=0; //發(fā)送中斷請(qǐng)求標(biāo)志位清0
}
}
}
/*
//定時(shí)器0中斷函數(shù)
void timer0() interrupt 1
{
TH0 = 0xED;
TL0 = 0xFF; //定時(shí)5ms
}
//串口中斷函數(shù)
void UART() interrupt 4
{
uchar temp;
if(RI)//判斷接收是否完成
{
key_count = SBUF;//讀SBUF,讀出串口接收到的數(shù)據(jù)
RI = 0;//軟件清零接收標(biāo)志位
temp = key_count;//
SBUF = ++temp;//寫(xiě)SBUF,把要發(fā)送的數(shù)據(jù)送給發(fā)送緩存器
}
if(TI)//判斷是否發(fā)送完成
TI = 0;//清零發(fā)送完成標(biāo)志位
}*/ |
|