本帖最后由 wulin 于 2024-3-14 06:08 編輯
[url=forum.php?mod=redirect&goto=findpost&pid=1194908&ptid=234782][/url]
給你寫一個示例
- //發送端
- #include <reg51.h>
- #include <intrins.h>
- sbit DIR=P3^7;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar data dis_buf[10];
- uint count;//計數
- uint sec;//秒
- bit flag;//標志
- void Timer0_Init(void) //5毫秒@11.0592MHz
- {
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初始值
- TH0 = 0xEE; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1;
- ET0 = 1;
- }
- void InitUART(void)//9600
- {
- TMOD |= 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = 0xFD;
- PCON = 0x00;
- // EA = 1;
- // ES = 1;
- TR1 = 1;
- }
- void SendOneByte(uchar c)
- {
- SBUF = c;
- while(!TI);
- TI = 0;
- }
- void Display()
- {
- static uchar i;
- dis_buf[0]=table[sec/1000%10];
- dis_buf[1]=table[sec/100%10];
- dis_buf[2]=table[sec/10%10];
- dis_buf[3]=table[sec%10];
- P0=0x00;
- P1&=0xc3;
- P1|=~(0x04<<i);
- P0=dis_buf[i];
- i=++i%4;
- }
- void main()
- {
- Timer0_Init();
- InitUART();
- DIR=1;
- while(1)
- {
- if(flag)
- {
- flag=0;
- Display();
- if(++count>=200)
- {
- count=0;
- if(++sec>9999)sec=0;
- SendOneByte(0xff);//數據頭
- SendOneByte(sec>>8);//高8位
- SendOneByte(sec);//低8位
- }
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xEE;
- TL0 = 0x00;
- flag=1;
- }
復制代碼- //接收端
- #include <reg51.h>
- #include <intrins.h>
- sbit DIR=P3^7;
- typedef unsigned char uchar;
- typedef unsigned int uint;
- uchar code table[]={
- 0x3f,0x06,0x5b,0x4f,
- 0x66,0x6d,0x7d,0x07,
- 0x7f,0x6f,0x77,0x7c,
- 0x39,0x5e,0x79,0x71};
- uchar data dis_buf[4];
- uchar data rec_buf[3];
- uint count;//計數
- uint sec;//秒
- bit flag;//標志
- bit sign;//標志
- void Timer0_Init(void) //5毫秒@11.0592MHz
- {
- TMOD |= 0x01; //設置定時器模式
- TL0 = 0x00; //設置定時初始值
- TH0 = 0xEE; //設置定時初始值
- TF0 = 0; //清除TF0標志
- TR0 = 1; //定時器0開始計時
- EA = 1;
- ET0 = 1;
- }
- void InitUART(void)//9600
- {
- TMOD |= 0x20;
- SCON = 0x50;
- TH1 = 0xFD;
- TL1 = 0xFD;
- PCON = 0x00;
- // EA = 1;
- ES = 1;
- TR1 = 1;
- }
- /*
- void SendOneByte(uchar c)
- {
- SBUF = c;
- while(!TI);
- TI = 0;
- }*/
- void Display()
- {
- static uchar i;
- dis_buf[0]=table[sec/1000%10];
- dis_buf[1]=table[sec/100%10];
- dis_buf[2]=table[sec/10%10];
- dis_buf[3]=table[sec%10];
- P0=0x00;
- P1&=0xc3;
- P1|=~(0x04<<i);
- P0=dis_buf[i];
- i=++i%4;
- }
- void main()
- {
- Timer0_Init();
- InitUART();
- DIR=0;
- while(1)
- {
- if(flag)
- {
- flag=0;
- Display();
- if(sign)
- {
- sign=0;
- sec=rec_buf[1]<<8|rec_buf[2];
- rec_buf[0]=rec_buf[1]=rec_buf[2]=0;
- }
- }
- }
- }
- void Timer0Interrupt(void) interrupt 1
- {
- TH0 = 0xEE;
- TL0 = 0x00;
- flag=1;
- }
- void Serial_ISR() interrupt 4
- {
- static uchar i; //靜態計數變量
- RI=0; //接收中斷請求標志位清0
- rec_buf[i]=SBUF; //接收到的數據串保存在緩存數組
- if(rec_buf[0]==0xff) //驗證數據頭(起始位)
- {
- i++;
- if(i>=3)
- {
- sign=1; //接收完成標志置1
- i=0; //計數變量清0
- }
- }
- }
復制代碼
|