MCS-51微机接口大作业
单片机大作业试题及答案

单片机试题带答案版1、填空(每空2 分,共40 分)1、MCS-8051系列单片机字长是8 位,有40 根引脚,96系列字长是16 位。
单片机的特2、单片机的存储器的最大特点是指令存储器与数据存储器分开编址,Px并行口的地址是与数据存储器统一编址的,或者说属于该存储器。
3、8051最多可以有4 个并行输入输出口,最少也可以有1个并行口,即P1 。
P3常需复用作串行通信、外部中断、外部计数脉冲和读写控制信号。
4、ALE信号的作用是低8位地址锁存。
5、8051复位后,PC= 0 H。
若希望从片内存储器开始执行,EA脚应接高电平,PC值超过0FFF H时,8051会自动转向片外存储器继续取指令执行。
6、8051的C/T是加(加或减)计数的。
7、8051的中断向量表在3 H、0B H和13H、1BH、23H。
8、MOV A,40H 指令对于源超作数的寻址方式是直接寻址。
9、指令JB 0A7H,ABC的作用是若P2口的第7位为1则跳转到ABC 。
(0A7H是P2.7的地址)2、已知A = 0F8H,当执行ADD A,#0A9H指令后,PSW中的OV、CY、AC、P各为多少?若是有符号数,A中的结果用十进制表示是多少?(共5 分)[解答] OV:0、CY:1、AC:1、P:1 A:-953、在两个8051间用模式2进行串行通信,A机并行采集外部开关的输入,然后串行传输给B机;B机接收后并行输出控制LED发光。
画出连接示意图,写出完整的程序。
(共15 分)4、将8051外部扩展2K EPROM,同时扩展16K RAM作数据存储器,采用的2716是2K 的EPROM芯片,6264是8K的RAM芯片,74LS373是8位锁存器。
请画出连接示意图。
要求画出8051的数据、地址、ALE、PSEN、RD、WR信号;锁存器的数据入D、数据出Q、锁存控制G、OE;2716的A、数据O、片选CE、输出使能OE;6264的A、D、CE、OE、WE。
MCS51单片机课后作业解答

MCS51单片机作业解答第二章 MCS-51单片机的结构和原理(1) MCS-51单片机芯片包含哪些主要功能部件答:CPU、4KBROM、128B RAM、4个8位I/O口、2个定时计数器、串行I/O口、中断系统、时钟电路、位处理器、总线结构。
(2)MCS-51单片机的 /EA端有何用途答:当/EA =0 只访问片外程序区;当/EA=1时,先访问片内程序区,当PC超过片内程序容量时,自动转向外部程序区。
(3)MCS-51单片机有哪些信号需要芯片引脚以第二功能的方式提供答:RXD、TXD、/INT0、/INT1、T0、T1、/WR、/RD(4)MCS-51单片机的4个I/O口在使用上各有什么功能和特点答:P1口通用输入输出;P0口数据总线、地址总线低8位、通用输入输出P2口地址总线高8位、通用输入输出P3第2功能信号、通用输入输出。
(5)单片机的存储器分哪几个空间试述各空间的作用。
答:程序存储器:内部ROM、外部ROM数据存储器:内部基本RAM、专用寄存器区、外部RAM(6)简述片内RAM中包含哪些可位寻址单元答:20H~2FH共16个可寻址单元(7)什么叫堆栈堆栈指针SP的作用是什么在程序设计中为何要对SP重新赋值答:只允许数据单端输入输出的一段存储空间。
SP的作用是用来存放堆栈栈顶的地址。
因为SP的初值是07H,后继的是寄存器区和位寻址区,为了便于编程工作,要修改SP.(8)程序状态字寄存器PSW 的作用是什么简述各位的作用。
答:PSW用来存放程序执行状态的信息,CY—加减运算的进位、借位AC—辅助进位标志,加减运算的低4位进位、借位(9)位地址65H 与字节地址65H 如何区别位地址65H具体在片内RAM中什么位置答:位地址65H中是一位0/1的数据,字节地址65H是8位0/1的数据。
位地址65H在片内RAM中2CH单元第5位。
(10)什么是振荡周期、时钟周期、机器周期和指令周期如何计算机器周期的确切时间答:振荡周期——为单片机提供信号的振荡源的周期时钟周期——振荡脉冲2分频的信号机器周期——完成一个基本操作需要的时间,是振荡周期/12=1T指令周期——执行1条指令需要的时间 1~4T(11)单片机工作时在运行出错或进入死循环时,如何处理答:复位处理,在单片机的RESET加持续1段时间的高电平(12)使单片机复位的方法有几种复位后单片机的初始状态如何分上电复位和手动复位。
第7章 MCS-51 单片机常用接口.

