‘壹’ 有没有大神懂单片机,看图片可以帮忙回答一下吗
单片机61580组成1553b
数据传输作为总线网络的重要组成部分,是数据通讯网络和计算机网络的基础。采用数据总线传输方案组建的测控网络,较好地解决传统的测控系统过于复杂、笨重、可靠性低等缺点。数据总线作为飞机航电系统中首先运用的数字电子设备,其中MIL-STD-1553B是其典型代表,它是20世纪70年代美国公布的一种串行多路数据总线标准,利用一条屏蔽双绞线进行带有时钟信息的数据传输。它最初是为飞机提出的内部电子系统连网标准。后来由于其可靠性高、传输率较高、技术成熟、易于扩展等优点得到广泛应用,尤其在航空、航天测控网络中倍受关注。
1、 1553B总线简介
1553B总线是一种广播式分布处理的计算机网络,可挂接32个终端,所有终端共享一条消息通路,任一时刻网络中只有一个终端在发送消息,传送中的消息可以被所有终端接收,实际接收的终端通过地址来识别。网络结构简单、终端扩展方便,任一终端的故障都不会造成整个网络的故障,总线控制器则可以通过备份提高可靠性,但网络对总线本身的故障比较敏感,因此通常采用双冗余度总线。
1553B总线强调了整个系统的实时性,即传输一个固定消息所需的时间短。1553B总线按指令/响应的方式异步操作,即总线上所有消息传输都由总线控制器发出的指令来控制,这种方式适合集中控制的分布式处理系统。1553B通信协议中反映了支持电子系统中同步/异步通信的特性。
1553B总线为多冗余度总线型拓扑结构,具有双向传输特性,其传输速度为1
Mbit·s-1,传输方式为半双工方式,采用曼彻斯特Ⅱ型码。它采用指令/响应型通信协议,具有3种终端类型:(1)总线控制器(BC),是在总线上惟一被安排为执行建立和启动数据传输任务的终端。(2)远程终端(RT),是用户子系统到数据总线上的接口,能在BC的控制下提取或吸收数据。(3)总线监视器(MT),是监控总线上的信息传输,以完成对总线上的数据源进行纪录和分析,但其本身不参与总线通信。
2、 BU-61580简介
BU-61580是美国DDC公司为MIL-STD-1553B标准设计的超大规模接口协议芯片,它是当前1553B总线应用系统中流行的器件,图1是BU-61580的内部功能框图。它内部功能强、接口灵活、便于控制,有各种封装形式和供电电压供用户选择,是1553B等总线标准应用中较常用的接口芯片。
该板卡的软件主流程图如图3(a),板卡加电后,软件首先对BU-61580进行初始化设置,在主循环里分别对RS232串口标志、50ms定时标志、外部中断标志进行查询,该板卡的对外接口为RS232串口,接收到外部RS232命令后,应根据命令做出不同的操作,如发送1553B输入命令等;该板卡会50ms周期发出1553B输出命令,读取回传数据,通过RS232板卡送出;当发出1553B命令后,BU-61580启动命令传输,传输完毕后或回传数据完毕,BU-61580会产生外部中断,要求单片机读取数据。图3(b)为启动发送1533B命令的流程图。
4、 结束语
BU-61580的应用较为复杂,文中介绍了一部分的应用技术,但其他功能的软件设计过程与之类似,仅供参考。
‘贰’ 基于51单片机和热敏电阻的温度控制系统
给你个网站
你可以去看一下
http://www.sinochip.net/TechSheet/67.htm
本程序工作过程如下:
;1、开机后首先进行初始化,初始化后显示“P”1秒,提示系统进入测试工作状态,显
; 示完成后,进行温度测试。
;2、温度测试的过程是这样的:
; * T0置为计数方式,对T0脚(即P3.5)的脉冲计数,工作方式2,初值为255
; * 将T1置为定时方式,工作方式2,初值为0
; * 从P3.4口送单稳触发脉冲,使555输出单稳脉冲(正脉冲),该脉冲宽度随热敏
; 电阻阻值而变化。
; * 开T0、T1中断,启动T0、T1。此时T1自动对内部机器周期计数,当TL1溢
; 出时,产生T1中断。在T1中断处理程序中,将RAM 21H单元加1(即21H单
; 元存放脉冲宽计数值高位)后返回主程序。
; * 当来自P3.5的单稳脉冲结束(即下降沿到来)时,TL0计数器加1并溢出,产
; 生T0中断。在T0中断处理程序中,关T0、T1中断,并将TL1中的的内容读
; 到RAM 20H单元(20H单元存放脉宽计数值的低位)。
; * 查表求温度值
; NTTAB是脉宽计数值与温度的对照表,按低温到高温的次序存放,即第一、第
; 二单元存放-100C时的脉宽计数值,依此类推,第121和122单元则存放+500C
; 时的脉宽计数值。
; 将20H、21H中的计数值与NTTAB中的计数值依次进行比较,直至20H、21H
; 中的值小于NTTAB中的计数值为止。而比较的次数就对应温度的整数值,二计
; 数值之差与对照表相邻两计数值的商即为小数位。
;3、程序中除了对-100C到+500C进行测试外,还有开路(计数值过大)、短路检测(计
; 数值过小)、负超温检测、正超温检测,并有相应的显示。
;4、将检测值(温度值或其他结果)显示1秒,然后再重复温度检测。
;需要说明的是:本程序虽包括了测温的全过程,但未考虑软硬件的自检,软件滤波等部
;分。
;电容C4、热敏电阻RT的参数决定单稳脉冲的宽度,而最终的计数值除了与单稳
; 脉冲的宽度有关外,还与晶振频率有关,因而在RT的型号确定后要根据系统对精
; 度和分辨率等的要求选择C4的值。本程序中NTTAB脉宽计数值与温度对照表是在
; 热敏电阻为MF53-1型负温热敏电阻加12K精密电阻与之并联,C4为1μ,晶振为
; 4MHz的条件下得到的。数据不十分准,仅做参考。你可以在元件参数定了后,可在
; 调试程序时用可变电阻箱代替热敏电阻,在程序测出计数值处设断点,读出每个标
; 准阻值所对应的计数值(即20H、21H中的内容),自己将NTTAB建立起来。
; * * * * * * * * * * * * * * * * * * * * * * * * * *
; * 用89C2051控制的数字测温仪 *
; * 源程序清单 *
; * * * * * * * * * * * * * * * * * * * * * * * * * *
ORG 0000H
AJMP MAIN ;转主程序
ORG 000BH
AJMP WT0 ;T0中断入口
ORG 001BH
AJMP WT1 ;T1中断入口
;主程序
ORG 030H
MAIN: MOV IE,#00H ;关中断
MOV SP,#40H ;设堆栈指针SP为40H
SETB P3.5 ;将P3.5口置”1”
MOV 30H,#0CH ;“P3 ”送显示缓冲区30H~33H
MOV 31H,#0EH
MOV 32H,#0EH
MOV 33H,#0EH
MAIN0: ACALL D1S ;调显示1秒子程序
MOV P1,#0FFH ;关显示
CLR 20H ;清脉宽计数值存放区20H~21H
CLR 21H
CLR 22H ;清单稳脉冲结束标志22H
MOV TH0,#0FFH ;置T0计数初值255
MOV TL0,#0FFH
MOV TH1,#00H ;置T1的计数初值0
MOV TL1,#00H
MOV TMOD,#26H ;置T0为计数方式,方式2;T1为定时方式。方式2
SETB EA ;允许T0、T1中断
SETB ET0
SETB ET1
SETB TR0 ;开T0中断
CLR P3.5 ;送单稳触发脉冲
NOP
NOP
NOP
NOP
SETB P3.5
SETB TR1 ;开T1中断
MAIN1: CJNE 22H,#01H,MAIN2 ;单稳脉冲未结束,转检查是否超时
AJMP MAIN3 ;单稳脉冲结束,转取脉宽计数值
MAIN2: CJINE 21H,#08H,MAIN1 ;未超时,转等待单稳脉冲结束
CLR EA
CLR ET0
CLR ET1
CLR TR0
CLR TR1
MOV 30H,#0DH ;开路提示“E1”送显示缓冲区,转显示
MOV 31H,#01H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN3: CJNE 21H,#00H,MAIN4 ;单稳脉冲结束,先判断是否短路。不是,转查表程序。
MOV 30H,#0DH ;短路,短路提示“E2”送显示缓冲区,转显示
MOV 31H,#02H
MOV 32H,#0EH
MOV 33H,#0EH
AJMP MAIN0
MAIN4: ACALL NTTR ;调查表子程序
AJMP MAIN0
;查表求温度值子程序
NTTR: MOV R2,#00H ;清计数与温度对照表偏移量寄存器R2
MOV DPTR,NTTAB ;DPTR指向计数与温度对照表首址
NTTR1: CLR C ;20H、21H中的内容与NTTRB相减,并将差值存23H、24H
MOV R3,#02H
MOV R0,#20H
MOV R1,#23H
NTTR2: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
MOV @R1,A
INC R0
INC R1
INC R2
CJNE R2,#122,NTTR3 ;若未到NTAB表尾,继续比较
POVER:JC NTTR30 ;到表尾,查到对应温度,转求温度值
MOV 30,#0EH ;到表尾,查到对应温度,正超温提示“UUU”送显缓区
MOV 31H,#0BH
MOV 32H,#0BH
MOV 33H,#0BH
RET ;返回主程序
NTTR3: DJNZ R3,NTTR2
JNC NTTR1 ;未查到对应温度值,继续查表
NTTR30:MOV A,R2 ;已查到对应温度,由偏移量求出整数部分,暂存R4
CLR C
SUBB A,#02H
RR A
MOV R4,A
MOV R1,#23H ;求温度值的小数部分:+X/2送B
MOV A,@R1
CPL A
INC A
RR A
MOV B,A
NTTR4: DEC R2 ;Ni+1送20H、21H
MOV R0,#21H
MOV A,R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R0
DEC R2
MOV A, R2
MOVC A,@A+DPTR
MOV @R0, A
DEC R2 ;求+i/2从A
DEC R2
MOV R3,#02H
CLR C
NTTR5: MOV A,R2
MOVC A,@A+DPTR
SUBB A,@R0
JNC NTTR50
CLP A
INC A
NTTR50:RR A
MOV R5,A
MOV A,B ;+x/2*10/+i得到温度值的小数部分
JZ NTTR6
MOV B, #05H
MUL AB
MOV B,R5
DIV AB
MOV 20H,A ;小数部分送20H
AJMP NTTR7
NTTR6: MOV 20H,#00H
NTTR7: MOV A,#0AH ;判整数部分为正还是负
CLR C
SUBB A,R4
JC PTEMP
NTEMP:CJNE A,#0AH,NTEMP1 ;为负
MOV 30H,#0EH ;“-X”送显示缓冲区高三位
MOV 31H,#0AH
MOV 32H,A
AJMP NTEMP2
NTEMP1:MOV 30H,#0AH ;“-10” 送显示缓冲区高三位
MOV 31H,#01H
MOV 32H,#00H
NTEMP2:MOV A,#0AH ;修正小数部分后,将小数部分送显缓低三位
CLR C
SUBB A,20H
MOV 33H,A
RET ;返回主程序
PTEMP: MOV 30H,#0EH ;为正。“ ”送显缓最高位
MOV A,R4 ;温度值整数部分送显缓中间两位
MOV B,#0AH
DIV AB
JNZ PTEMP1
] MOV 31H,#0EH
JMP PTEMP2
PTEMP1:MOV 31H,A
PTEMP2:MOV 32H,B
MOV 33H,20H ;小数部分送显缓最低位
RET ;返回主程序
;显示子程序(将显缓区的内容循环显示一遍,每位显示1ms后,关显示返回主程序)
DSP: MOV R2,#01H
MOV R0,#30H
MOV DPTR,#TAB
DSP1: MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
ORL P3,R2
ACALL D1MS
MOV A,R2
RL A
MOV R2,A
CJNE R2,#10H,DSP2
ANL P3,#0F0H
RET
DSP2: INC R0
AJMP DSP1
;延时1ms子程序
D1MS: MOV R7,#166
D1MS1: DJNZ R7,D1MS1
RET
;显示1秒子程序
D1S: MOV R6,#04H
D1S1: MOV R5,#250
D1S2: ACALL DSP
DJNZ R5,D1S2
DJNZ R6,D1S1
RET
;段码表
TAB: DB 40H,79H,24H,30H,19H :0.,1.,2.,3.,4.
DB 12H,02H,78H,00H,10H :5.,6.,7.,8.,9.
DB 3FH,41H,0CH,06H,0FFH :-.,U.,P.,E.,灭
;T0中断处理程序
WT0: MOV A,TL1 ;将T1计数值送20H
MOV 20H,A
CLR EA ;关中断
CLR TR0 ;T0停止计数
CLR TR1 ;T1停止计数
MOV 22H,#01H ;置单稳脉冲结束标志
RETI ;返回主程序
;T1中断处理程序
WT1: INC 21H ;脉宽计数值高位加1
RETI ;返回主程序
;脉宽计数与温度对照表
NTTBL: DB 0D0H,05H,0B2H,05H,96H,05H,72H,05H
DB 52H,05H,35H,05H,15H,05H,0F6H,04H
DB 0D8H,04H,0B9H,04H,9CH,04H,81H,04H
DB 65H,04H,4AH,04H,30H,04H,14H,04H
DB 0FAH,03H,0E0H,03H,0C6H,03H,0ADH,03H
DB 95H,03H,7CH,03H,64H,03H,4CH,03H
‘叁’ 单片机程序出错
[","58","59",
};
]这里59后面多了个【,】。
‘肆’ 什么是单片机的最小系统
单片机的最小系统是指单片机、晶振电路、复位电路。
单片机不是完成某一个逻辑功能的芯片,单片机把一个计算机系统集成到一个芯片上。相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括地讲:一块芯片就成了一台计算机。它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。同时,学习使用单片机是了解计算机原理与结构的最佳选择。
(4)单片机RT01扩展阅读:
单片机技术在节能控制中的应用主要分为以下几个方面:智能电子设备在外出状态下,大部分是处于轻负载的模式,这时候就需要通过节能控制,确保其基础功能的前提下,进一步降低电量的消耗。
单片机通过对智能电子设备中数据的收集,可以大致推断当前设备处于较低的负载,这时可以降低电压及电流的输出,达到节能的目的。
单片机可以控制能耗的节奏,例如:在小米手环中,睡眠和运动步数等数字,这些数字收集后会在本地进行存储,然后以分钟级的频率进行上报。
‘伍’ 单片机串口 把单片机程序设置为接收到1时亮灯,灯不亮,为什么把程序改成 接收到 '1' 就可以亮了
首先需要说明一点
你在电脑端利用串口助手发送的 1,是以字符形式发送的,并不是纯数字
然而单片机中,接收的只能是字符或十六进制数,所以一般的串口助手上
同样只能选择字符或十六进制数,所以不能直接发送数值型数据
如果你想发送数字,那么就要在单片机中进行格式转换,或直接使用十六进制数表示
单片机中字符的表达方式就是用两个单引号括起来 ' '
所以你的语句 if(myKEY == '1') 是可以成立的,但其表达的数值则是 31
你把数值31赋值给端口,就相当于把大于0的数值赋给端口,单片机中大于0的数值都属于 1
所以你的整个程序时成立的
另外你的串口接收中断函数中,写的有些麻烦,可以简化成下面这样
void int_int0(void) interrupt 4 //串口中断程序
{
myKEY = SBUF; //接收电脑发送过来的键盘值
while(!RI); //等待接收完成,最好是加入这个命令,以免出错
RI = 0; //不用特意去判断 RI,这是中断,只有数据来的时候才会进入此函数
}
‘陆’ 单片机R1R2...R7什么啊
寄存器的名字,他是单片机内部RAM一部分地址的别称。例如ATM89S51的内部RAM的地址0x00的名字就叫R1,0x01就叫R2.当然你也可以把它叫做其它的名字,要在头文件(例如reg51.h)中修改,但这是不必要的。
建议找一本入门的单片机书先看一下。
‘柒’ 单片机与计算机有什么区别
简单的从本质上来说单片机与计算机没有区别,单片机的缩写单片微型计算机,同样有总线(南桥北桥),内存(内存条),外存(硬盘),系统电脑有windows、Linux、macOS(Linux、macOS一个祖宗的)),单片机同样也可以嵌入操作系统,(Linux、ucos,RT.......巴啦巴拉的),麻雀虽小,但是五脏俱全,但是区别也是有的,例如计算机性能上的优势不是单片机所能比拟的。
‘捌’ 求单片机 实时时钟 电路 图和配套代码
实时的话肯定要用DS1302了,给你发个吧,用STC89c52写的:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
//引脚定义
sbit TIMERCLK=P3^2; //DS1302同步串行时钟引脚
sbit TIMERIO=P3^3; //DS1302数据输入输出引脚
sbit TIMERRST=P3^4; //DS1302RST引脚
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
//sbit SEC_7=SEC^7;
//sbit WDT=P1^3; //看门狗"喂狗"引脚
uchar code TABLE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
//#define DIGPORT
//全局变量声明
uchar bdata DS1302dat; //DS1302读写过程中的命令或数据
sbit ds1302datHbit=DS1302dat^7; //位定义,用于数据写入
sbit ds1302datBit=DS1302dat^0; //位定义,用于数据读出
uchar bdata DS1302adr; //DS1302读写过程中所访问的单元地址
sbit ds1302adrBit=DS1302adr^0; //
uchar idata SEC;
uchar MIN;
uchar HR;
uchar DATE;
uchar MONTH;
uchar DAY;
uchar YEAR;
uchar disp1;
uchar disp2;
uchar disp3;
uchar disp4;
uchar disp5;
uchar disp6;
uchar disp7;
uchar disp8;
uchar tiao;
uchar tt;
uchar flag;
// sbit SEC_7=SEC^7;
void delay(uchar time)
{
uchar i,j;
for(i=0;i<time;i++)
{
for(j=0;j<time;j++)
{
// WDT=~WDT;
}
}
}
void writeDS1302(uchar dsRamAdr,uchar ds1302data)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=dsRamAdr;
DS1302dat=ds1302data;
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302adrBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
for(i=0;i<8;i++)
{
CY=0;
TIMERCLK=0;
CY=ds1302datBit;
TIMERIO=CY;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
}
TIMERRST=0;
delay(2);
TIMERRST=0;
}
uchar readDS1302(uchar DS1302Adr)
{
uchar i;
TIMERCLK=0;
delay(2);
TIMERRST=1;
delay(2);
DS1302adr=DS1302Adr;
for(i=0;i<8;i++)
{
TIMERCLK=0;
TIMERIO=ds1302adrBit;
delay(2);
TIMERCLK=1;
DS1302adr=DS1302adr>>1;
}
TIMERIO=1;
for(i=0;i<7;i++)
{
TIMERCLK=0;
ds1302datHbit=TIMERIO;
delay(2);
TIMERCLK=1;
DS1302dat=DS1302dat>>1;
TIMERCLK=0;
ds1302datHbit=TIMERIO;
}
TIMERRST=0;
delay(2);
TIMERCLK=0;
return DS1302dat;
}
void DS1302Inital(void)
{
uchar ds1302st;
TIMERCLK=0;
TIMERRST=0;
ds1302st=readDS1302(0x0c1);
if(ds1302st!=0x55)
{
writeDS1302(0x8e,0x00);
//writeDS1302(0x80,0x00);
writeDS1302(0x82,0x00);
writeDS1302(0x84,0x16);
writeDS1302(0x86,0x19);
writeDS1302(0x88,0x09);
writeDS1302(0x8a,0x02);
writeDS1302(0x8c,0x00);
writeDS1302(0x90,0xa6);
writeDS1302(0x0c0,0x55);
writeDS1302(0x80,0x00);
}
}
void readRTC(void)
{
MONTH=readDS1302(0x89);
DATE=readDS1302(0x87);
HR=readDS1302(0x85);
MIN=readDS1302(0x83);
SEC=readDS1302(0x81);
}
void disp(void)
{
if(MIN==10)writeDS1302(0x82,0x10);
if(MIN==26)writeDS1302(0x82,0x20);
if(MIN==42)writeDS1302(0x82,0x30);
if(MIN==58)writeDS1302(0x82,0x40);
if(MIN==74)writeDS1302(0x82,0x50);
if(MIN==90)writeDS1302(0x82,0x00);
if(HR==10)writeDS1302(0x84,0x10);
if(HR==26)writeDS1302(0x84,0x20);
if(HR==36)writeDS1302(0x84,0x00);
//if(HR==58)writeDS1302(0x82,0x40);
//if(HR==74)writeDS1302(0x82,0x50);
//if(HR==90)writeDS1302(0x82,0x00);
if(DATE==10)writeDS1302(0x86,0x10);
if(DATE==26)writeDS1302(0x86,0x20);
if(DATE==42)writeDS1302(0x86,0x30);
if(DATE==50)writeDS1302(0x86,0x01);
//if(DATE==74)writeDS1302(0x82,0x50);
//if(DATE==90)writeDS1302(0x82,0x00);
disp2=SEC/16;
disp1=SEC%16;
//if(flag1==0)
//if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}
disp4=MIN/16;
disp3=MIN%16;//flag1=0;
disp6=HR/16;
disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}
void dispA(void)
{
if(SEC==10||SEC==26||SEC==42||SEC==58||SEC==74){SEC=SEC+6;}
//if(SEC==74||SEC==58||SEC==42||SEC==26||SEC==10){SEC=SEC+6;}
disp2=SEC/16;
disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(SEC==90)SEC=0;
P2_0=0;
P0=TABLE[disp1];
delay(12);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(12);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispB(void)
{
if(MIN==10||MIN==26||MIN==42||MIN==58||MIN==74){MIN=MIN+6;}
//if(MIN==74||MIN==58||MIN==42||MIN==26||MIN==10){MIN=MIN+6;}
//disp2=SEC/16;
//disp1=SEC%16;
disp4=MIN/16;
disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
//disp8=DATE/16;
//disp7=DATE%16;
if(MIN==90)MIN=0;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(12);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(12);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispC(void)
{
if(HR==10||HR==26||HR==42||HR==58||HR==74){HR=HR+6;}
//if(HR==74||HR==58||HR==42||HR==26||HR==10){HR=HR+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
disp6=HR/16;
disp5=HR%16;
if(HR==36)HR=0;
//disp8=DATE/16;
//disp7=DATE%16;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(12);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(12);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(5);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(5);
P2_7=1;
}
void dispD(void)
{
if(DATE==10||DATE==26||DATE==42||DATE==58||DATE==74){DATE=DATE+6;}
//if(DATE==74||DATE==58||DATE==42||DATE==26||DATE==10){DATE=DATE+6;}
//disp2=SEC/16;
//disp1=SEC%16;
//disp4=MIN/16;
//disp3=MIN%16;
//disp6=HR/16;
//disp5=HR%16;
disp8=DATE/16;
disp7=DATE%16;
if(DATE==50)DATE=1;
P2_0=0;
P0=TABLE[disp1];
delay(5);
P2_0=1;
P2_1=0;
P0=TABLE[disp2];
delay(5);
P2_1=1;
P2_2=0;
P0=TABLE[disp3];
delay(5);
P2_2=1;
P2_3=0;
P0=TABLE[disp4];
delay(5);
P2_3=1;
P2_4=0;
P0=TABLE[disp5];
delay(5);
P2_4=1;
P2_5=0;
P0=TABLE[disp6];
delay(5);
P2_5=1;
P2_6=0;
P0=TABLE[disp7];
delay(12);
P2_6=1;
P2_7=0;
P0=TABLE[disp8];
delay(12);
P2_7=1;
}
void main(void)
{
DS1302Inital();
while(1)
{
readRTC();
disp();
tt=0;
flag=0;
tiao=0;
while(P3_7==0||tt==1)
{
tt=1;
if(flag==0)
{
tiao++;
flag=1;
}
if(tiao==1)
{
while(P3_7==0);
dispA();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x80,++SEC);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x80,--SEC);
}
if(P3_7==0)
flag=0;
}
if(tiao==2)
{
while(P3_7==0);
dispB();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x82,++MIN);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x82,--MIN);
}
if(P3_7==0)
flag=0;
}
if(tiao==3)
{
while(P3_7==0);
dispC();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x84,++HR);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x84,--HR);
}
if(P3_7==0)
flag=0;
}
if(tiao==4)
{
while(P3_7==0);
dispD();
if(P3_6==0)
{
while(P3_6==0);
writeDS1302(0x86,++DATE);
}
if(P3_5==0)
{
while(P3_5==0);
writeDS1302(0x86,--DATE);
}
if(P3_7==0)
flag=0;
}
if(tiao==5)
tt=0;
}
}
}
你自己用keil软件调就行了!
‘玖’ 单片机与pc机串口通信完整代码
#include"reg51.h"
unsigned int rt=0,tt=0,dema,temp;
unsigned int re_buf[3]={0};初值
unsigned char send_buf[4]={'O','K','O','K'};//返回
unsigned char code leds_a[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0-9共阳极
sbit P20=P2^0;
sbit P21=P2^1;
sbit P22=P2^2;
sbit P23=P2^3; //数码管选位
bit L11;
void rs232_S(void);//串口初始化
void disp(void);//数码管显示
void main(void)
{
rs232_S();
while(1)
{
disp();
if(L11)
{
tt=0;
TI=1;//直接触发中断
L11=0;
}
}
}
void rs232_S(void)
{
TMOD=0X21;//T0用于定时作延时用 方式1
TH1=0XE6;
TL1=0XE6;//波特率2400
TH0=0Xf8;
TL0=0X30; //晶振12M初值2mS
TR0=1;
ET0=1;
SCON=0X50;
PCON=0X80;//smod加倍
TI=0;
RI=0;
L11=0;
ET1=1;
TR1=1;
ES=1;
EA=1;
}
void RS232(void) interrupt 4
{
if(RI)
{
RI=0;
rt++;
if(rt<5)
{
re_buf[rt-1]=SBUF;
if(rt>=4)
{
L11=1;
rt=0;
}
}
}
else if(TI)
{
TI=0;
if(tt<4)
{
SBUF=send_buf[tt];
tt++;
}
}
}
void timer0(void) interrupt 1 //中断进程
{
TR0=0;
TH0=0Xf8;
TL0=0X30; //重装初值
TR0=1;
if(dema)
{
dema--; //2mS延时,延时采用定时中断初值2mS
}
}
void disp(void)
{
P23=0;
temp=re_buf[3];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3; //延时6mS
while(dema!=0);
P23=1;
P22=0;
temp=re_buf[2];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P22=1;
P21=0;
temp=re_buf[1];
temp=temp&0x0f;
P0=leds_a[temp]; //串口发送10进制数 通过转换二进制 保留低4位形成10进制数 选择0-9
dema=3;
while(dema!=0);
P21=1;
P20=0;
temp=re_buf[0];
temp=temp&0x0f;
P0=leds_a[temp];
dema=3;
while(dema!=0);
P20=1;
}
用串口调试助手发送0000-9999四位数(十进制),单片机接收显示在4位数码管上并返回OKOK
这是我刚调试完成的,希望对你有帮助。