//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//描述:
// 该程序INT0按键程序+显示程序+RS232通讯 &
// 按键计数显示在数码管1-2(从右至左),并且发送该数据。 &
// 接收到的数据在数码管3-4上显示。 &
// 通讯波特率:19200 &
// 每次收发一个字节 &
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
//【声明】 此程序仅用于学习与参考,引用请注明版权和作者信息! &
//【声明】 作者: PIAE小组 &
#include <reg52.h>
#include <intrins.h>
#include <RS232_def.h>
void INT0_Counter( void ) interrupt 0 using 1 //INT0按键为计数按键
{
EA = 0;
Show_TX_Data++; //计数单元加1
TXD_flag = 1;//置要发送标志位
EA = 1;
}
void RS232_RXD( void ) interrupt 4 using 1 //接收数据函数,在中断服务程序中调用
{
EA = 0;//关闭所有中断
ES = 0;//关闭串口
if(RI==1)
{
RI = 0;
RX_data = SBUF;
RXD_flag = 1;//置接收到数据标志
}
_nop_();
ES = 1;//打开串口
EA = 1;//打开中断
}
//*******************************************************
void main(void)
{
CPU_init();
_nop_();
while(1)
{
NOPS;
//////////////////////// 接收处理程序/////////////////////////////////
if( RXD_flag )
{
EA = 0;//关闭CPU中断
LED_RED = !LED_RED;//指示灯状态变化
RXD_flag = 0;//清除标志
Show_RX_Data = RX_data;//接收对方发送的数据
EA = 1;
}
///////////////////////发送处理程序/////////////////////////////////
if( TXD_flag )
{
EA = 0;
LED_GRE = !LED_GRE;//指示灯状态变化
TXD_flag = 0;
TX_data = Show_TX_Data;//给发送的数据赋值
RS232_TXD();
_nop_();
EA = 1;
}
///////////////////////数码管显示程序/////////////////////////////////
led_seg7(1,Show_TX_Data);
led_seg7(3,Show_RX_Data);
///////////////////////数码管显示程序/////////////////////////////////
}//while 结束
}//main结束
void Delay(uchar delay_time)
{//延时程序
while(delay_time--)
{}
}
void CPU_init(void)
{//初始化CPU
SCON = 0x50; //串口方式1
PCON = 0x80; //串口波特率加速
TMOD = 0x21;
TH1=0xFD; //19200bps
TL1=0xFD;
TR1 = 1;
TI = 0;
RI = 0;
PS = 1; //串口中断的优先级设为最高
IT0 = 1;//外部中断0负边沿触发
EX0 = 1;//打开外部中断0
ES = 1;//打开串口中断
EA = 1; //打开总中断
SJA1000_CS = 1;//片选无效
}
void RS232_TXD( void )
{
EA = 0;//关闭所有中断
ES = 0;//关闭串口中断,采用查询发送方式
TI = 1;
while(TI)
{
TI = 0;//一字节发送完后清除标志位
SBUF = TX_data;
while(!TI)
{}//等待发送
TI = 0;
}
_nop_();
ES = 1;//打开串口中断
EA = 1;//打开中断
}
void led_seg7(uchar from,uchar number) //from(1_4):数码管显示起始位置(从右到左),number:显示的数
{
uchar digit,temp_l;
uchar temp_h=0x7f;
temp_h = _cror_(temp_h,from-1); //确定从哪一位开始显示,即确定高四位
temp_h = temp_h & 0xf0; //取高四位
temp_l = P2 & 0x0f; //取P2的低四位
P2 = temp_h | temp_l; //设定P2口
if(number==0)
{
P0 = led[0];
Delay(5);
P0 = 0xff;
}
else
{
while(number)
{
digit = number%10 ;
number /= 10;
P0 = led[digit] ;
Delay(5);
temp_h = P2 & 0xf0; //取P2的高四位
temp_h = temp_h | 0x0f; //拼装 temp_h,进行位选
temp_h = _cror_(temp_h,1);
temp_h = temp_h & 0xf0; //取高四位
temp_l = P2 & 0x0f; //取P2的低四位
P0 = 0xff;
P2 = temp_h | temp_l; //设定P2口
}//while结束
}//else结束
}
CAN--232通讯程序
需积分: 10 145 浏览量
2008-11-25
22:50:00
上传
评论 1
收藏 16KB RAR 举报
TDHJ
- 粉丝: 18
- 资源: 12
最新资源
- 基于51单片机的自动浇花设计论文
- 客服机器人需要的数据集,包括order、ware、user,测试集和开发集
- 用0到9生成十位数的所有排列组合(java代码).docx
- 模仿魔慢相机的人脸监测选择ios组件
- STM32F103C8T6模拟IIC控制4针0.96寸OLED显示屏已测
- Chromeextent_paly.zip
- 【2023年全国职业技能大赛“信息安全与评估”赛项】任务4-Linux内存取证WP+靶场环境
- 基于51单片机数字电压表的设计(PCB+原理图+仿真+论文+代码)
- open62541在window10 VS2019编译完成的源码
- 新闻文章自动新闻采集系统-webapps.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