......
......
SCON=0x00
number=0x01
......
while(1)
{
number=_crol_(number,1)
SBUF=(NUM&number)
while(!TI)
TI=0
delay()
}
......
没经过调试,你自己改改和补充,看看是不是你要的要求。
#include <REG52.H>#define uchar unsigned char
#define uint unsigned int
sbit ring=P3^7
sbit CASE1=P2^0
sbit CASE2=P2^1
sbit CASE3=P2^2
sbit CASE4=P2^3
uchar se=0,re=0
uchar temp=0
void wait(uint cnt)
{
while(--cnt)
}
void send(uchar se)
{
SBUF=se //发送数据
while(TI == 0)
TI = 0
}
//串口接收程序
uchar receive(void)
{
re=SBUF //接收数据
while(RI==0)
RI=0
return re
}
//串口初始化
void sinti(void)
{
SCON = 0x50
TMOD |= 0x20
TH1 = 0xFD
TR1 = 1
EA= 1
ES= 1
}
void delay(int cnt)
{
while(--cnt)
}
//主程序
int main (void)
{
int i
sinti() //串口初始化程序
ring=1
while(1)
{
while (1)
{
if(CASE1==0)
{
send('a')
ring=0
break
}
if(CASE2==0)
{
send('b')
ring=0
break
}
if(CASE3==0)
{
send('c')
ring=0
break
}
if(CASE4==0)
{
send('d')
ring=0
break
}
}
if(ring==0)
{
wait(60000)
ring=1
}
for(i=0i<10000i++)
}
}
//串口中断程序
void UART_SER (void) interrupt 4 //串行中断服务程序
{
if(RI)//判断是接收中断产生
{
RI=0 //标志位清零
temp=SBUF
}
if(TI)//如果是发送标志位,清零
TI=0
}
下面的程序我已经调试过了,你可以直接使用,但是一秒闪烁次数t的最大为2000,如果要大于这个数,你必须改小dalay1ms ()内的j值,就可以改大t#include <reg52.h>
sbit LED0=P1^0
unsigned int t=0,k
void dalay1ms (unsigned int i) //晶振选用11.0592
{
unsigned int j
for(ii>0i--)
for(j=922j>0j--)
}
void main ()
{
EA=1
ES=1
TMOD=0x20 //定时器T1方式为2
TH1=0xfa //波特率设定为9600
TL1=0xfa
while(1)
{
if(t!=0)
{
k=2000/t
dalay1ms (k)
LED0=!LED0
}
if(t==0)
LED0=0
}
}
void counter4(void) interrupt 4
{
while(RI==0)
RI = 0
t= SBUF
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)