本章要点 MCS-51单片机的最小系统 MCS-51单片机与键盘接口 MCS-51单片机与LED显示器接口 单片机与行程开关、晶闸管、继电器的接口
单片机原理及应用
2019年7月16日星期二
第七章 MCS-51单片机常用接口
7.1 MCS-51单片机的最小系统
G
OE
+ WR P2.0
RD +
单片机原理及应用
Q0
D0
Q1 74LS D1
Q2 244 D2
Q3
D3
Q4
D4
Q5
D5
Q7
D7
Q7
D7
K0
K1 K2 K3 K4 K5 K7 K7
1G
2G
2019年7月16日星期二
第七章 MCS-51单片机常用接口
相应的汇编程序为:
LOOP:MOV DPTR,#0FEFFH MOVX A,@DPTR MOVX @DPTR,A SJMP LOOP
二.8255A的引脚信号
D7~D0:三态双向数据线,与单片机的数据总线相连。
PA3
1
40
PA2
2
39
PA1
3
38
PA0
4
37
RD
5
37
CS GND
7
35
7 8255A 34
A1 8
33
A0 9
32
PC7 1
31
PC7 PC5 PC4 PC0 PC1 PC2 PC3 PB0 PB1 PB2
01112131415171718192
如果用C语言编程,相应程序段为: #include <absacc.h> //定义绝对地址访问
第5章 MCS–51单片机的接口与应用 99页 5.8M

(1) 用键盘连接的I/O线的二进制组合表示键码。例如用4行、
4列线构成的16个键的键盘,可使用一个8位I/O口线的高、低4 位口线的二进制数的组合表示16个键的编码,如图5.4(a)所示。 各键相应的键值为88H、84H、82H、81H、48H、44H、42H、 41H、28H、24H、22H、21H、18H、14H、12H、11H。这种键 值编码软件较为简单直观,但离散性大,不便安排散转程序的 入口地址。
第5章 MCS–51单片机的接口与应用 JNB ACC.2,K2 JNB ACC.3,K3 JNB ACC.4,K4 JNB ACC.5,K5 JNB ACC.6,K6 ;检测2号键是否按下,按下转 ;检测3号键是否按下,按下转 ;检测4号键是否按下,按下转 ;检测5号键是否按下,按下转 ;检测6号键是否按下,按下转
;0号键功能程序
;0号键功能程序执行完返回 ;0号键功能程序
JMP START
……………………… PROM7: ……………………… JMP START …
;1号键功能程序执行完返回
;7号键功能程序 ;7号键功能程序执行完返回
第5章 MCS–51单片机的接口与应用
5.1.4 行列式键盘
行列式键盘又叫矩阵式键盘。用I/O口线组成行、列结构, 按键设置在行列的交点上。例如4×4的行列结构可组成16个键 的键盘。因此,在按键数量较多时,可以节省I/O口线。 1.行列式键盘的接口 行列式键盘的接口方法有许多,例如直接接口于单片机的 I/O口上;利用扩展的并行I/O接口;用串行口扩展并行I/O口接 口;利用一种可编程的键盘、显示接口芯片8279进行接口等。 其中,利用扩展的并行I/O接口方法方便灵活,在单片机应用系
MOVX @DPTR,A
MCS-51单片机的人机界面接口技术

PA 0
PA 1
PA 2
PA PA PA PA PA
3 4 5 6 7
8155
P2.7 8031
P2.0
CE
PC PC PC PC
0 1 2 3
IO/M
WR WR
RD RD
ALE ALE
P0 8 D 0
~
PB 0 PB 1 PB 2
D7 +5V 20μF RESET
PB PB PB PB PB
3 4 5 6 7
键盘中有无按键按下是由列线送入全扫描字、 行线读入行线状态来判断的。键盘中哪一个键按 下可由列线逐列置低电平后,检查行输入状态来 判断。
图8-3 行列式键盘原理电路
2.键盘工作方式(如图8-4~8-7所示) 键盘的工作方式: 编程扫描方式、定时扫描方式、中断扫描方式
三种。 在键盘扫描子程序中完成下述几个功能。
Cr
B
CP
TXD
P3.3 +5V
&
V CC Cr
CP
Q
74LS164
7
A B Q0
+5
a b
V
c
de
gf
dp
2.7k × 8
+5V V CC Cr
Q7
CP 74LS164
Q0
A B
…
+5V
2.7k × 8
图8-21 串行口扩展的键盘/显示器接口
3.8279键盘/显示器接口 8279是专用键盘/显示器控制芯片,能对显示器
返回本章首页
8.2.1 LED显示器接口
1.LED显示器结构与原理 LED显示块是由发光二极管显示字段的显示器
MCS-51微机接口大作业重点讲义资料

