本文包含原理图、PCB、源代码、封装库、中英文PDF等资源
您需要 登录 才可以下载或查看,没有账号?注册会员
×
/*******************************************************/
//头文件
#include <compiler_defs.h>
#include <C8051F800_defs.h> // SFR declarations
#define TIMER_TICKS_PER_MS SYSCLK/TIMER_PRESCALER/1000L
/*******************************************************/
//函数声明
void Port_Init (void); // Port initialization routine
void Timer0_Init (void); // Timer0 initialization routine
void Oscillator_Init (void); // Oscillator initialization routine
void Wait_timer0(); //TIME0位延时
void Send_data(char *txdata,char num); //字符串发送
INTERRUPT_PROTO (TIMER0_ISR, INTERRUPT_TIMER0);
/*******************************************************/
//定义全局变量
char TX_Buffer[] = {0xaa,0x70,0x01,0xcc,0x33,0xc3,0x3c};
char RX_Buffer[] = {0x01,0x02,0x00};
char TX_Flag,flag=0,RX_data;
int RX_Flag,j;
sbit rx_pin= P0^5; //TX、RX引脚定义
sbit tx_pin= P0^4;
void rx_char_data()
{
char i;
TL0 = 0x2d;
TR0=1;
// if(rx_pin==0)
// {
Wait_timer0(); //等过起始位
RX_data=0x00;
for(i=0;i<8;i++)
{
RX_data>>=1;
if(rx_pin)
RX_data|=0x80;
Wait_timer0();
}
Wait_timer0(); //等过停止位
// TR0=0;
// }
}
/*******************************************************/
//MAIN函数
void main (void)
{
PCA0MD &= ~0x40; // 关闭看门狗
Oscillator_Init (); // 初始化系统时钟
Timer0_Init (); // 初始化定时器0
Port_Init (); // 初始化I/O端口
EA = 1; // 始能全局中断
Send_data(TX_Buffer,1);
Send_data(RX_Buffer,2);
while (1)
{
}
}
/*******************************************************/
//等待TIMER0时间
void Wait_timer0()
{
while(!TX_Flag);
TX_Flag=0;
}
/*******************************************************/
//系统时钟初始化
void Oscillator_Init (void)
{
OSCICN |= 0x83; // 启用内部振荡器,1分频
RSTSRC = 0x06; // 始能复位时钟
CLKSEL = 0x00; // 系统时钟选择,1分频
}
/*******************************************************/
//I/O端口初始化
void Port_Init (void)
{
P0MDOUT |=0x10; //P0.4 TX设置为推挽
P0MDIN |=0x20; //P0.5设置为数字输入
XBR1 = 0x40; //启动交叉开关
}
/*******************************************************/
//定时器0初始化
void Timer0_Init(void)
{
CKCON |= 0x00; //系统时钟12分频做定时器0时钟
TH0 = 0x2d;
TL0 = 0x2d; // 9600波特率
TMOD = 0x02; // 8位自动重载模式
ET0=1; // 始能定时器0中断
TR0=0; // 关闭定时器0
}
//UART数据接收
/*******************************************************/
//字符串发送
void Send_data(char *txdata,char num )
{
char *p,Data,i;
// TL0 = 0x2d;
TR0=1;
for(p=txdata;p<(txdata+num);p++)
{
Data=*p;
tx_pin=0; //发送起始位
Wait_timer0(); //等待发送完成
for(i=0;i<8;i++) //发送8位数据
{
tx_pin=Data&0x01;
Wait_timer0();
Data=Data>>1;
}
tx_pin=1; //发送结束位
Wait_timer0(); //等待发送完成
// TR0=0;
}
}
/*******************************************************/
/*******************************************************/
//定时器0中断
INTERRUPT (TIMER0_ISR, INTERRUPT_TIMER0)
{
TX_Flag=1;
if(RX_Flag==1)
{
flag++;
if(flag<9)
{ //接收8位数据
if(rx_pin==1)
RX_data|=0x80;
else RX_data|=0x00;
RX_data=RX_data>>1;
}
if(flag==9)
{
flag=0;
if(rx_pin==1)
RX_Buffer[1]=RX_data;
P1=RX_data;
RX_Flag==0;
}
}
if(rx_pin==0) //检测接收位
RX_Flag=1;
}
只能发送到数据,接收数据不准确,这个是为什么?
用的是C8051F800单片机,内部晶振24.5M,使用9600波特率,定时器定时时间没问题
,搞了好久都没解决!
定时器中断一次接收一位数据 |