标题:
N年前做的单片机双机通讯时钟PROTEUS仿真程序
[打印本页]
作者:
feeling1791
时间:
2020-1-3 11:57
标题:
N年前做的单片机双机通讯时钟PROTEUS仿真程序
自定义三线双机通讯,一个单片机产生时钟数据,通过三线自定协议传送给另一个单片机,此单片机控制数码管显示出来,电脑里N年前的东东,慢慢发,奉献给大家,有疑问可以交流
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei.png
(15.09 KB, 下载次数: 72)
下载附件
2020-1-3 14:49 上传
单片机源程序如下:
;********************************************************************************
;* 描述: *
;* SM1623显示MCU与DVD通讯 *
;********************************************************************************/
#include "mini.h"
BYTE TIME_sec;
BYTE TIME_min;
BYTE TIME_hour;
BIT SecChgFlag = 0;
BIT MinChgFlag = 0;
BIT HourChgFlag = 0;
BYTE TIME_system_sta = 0;
BYTE Send_speedtime = 0;
////////////////////////////////////////////////////////////////////////////////////////////////////
//延时函数定义,延时时间(12MHz):temp*12us+16us.
void Sys_Delay(WORD temp)
{
while(temp--)
NOP;
}
void TR1_Service(void) interrupt 3 using 2 //TR1的定时中断函数,此函数应简单。使用寄存器组2
{
TH1 = mS20H; // 20MS
TL1 = mS20L;
TIME_system_sta++;
Send_speedtime++;
if(TIME_system_sta >= 50) //1S时间定时
{
TIME_system_sta = 0;
TIME_sec++;
SecChgFlag = 1; //秒钟数据更新
if(TIME_sec >= 60)
{
TIME_sec = 0;
TIME_min++;
MinChgFlag = 1; //分钟数据更新
SecChgFlag = 1;
if(TIME_min >= 60)
{
TIME_sec++; // 时间校正
TIME_min=0;
TIME_hour++;
HourChgFlag = 1; //小时数据更新
MinChgFlag = 1; //分钟数据更新
SecChgFlag = 1;
if(TIME_hour >= 24)
TIME_hour=0;
}
}
}
}
void send_a_byte(BYTE com,BYTE date)
{
BYTE j;
MPG_CLK = 1;
MPG_DATA = 0;
MPG_STB = 1;
NOP;
MPG_STB = 0;
Sys_Delay(10);
switch(com)
{
case 0x00:
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
break;
case 0x01:
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 1;
MPG_CLK = 1;
Sys_Delay(2); //35US
break;
case 0x02:
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 1;
MPG_CLK = 1;
Sys_Delay(2); //35US
MPG_CLK = 0;
Sys_Delay(2); //35US
MPG_DATA = 0;
MPG_CLK = 1;
Sys_Delay(2); //35US
break;
}
for(j = 0;j < 8;j++)
{
MPG_CLK = 0;
Sys_Delay(2); //35US
if(date & 0x80)
MPG_DATA = 1;
else
MPG_DATA = 0;
date <<= 1;
MPG_CLK = 1;
Sys_Delay(2); //35US
}
MPG_CLK = 1;
MPG_STB = 1;
}
void main()
{
//中断函数初始化。
IE |= 0x80; //EA X ET2 ES ET1 EX1 ET0 EX0允许外部中断INT0,INT1,开总允许EA。(EA=1;EX0=1,EX1=0)
IP |= 0x08; //x x pt2 ps pt1 px1 pt0 px0设外部中断INT1为高优先级.(PX1=1)
TCON |= 0x00; //TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 (低电平触发INT1,IT1=0)(下降沿触发INT0,IT0=1)
//定时函数初始化
TMOD |= 0x0A; //GATE1 C/T M1 M0 GATE0 C/T M1 M0 ,TO是外中断0是高电平且定时器0开才有效,TO是自动重装初值
IE |= 0x82; //允许总中断和TR0。(EA=1;ET0=1)
TH0 = 0x06; //每次定时250us
TL0 = 0x06;
TR0 = 0; //启动控制位。
TMOD |= 0x10;
TH1 = mS20H;
TL1 = mS20L;
IP |= 0x08;
IE |= 0x88; //允许总中断和TR1。(EA=1;ET1=1)
TR1 = 1; //TR1开
MPG_CLK =1;
MPG_DATA =1;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
mcuTOdvd_SPI.rar
(83.61 KB, 下载次数: 15)
2020-1-3 11:56 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1