《微机接口技术》大作业作业要求:设计一外部设备监控系统,采用CPU为51系列单片机,用C51或ASM51编写软件,给出SCH原理图和软件清单(要求有功能注释),系统要求如下:①系统带有电子时钟,2路模拟量和8路数字量的检测;②4个按键,分别为设置、+、-、->可以可以完成相应的设置过程(包括时间设置和外部监控值的上下限设置);③采用I2C 8583时钟芯片(可以查相关资料);④8个8段LED显示(可以采用SPI总线芯片7219)以辅助完成设置,显示内容:时-分-秒;⑤8个按键分别可以模拟外部8个故障点;⑥2路电位器可以模拟外部模拟信号;⑦EEPROM(I2C总线芯片24c256)保存最近100个外部故障数据(包含故障点和故障时间);⑧RS485上位机接口。
系统软件完成的功能:①上电时电子钟方式显示当前时间;②设置按键进入设置状态,可以重新设置新时间值和外部监控值的上下限,结果写入8583。
设置完成后电子钟方式显示当前时间;③实时监测外部8个数字故障点和模拟数字,一旦故障记录其故障数据、故障发生时间和恢复时间;④上位机传来命令字0xaa向上位机发送所保存的外部故障数据,发送完成后清除保存数据。
(自定义通讯协议)。
一、元器件选择芯片名称型号接口类型线数其它AD转换芯片TLC1549 SPI 3 2块共阴极数码管显示驱动器MAX7219 SPI 3时钟芯片PCF8583 I2C 2EPROM 24WC256 I2C 2串口RS485 MAX487E 3二、MCS-51单片机引脚连接单片机I/O 引脚外部器件连接及功用器件名称引脚代号功用P0^0 SW1 按钮1,模拟外部故障点1P0^1 SW2 按钮2,模拟外部故障点2P0^2 SW3 按钮3,模拟外部故障点3P0^3 SW4 按钮4,模拟外部故障点4P0^4 SW5 按钮5,模拟外部故障点5P0^5 SW6 按钮6,模拟外部故障点6P0^6 SW7 按钮7,模拟外部故障点7P0^7 SW8 按钮8,模拟外部故障点8P1^0 MAX7219 DIN 数码管显示串行数据输入端P1^1 MAX7219 LOAD 数码管显示数据锁存端P1^2 MAX7219 CLK 数码管显示时钟输入端P1^3 --- --- ---P1^4 SPI/TLC1549 CS 模拟SPI片选信号P1^5 SP I/TLC1549 DA TA OUT 模拟SPI数据传送位P1^6 SP I/TLC1549 CLK 模拟SPI时钟控制位P1^7 --- --- ---P2^0 --- --- ---P2^1 SW9 按钮9,系统参数“设置”键P2^2 SW10 按钮10,系统参数增加“+”键P2^3 SW11 按钮11,系统参数减小“-”键P2^4 SW12 按钮12,系统参数项目选择“->”键P2^5 --- --- ---P2^6 MAX487E DE 485串口通信P2^7 MAX487E RE 485串口通信P3^0/RXD MAX487E RXD 485串口通信P3^1/TXD MAX487E TXD 485串口通信P3^2/INT0 PCF8583 INTP3^3/INT1 --- --- ---P3^4/T0 --- --- ---P3^5/T1 --- --- ---P3^6/WR I2C总线SCL 模拟I2C时钟控制位P3^7/RD I2C总线SDA 模拟I2C数据传送位1.I2C器件接线图2.功能按键设置接线图3.AD转换器件接线图4.数码管显示驱动接线图5.485串口接线电路6.单片机复位与外部时钟电路四、软件程序清单1.延时程序:void delay(void);2.启动I2C总线:void I_start(void);3.停止I2C总线:void I_stop(void);4.初始化I2C总线:void I_int(void);5.提供时钟信号,并返回时钟为高电平时SDA的状态:bit I_clock(void);6.向SDA发送一个字节,并检验应答信号:bit I_send(uchar I_data);7.从SDA上读取8位数据信号,并作为一个数据信号返回:byte I_receive(void);8.发送应答信号:void I_ack(void);9.毫秒级延时程序:void delay_ms(int n);10.向8583时钟芯片内指定地址写入数据,并检验应答信号,成功则返回TRUE,否则返回FAULSE:bit Write_8583(uchar Address,uchar data1);11.从8583时钟芯片指定地址读出数据,如成功读取,则发送应答信号,并返回TRUE,否则返回FAULSE:uchar Read_8583(uchar Address);12.初始化8583时钟芯片,预输入时间:void init_8583(void);13.向7219指定地址写入数据:void Write_7219(uchar Address,uchar Data);14.MAX7219初始化:void init_7219(void);15.设置时间和监控值:void set(void);16.向24c256写入器件地址和一个指定的字节地址:bit E_address(uchar Address1,uchar Address2);17.从24c256内地址0开始读出BLOCKSIZE个字节的数据:bit E_read(void);18.向24c256写入数据:bit E_write(uchar data1);19.故障点产生故障时写入24c256:void failure(void);20.将模拟量通过TLC1549转换成数字量:uint TLC1549(void);21.初始化:void init(void);22.接受主机指令:bit Recv_Data(uchar *type);23.发送单字节数据:void Send(uchar m);24.发送数据:void Send_Data(uchar type,uchar len,uchar *buf);25.主函数:void main(void)。
MCS51的片内接口及定时器计数器

