#include
#include
#define uchar unsigned char
#define uint unsigned int
void Delay(uint del)
{
uint i,j;
for(i=0; i
for(j=0; j<1827; j++)
;
}
void Com_Init(void)
{
TMOD = 0x20;//方式2,8位自動填充
PCON = 1<<7;//設置smod為1
SCON = 0x40;//SM0,SM1,SM2,REN,TB8,RB8,TI,RI設置為0x40,不允許讀,串口工作方式1,波特率可變?yōu)?smod*fosc/[32*12*(256-x)]
TH1 = 0xfd;
TL1 = 0xfd;//19200 自填充
TR1 = 1;//啟動定時器
}
void Main()
{
uchar i = 0;
uchar code Buffer[] = "Welcome To The MCU World. http://dlmcu.taobao.com QQ:85536436 "; //所要發(fā)送的數(shù)據(jù)
uchar *p;
Com_Init();
while(1)
{
p = Buffer;
while(1)
{
SBUF = *p;
while(!TI) //如果發(fā)送完畢,硬件會置位TI
{
_nop_();
}
p++;
if(*p == '')
{
Delay(200); //延時2秒鐘再進行下次發(fā)送
TI = 0;
break; //在每個字符串的最后,會有一個''
}
TI = 0; //TI清零
}
}
}
說明:
串口的初始化中,需要設置TIME1,這個定時器的的溢出率在波特率中有用,其中PCON電源控制器最高位SMOD與波特率有關系,然后就是設置TIME1的初始值,開啟定時器。
當發(fā)送1個數(shù)值后,就是8位,即1個字符,先賦值給SBUF,由SBUF將并行的數(shù)據(jù)換成串行的數(shù)據(jù)在P3.1中根據(jù)01的不同會出現(xiàn)不同的電壓即完成物理層的傳輸,另外一方即可根據(jù)電壓判斷不同的01,然后形成8位的并行數(shù)據(jù)。
接受程序:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar LED_Buffer[8] = {0}; //從串口接收的數(shù)據(jù)
void Delay_1ms(uint i)//1ms延時
{
uchar x,j;
for(j=0;j
for(x=0;x<=148;x++);
}
void Com_Int(void) interrupt 4
{
static uchar i = 0; //定義為靜態(tài)變量,當重新進入這個子函數(shù)時 i 的值不會發(fā)生改變
if(RI == 1) //當硬件接收到一個數(shù)據(jù)時,RI會置位
{
LED_Buffer[i] = SBUF - 48; //這里減去48是因為從電腦中發(fā)送過來的數(shù)據(jù)是ASCII碼。
RI = 0;
if(i==8)
{
i = 0;
}
i++;
}
}
void Com_Init(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xfd; //設置波特率 9600
TL1 = 0xfd;
TR1 = 1; //啟動定時器1
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void Main()
{
uchar i = 0;
Delay_1ms(100);
Com_Init();
while(1)
{
P0 = table[LED_Buffer[i]];
P2 = i++;
Delay_1ms(1);
if(i == 8) i=0;
}
}
說明:
可以再串口RI或者TI置位后,設置中斷函數(shù),TI和RI由硬件。通過RI置位可以讀取接受到的數(shù)組。
然后做進一步的傳輸。