|
麻煩各位大佬幫我看看吧
#include<reg52.h>
#include<stdio.h>
#include<string.h>
#define uint unsigned int
#define uchar unsigned char
void initSer(); //串口初始化
uchar sendFlag = 0; //未發送數據時
uchar receFlag =0; //未接受到數據時
unsigned char dat;
char buf_string[4]; //定義數據包長度為15個字符
uint xs;
uint cc=0;
uint us;
//uint num=120;
uchar disbuffer[4];
sbit KEY = P3^2;
sbit KEY1 = P3^3;
sbit CLK=P3^7; //ê±?óD?o?
sbit ST=P3^4; //???ˉD?o?
sbit EOC=P3^5; //×a???áê?D?o?
sbit OE=P3^6; //ê?3?ê1?ü
sbit beep = P2^4;//zhuanhuan
sbit led = P2^5;
uchar dat,num,flag;//發送暫存變量
uchar LED_Buffer[3] = {0}; //從串口接收的數據
//uchar Buffer[2]={0};
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uchar i=0,flag;
int bai,shi,ge;
int shuzi=0;
uchar rlen = 0;
uchar Buffer[10];
uchar ii;
uchar Receive_Buffer[10];
uchar Buf_Index = 0;
uint rnum=0;
#include<reg51.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar bufr[]="------\r\n";//存放接收數據
uchar *prx=&bufr;//接收指針
bit str; //接收完畢標志位
//段碼
uchar code leddata[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//延時函數
void delay( uint i)
{
uint m,n;
for(m=i;m>0;m--)
for(n=90;n>0;n--);
}
//數碼管顯示函數
void led_display()
{
uchar i;
P2 = 0x01;
for(i=0;i<4;i++)
{
P0=0xff;
P2 = _cror_(P2,1);
P0 = leddata[bufr[i]-'0'];
delay(2);
}
}
//字符發送函數
void putchar(uchar data1)
{
SBUF = data1; //將待發送的字符送入發送緩沖器
while(!TI); //等待發送完成
TI = 0; //發送中斷標志請0
}
//字符串發送函數
void putstring(uchar *dat)
{
while(*dat != '\0') //判斷字符串是否發送完畢
{
putchar(*dat); //發送單個字符
dat++; //字符地址加1,指向先下一個字符
delay(5);
}
}
//串口初始化函數
void serial_init()
{
TMOD = 0x20; //定時器工作方式2
SCON = 0x50; //串行口工作方式2
PCON = 0x80; //SMOD = 1,波特率加倍
TH1 = 0xfa;
TL1 = 0xfa; //波特率設置9600
ES = 1;
EA = 1;//開總中斷
}
void main()
{
serial_init();
TR1 = 1;
putstring("Receiving from 8051...\r\n");
putstring("----------------------\r\n");
delay(50);
while(!str);//等待接收完畢
while(1)
{
P0=0xff;
while(!str);
led_display();
}
}
void serial() interrupt 4
{
if(RI!=1) return;//判斷是否接收
{
str = 0;
ES = 0;
*prx = SBUF; //接收存放數據
putchar(*prx);
RI = 0;
prx++; //指針自加
if(*prx=='\0') //是否接收完成
{
prx = &bufr;//指針初始化
str = 1; //標志位置1
putstring("\r\n");
putstring("translate over!\r\n");
ES = 1;
return;
}
ES = 1;
return; //退出中斷
}
}
void delay(uint i) //?óê±
{
uint j;
for(j=i;j>0;j--);
}
void delay_ms(unsigned int x)
{
uchar i;
while(x--)
{
for(i=0;i<120;i++);
}
}
/*******************ADC?áè?******************/
void display(void)
{
uchar codevalue[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00,0x40};
uchar chocode[]={0xf7,0xfb,0xfd,0xfe};
uchar i=0,p,t;
disbuffer[0]=(rnum%10);
disbuffer[1]=(rnum%100/10);
disbuffer[2]=(rnum/100);
for(i=0;i<4;i++)
{
t=chocode[i];
P2=t;
p=disbuffer[i];
t=codevalue[p];
P0=t;
delay(40);
}
P2=0xff;
}
void Timer0_INT() interrupt 1
{
TH0=(65536-10)/256;
TL0=(65536-10)%256;
CLK=~CLK;
}
/********************************************************************
* 名稱 : Com_Init()
* 功能 : 串口初始化,晶振11.0592,波特率9600,使能了串口中斷
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Com_Init(void)
{
SCON = 0x50;
TMOD = 0x20;
PCON = 0x00;
TH1 = 0xFd; //設置波特率 9600
TL1 = 0xFd;
TR1 = 1; //啟動定時器1
ES = 1; //開串口中斷
EA = 1; //開總中斷
}
void check_led()
{
if(rnum>200)
{
led=0;
}
else
{ led=1;}
}
char putchar(char c)
{
SBUF = c;
while(TI == 0);
TI = 0;
return c;
}
void SendString(char *s)
{
while(*s)
{
putchar(*s);
s++;
}
}
/********************************************************************
* 名稱 : Main()
* 功能 : 主函數
* 輸入 : 無
* 輸出 : 無
***********************************************************************/
void Main()
{
SCON = 0x50;
TMOD = 0x21;
PCON = 0x00;
TH1 = 0xfd;
TL1 = 0xfd;
//
// TMOD|=0X02;
TH0=(65536-10)/256;
TL0=(65536-10)%256;
//
//// EX0 = 1;
//// IT0 = 1;
ES = 1; //
IP = 0x10;
TR1 = 1;
TR0 = 1;
OE=0;
ST=0;
ST=0;
ST=1;
ET0=1; /**/
EA = 1;
// TI=1;
//delay_ms(300);
//delay_ms(500);
//delay_ms(1000);
//delay_ms(1000);
while(1)
{
// led=0;
#if 1
delay_ms(10);
if(Buf_Index>0) {
if(Buf_Index < 4) {
// if(Buf_Index == 3)rnum = (Receive_Buffer[0]-'0')*100+(Receive_Buffer[1]-'0')*10+(Receive_Buffer[2]-'0');
// else if(Buf_Index == 2)rnum = (Receive_Buffer[0]-'0')*10+(Receive_Buffer[1]-'0');
// else rnum = (Receive_Buffer[0]-'0');
if(Buf_Index == 3)rnum = (Receive_Buffer[0]-48)*100+(Receive_Buffer[1]-48)*10+(Receive_Buffer[2]-48);
else if(Buf_Index == 2)rnum = (Receive_Buffer[0]-48)*10+(Receive_Buffer[1]-48);
else rnum = (Receive_Buffer[0]-48);
if(rnum<256) {
SendString(Receive_Buffer);
for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
Buf_Index=0;
}
else {
for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
Buf_Index=0;
}
rnum = 0;
}
else {
for(ii=0;ii<sizeof(Receive_Buffer);ii++)Receive_Buffer[ii]=0;
Buf_Index=0;
}
}
if(EOC==1);
{
OE=1;
cc=P1;
OE=0;
ST=0;
ST=1;
ST=0;
}
display();
#endif
}
}
void Serial_INT() interrupt 4
{
uchar c;
if(RI==0)
return;
//ES = 0;
RI = 0;
c = SBUF;
if(c>='0' && c<='9')
{
Receive_Buffer[Buf_Index] = c;
Buf_Index++;
if(Buf_Index>10)Buf_Index=0;
}
// ES = 1;
}
|
|