参考程序如下:
ORG 0000H LJMP MAIN
ORG 0100H MAIN:
MOV TMOD,#09H MOV TH0,#00H MOV TL0,#00H BACK1: JB P3.2,BACK1 SETB TR0
BACK2: JNB P3.2,BACK2
BACK3: JB P3.2,BACK3 CLR TR0 MOV 70H,TL0 MOV 71H,TH0 SJMP $
P1=~K;} Return; }
5.2 MCS-51定时/计数器及其应用
51系列内部有2个16位的定时/计数器T0、T1
52系列内部有3个16位的定时/计数器T0、T1、T2
功能:
定时 计数
可编程 串行口的波特率发生器
定时/计数器的可编程特性:
⑴ 确定其工作方式是定时还是计数
⑵ 预置定时或计数初值
回目录 上页 下页
计数初值X的计算方法: 计数方式:
N= 2n-X(X即为要求计数的次数)
定时方式: (2n - X)×T = 定时值
∴ X = 2n -定时值 / T 其中T为机器周期,时钟的12分频, 若晶振为6MHz,则T = 2µs, 若晶振为12MHz,则T = 1µs
回目录 上页 下页
BACK:
MOV A,P0 ;读P0口开关状态,并送入累加器A
CPL A
;对累加器A求反
MOV P1,A
;从P1口输出
SJMP BACK ;循环执行
C51参考程序如下: Sfr P0=0x80; Sfr P1=0x90; Void main(){ Volatile unsigned char k; P0=0xff; P1=0; While(1) { K=P0;
MCS-51单片机常用接口技术.

图7.3 用8031的P1口设计的4×4键盘
7.1.2 键盘按键识别方法
首先在键处理程序中将P1.3~P1.0依次按位变低, P1.3~P1.0在某一时刻只有一个为低。在某一位为低时读行线, 根据行线的状态即可判断出哪一个按键被按下。
7.1.3 键盘的接口电路
KEY_00: JB P1.0 KEY_01 LCALL DELAY JNB P1.0 $ LCALL DELAY JB P1.0 KEY_00
KEY_01: … RET
;无键按下查下一个键 ;延时10ms ;键一直按下,等待 ;键松开,延时10ms ;一次按键完成,转键处理程序
88H
不显示 00H
FFH
b
7CH
83H
7.2.2 LED显示器接口及显示方式
LED显示器有静态显示和动态显示两种方式。
1. LED的静态显示方式
LED在显示某一字符时,其显示驱动电路要具有锁存功 能,由单片机送出的显示驱动码一经送出后,在不改变显示内 容的情况下,该驱动码应一直保持到显示下一个字符为止。
7.1.2 键盘按键识别方法
2.线反转法 第1步:将行线P1.4~P1.7作输入,列线P1.3~P1.0为输出线,并将输出线
输出全为低电平,读行线状态,则行线中电平为低的是按键所在的行。
第2步:同上步相反,将列线为输入线,行线为输出线,并将输出线输出为
低电平,读列线状态,则列线是电平为低的是按键所在的列。
7.1.3 键盘的接口电路
2. 利用扩展I/O口设计键盘 MCS-51单片机在总线扩展方式时由于P0口、P2口分别作
为数据总线及地址总线,而P1口、P3口又作它用时,此时扩展 键盘可利用扩展I/O口。图7.4是利用8255的PC口设计的4×4矩 阵键盘。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《微机接口技术》大作业作业要求:设计一外部设备监控系统,采用CPU为51系列单片机,用C51或ASM51编写软件,给出SCH原理图和软件清单(要求有功能注释),系统要求如下:①系统带有电子时钟,2路模拟量和8路数字量的检测;②4个按键,分别为设置、+、-、->可以可以完成相应的设置过程(包括时间设置和外部监控值的上下限设置);③采用I2C 8583时钟芯片(可以查相关资料);④8个8段LED显示(可以采用SPI总线芯片7219)以辅助完成设置,显示内容:时-分-秒;⑤8个按键分别可以模拟外部8个故障点;⑥2路电位器可以模拟外部模拟信号;⑦EEPROM(I2C总线芯片24c256)保存最近100个外部故障数据(包含故障点和故障时间);⑧RS485上位机接口。
系统软件完成的功能:①上电时电子钟方式显示当前时间;②设置按键进入设置状态,可以重新设置新时间值和外部监控值的上下限,结果写入8583。
设置完成后电子钟方式显示当前时间;③实时监测外部8个数字故障点和模拟数字,一旦故障记录其故障数据、故障发生时间和恢复时间;④上位机传来命令字0xaa向上位机发送所保存的外部故障数据,发送完成后清除保存数据。
(自定义通讯协议)。
一、元器件选择芯片名称型号接口类型线数其它AD转换芯片TLC1549 SPI 3 2块共阴极数码管显示驱动器MAX7219 SPI 3时钟芯片PCF8583 I2C 2EPROM 24WC256 I2C 2串口RS485 MAX487E 3二、MCS-51单片机引脚连接单片机I/O 引脚外部器件连接及功用器件名称引脚代号功用P0^0 SW1 按钮1,模拟外部故障点1P0^1 SW2 按钮2,模拟外部故障点2P0^2 SW3 按钮3,模拟外部故障点3P0^3 SW4 按钮4,模拟外部故障点4P0^4 SW5 按钮5,模拟外部故障点5P0^5 SW6 按钮6,模拟外部故障点6P0^6 SW7 按钮7,模拟外部故障点7P0^7 SW8 按钮8,模拟外部故障点8P1^0 MAX7219 DIN 数码管显示串行数据输入端P1^1 MAX7219 LOAD 数码管显示数据锁存端P1^2 MAX7219 CLK 数码管显示时钟输入端P1^3 --- --- ---P1^4 SPI/TLC1549 CS 模拟SPI片选信号P1^5 SP I/TLC1549 DA TA OUT 模拟SPI数据传送位P1^6 SP I/TLC1549 CLK 模拟SPI时钟控制位P1^7 --- --- ---P2^0 --- --- ---P2^1 SW9 按钮9,系统参数“设置”键P2^2 SW10 按钮10,系统参数增加“+”键P2^3 SW11 按钮11,系统参数减小“-”键P2^4 SW12 按钮12,系统参数项目选择“->”键P2^5 --- --- ---P2^6 MAX487E DE 485串口通信P2^7 MAX487E RE 485串口通信P3^0/RXD MAX487E RXD 485串口通信P3^1/TXD MAX487E TXD 485串口通信P3^2/INT0 PCF8583 INTP3^3/INT1 --- --- ---P3^4/T0 --- --- ---P3^5/T1 --- --- ---P3^6/WR I2C总线SCL 模拟I2C时钟控制位P3^7/RD I2C总线SDA 模拟I2C数据传送位1.I2C器件接线图2.功能按键设置接线图3.AD转换器件接线图4.数码管显示驱动接线图5.485串口接线电路6.单片机复位与外部时钟电路四、软件程序清单1.延时程序:void delay(void);2.启动I2C总线:void I_start(void);3.停止I2C总线:void I_stop(void);4.初始化I2C总线:void I_int(void);5.提供时钟信号,并返回时钟为高电平时SDA的状态:bit I_clock(void);6.向SDA发送一个字节,并检验应答信号:bit I_send(uchar I_data);7.从SDA上读取8位数据信号,并作为一个数据信号返回:byte I_receive(void);8.发送应答信号:void I_ack(void);9.毫秒级延时程序:void delay_ms(int n);10.向8583时钟芯片内指定地址写入数据,并检验应答信号,成功则返回TRUE,否则返回FAULSE:bit Write_8583(uchar Address,uchar data1);11.从8583时钟芯片指定地址读出数据,如成功读取,则发送应答信号,并返回TRUE,否则返回FAULSE:uchar Read_8583(uchar Address);12.初始化8583时钟芯片,预输入时间:void init_8583(void);13.向7219指定地址写入数据:void Write_7219(uchar Address,uchar Data);14.MAX7219初始化:void init_7219(void);15.设置时间和监控值:void set(void);16.向24c256写入器件地址和一个指定的字节地址:bit E_address(uchar Address1,uchar Address2);17.从24c256内地址0开始读出BLOCKSIZE个字节的数据:bit E_read(void);18.向24c256写入数据:bit E_write(uchar data1);19.故障点产生故障时写入24c256:void failure(void);20.将模拟量通过TLC1549转换成数字量:uint TLC1549(void);21.初始化:void init(void);22.接受主机指令:bit Recv_Data(uchar *type);23.发送单字节数据:void Send(uchar m);24.发送数据:void Send_Data(uchar type,uchar len,uchar *buf);25.主函数:void main(void)。
五、主要子函数源程序1.函数变量及端口定义#define HIGH 1#define LOW 0#define TRUE 1#define FAULSE 0#define byte unsigned int#define uchar unsigned char#define uint unsigned int#define WRITE 0xA0 //8583写#define READ 0xA1 //8583读#define WRITE1 0xA2 //7219写#define READ1 0xA3 //7219读#define BLOCKSIZE 700#define ACTIVE 0x11 //4种帧的定义#define GETDATA 0xaa#define READY 0x33#define SENDDATA 0x44#define RECFRMMAXLEN 16 //接受帧的最大长度,超过此值认为帧超长错误#define STATUSMAXLEN 700 //设备状态信息最大长度extern xdata uchar StatusBuf[STATUSMAXLEN]; //设备状态信息缓冲区extern xdata byte EEPROM[BLOCKSIZE];extern xdata byte address1_256=0x00; //24c256的写入地址extern xdata byte address2_256=0x00;extern xdata uchar run=0; //run为设置状态extern xdata uchar time; //从8583读取的时间值bit key_flg=0; //key_flg=0无按键,key_flg=1有按键bit transfer_flg=0; //transfer_flg=0无移位键按下,transfer_flg=1有移位键按下extern xdata byte keyvalue; //keyvalue值代表按键extern xdata byte number[]={0x02,0x03,0x04}; //存放时间的8583内部地址extern xdata byte tran=0; //记录移位键extern xdata byte max=0x40; //max为外部监控值的上限extern xdata byte min=0x10; //min为外部监控值的下限uchar DevNo; //设备号sbit set_time=P2^1; //时间设置键接口sbit add_time=P2^2;sbit minus_time=P2^3;sbit transfer_time=P2^4;sbit SCL=P3^7; //I2C总线sbit SDA=P3^6;sbit DIN=P1^0; //SPI总线sbit CLK=P1^2;sbit LOAD=P1^1;sbit CS_AD1549 =P1^4; //AD转换SPI总线sbit CLK_AD_DA =P1^6;sbit DIO_AD_DA =P1^5;sbit DE=P2^6; //驱动器使能,1有效sbit RE=P2^7; //接收器使能,0有效sbit failure1=P0^0; //外部故障点接口sbit failure2=P0^1;sbit failure3=P0^2;sbit failure4=P0^3;sbit failure5=P0^4;sbit failure6=P0^5;sbit failure7=P0^6;sbit failure8=P0^7;2.向SDA发送一个字节,并检验应答信号bit I_send(uchar I_data){register int i;for(i=0;i<8;i++){SDA=(bit)(I_data&0x80);I_data=I_data<<1;I_clock();}SDA=HIGH;return(~I_clock());}3.从SDA上读取8位数据信号,并作为一个数据信号返回byte I_receive(void){register int i;uchar I_data=0;for(i=0;i<8;i++){I_data=I_data<<1;if(I_clock());I_data=I_data&1;}return(I_data);}4.向8583时钟芯片内指定地址写入数据,并检验应答信号,成功则返回TRUE,否则返回FAULSEbit Write_8583(uchar Address,uchar data1){I_start();if(I_send(WRITE)&&I_send(Address)&&I_send(data1)){I_stop();delay();return(TRUE);}else return(FAULSE);}5.从8583时钟芯片指定地址读出数据,如成功读取,则发送应答信号,并返回TRUE,否则返回FAULSEuchar Read_8583(uchar Address){uchar data_8583;I_start();if(I_send(WRITE)&I_send(Address)&I_send(READ)){data_8583=I_receive();I_ack();I_stop();delay();return(data_8583);}}6.向7219指定地址写入数据void Write_7219(uchar Address,uchar Data){uchar i;LOAD = 1;for(i=0;i<8;i++) //传送8位地址{CLK = 0;DIN = (bit)(Address&0x80);Address = Address << 1;CLK = 1;}for(i=0;i<8;i++) //传送8位数据{CLK = 0;DIN = (bit)(Data&0x80);Data = Data << 1;CLK = 1;}LOAD = 0;}7.设置时间和监控值void set(void){char time1;char time2;if(!set_time){delay_ms(5);if(!set_time){keyvalue=0; //设置键按下时,keyvalue为0key_flg=1;}}if(!add_time){delay_ms(5);if(!add_time){keyvalue=1; //加1键按下时,keyvalue为1key_flg=1;}}if(!minus_time){delay_ms(5);if(!minus_time){keyvalue=2; //减1键按下时,keyvalue为2key_flg=1;}}if(!transfer_time){delay_ms(5);if(!transfer_time){keyvalue=3; //移位键按下时,keyvalue位3key_flg=1;}}if(key_flg){key_flg=0;{run=run+1;if((run-1)==4)run=1;if((run-1)==0) //进入时间设置状态{Write_8583(0x00,0x00);}if((run-1)==3) //跳出设置状态{Write_8583(0x00,0x80);}if((run-1)==1) //进入监控最大值设置状态{init_7219();Write_7219(0x01,max);}if((run-1)==2) //进入监控最小值设置状态{init_7219();Write_7219(0x01,min);}}if(keyvalue==1) //若按下加1键{if((run-1)==0&&transfer_flg){transfer_flg=0;if((tran-1)==2){time1=time&0x0f;time2=time&0xf0;time2=time2>>4;time1=time1+0x01;if(time1>0x09){time1=0x00;time2=time2+0x01;}time2=time2<<4;time=time1&time2;if(time>0x24)time=0x00;}if(tran-1<2){time1=time&0x0f; //time1放低位time2=time&0xf0; //time2放高位time2=time2>>4;if(time1>0x09){time1=0x00;time2=time2+0x01;}time2=time2<<4;time=time1&time2;time2=time2>>4;if(time>0x59)time=0x00;}Write_8583(number[tran-1],time);if((tran-1)==0){Write_7219(0x08,time1);Write_7219(0x07,time2);}if((tran-1)==1){Write_7219(0x05,time1);Write_7219(0x04,time2);}if((tran-1)==2){Write_7219(0x02,time1);Write_7219(0x01,time2);}}if((run-1)==1){max=max+0x01;Write_7219(0x01,max);}if((run-1)==2){min=min+0x01;Write_7219(0x01,min);}}if(keyvalue==2) //若按下减1键{if((run-1)==0&&transfer_flg){transfer_flg=0;if((tran-1)==2){time1=time&0x0f;time2=time&0xf0;time2=time2>>4;{time1=0x03;time2=0x02;}else{if(time1==0x00){time1=0x09;time2=time2-0x01;}else{time1=time1-0x01;}}time2=time2<<4;time=time1&time2;time2=time2>>4;}if(tran-1<2){time1=time&0x0f;time2=time&0xf0;time2=time2>>4;if(time1==0x00&&time2==0x00){time1=0x09;time2=0x05;}else{if(time1==0x00){time1=0x09;time2=time2-0x01;}else{time1=time1-0x01;}}time2=time2<<4;time=time1&time2;time2=time2>>4;}Write_8583(number[tran-1],time);if((tran-1)==0){}if((tran-1)==1){Write_7219(0x05,time1);Write_7219(0x04,time2);}if((tran-1)==2){Write_7219(0x02,time1);Write_7219(0x01,time2);}}if((run-1)==1){max=max-0x01;Write_7219(0x01,max);}if((run-1)==2){min=min-0x01;Write_7219(0x01,min);}}if(keyvalue==3) //若按下移位键{if((run-1)==0){transfer_flg=1;time=Read_8583(number[tran]);tran++;if(tran>2)tran=0;if(tran-1==0) //只显示秒位{Write_7219(0x01,0x0f);Write_7219(0x02,0x0f);Write_7219(0x04,0x0f);Write_7219(0x05,0x0f);}if(tran-1==1) //只显示分位{Write_7219(0x01,0x0f);Write_7219(0x02,0x0f);Write_7219(0x07,0x0f);Write_7219(0x08,0x0f);}if(tran-1==0) //只显示时位{Write_7219(0x04,0x0f);Write_7219(0x05,0x0f);}}}}}8.故障点产生故障时,写入24c256void failure(void){uchar key;register uchar i=0;bit port=1;uchar s1,m1,h1,s2,m2,h2;key=P0;if(key!=0xff){delay_ms(5);if(key!=0xff){s1=Read_8583(0x02);m1=Read_8583(0x03);h1=Read_8583(0x04);while(port){port=(bit)(key&0x80);key=key<<1;i++;}while(1){if(key==0xff){s2=Read_8583(0x02);m2=Read_8583(0x03);h2=Read_8583(0x04);break;}}E_write(i);E_write(s1);E_write(m1);E_write(h1);E_write(s2);E_write(m2);E_write(h2);}}}9.将模拟量通过TLC1549转换成数字量uint TLC1549(void){uchar n;uint ad_value=0; //初始化CS_AD1549 = 1;CLK_AD_DA = 0;DIO_AD_DA = 1;CS_AD1549 = 0;for(n=0;n<8;n++) //输出数据{CLK_AD_DA = 1;ad_value=ad_value|(uint)DIO_AD_DA;ad_value=ad_value<<1;CLK_AD_DA = 0;; ;}CS_AD1549 = 1;delay();return (ad_value);}10.接受主机指令bit Recv_Data(uchar *type){uchar tmp,rCount,i;uchar r_buf[RECFRMMAXLEN]; //保存接受到得帧uchar Flag_RecvOver; //一帧接受结束标志uchar Flag_StartRec; //一帧开始接收标志uchar CheckSum; //校验和uchar DataLen; //数据字节长度变量 /*禁止发送,允许接收*/DE=0;RE=0;/*接收一帧数据*/rCount=0;Flag_RecvOver=0;Flag_StartRec=0;while(!Flag_RecvOver){RI=0;while(!RI);tmp=SBUF;RI=0;/*判断是否收到字符“$”*/if((!Flag_StartRec)&&(tmp==0x24)){Flag_StartRec=1;}if(Flag_StartRec){r_buf[rCount]=tmp;rCount++;/*判断是否收到字符“*”*/if(tmp==0x2A)Flag_RecvOver=1;}if(rCount==RECFRMMAXLEN)return (0);}/*校验和字节*/CheckSum=0;DataLen=r_buf[3];for(i=0;i++;i<3+DataLen){CheckSum=CheckSum+r_buf[i+1];}/*判断帧是否错误*/if(rCount<6)return 0;if(r_buf[1]!=DevNo)return 0;if(r_buf[rCount-2]!=CheckSum)return 0;*type=r_buf[2];return 1;}11.发送数据void Send_Data(uchar type,uchar len,uchar *buf){uchar i,tmp;uchar CheckSum=0;/*允许发送,禁止接收*/DE=1;RE=1;/*发送帧起始字节*/tmp=0x24;Send(tmp);Send(DevNo); //发送设备号CheckSum=CheckSum+DevNo;Send(type); //发送类型字节CheckSum=CheckSum+type;Send(len); //发送数据长度字节CheckSum=CheckSum+len;/*发送数据*/for (i=0;i<len;i++){Send(*buf);CheckSum=CheckSum+ *buf;buf++;}Send(CheckSum); //发送校验和字节/*发送帧结束字节*/tmp=0x2A;Send(tmp);}12.主函数void main(void){uchar s1,m1,h1;uchar simu;uchar s2,m2,h2,s3,m3,h3;uchar s1h,s1l,m1h,m1l,h1h,h1l;uchar type;uchar key;key=P0;init_8583();init_7219();init();while(1){s1=Read_8583(0x02);m1=Read_8583(0x03);h1=Read_8583(0x04);h1h=h1&0x10;h1h=h1h>>4;Write_7219(0x01,h1h);h1l=h1&0x01;Write_7219(0x02,h1l);m1h=m1&0x10;m1h=m1h>>4;Write_7219(0x04,m1h);m1l=m1&0x01;Write_7219(0x05,m1l);s1h=s1&0x10;s1h=s1h>>4;Write_7219(0x07,s1h);s1l=s1&0x01;Write_7219(0x08,s1l);set(); //设置程序failure(); //故障点程序simu=TLC1549(); //模数转换程序if(simu<min||simu>max) //模拟量故障程序{s2=Read_8583(0x02);m2=Read_8583(0x03);h2=Read_8583(0x04);while(1){if(key==0xff){s3=Read_8583(0x02);m3=Read_8583(0x03);h3=Read_8583(0x04);break;}}E_write(0x09);E_write(s2);E_write(m2);E_write(h2);E_write(s3);E_write(m3);E_write(h3);}if(Recv_Data(&type)!=0) //写入上位机{switch (type){case ACTIVE:Send_Data(READY,0,StatusBuf);break;case GETDATA:E_read();Send_Data(SENDDATA,strlen(StatusBuf),StatusBuf);break;default:break;}}}}。