求5一1单片机modbus主机程序程序,要求甲乙两机间通过方式1全双工通信,甲的k1控制乙的LED1亮,LED2熄灭

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
天津理工大学单片机经典练习.doc6页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:130 &&
你可能关注的文档:
··········
··········
1. 大作业的所有题目都应在PROTEUS 7.7(注意:只能使用7.7版本)仿真环境下运行通过。大作业完成后发至:
串行口方式1的应用
单片机甲、乙双机进行串行通信,双机的RXD和TXD相互交叉相连,甲机的P1口接8个开关,乙机的P1口接8个发光二极管。甲机设置为只能发送不能接收的单工方式。要求甲机读入P1口的8个开关的状态后,通过串行口发送到乙机,乙机将接收到的甲机的8个开关的状态数据送入P1口,由P1口的8个发光二极管来显示8个开关的状态。双方晶振均采用11.0592MHz。
串行口方式3的应用
甲乙两个单片机进行方式3(或方式2)串行通讯。甲机将8个流水灯控制数据发送给乙机,乙机再利用该数据点亮其P1口的8个LED。方式3比方式1多了一个可编程位TB8,该位一般作奇偶校验位。乙机接收到的8位二进制数据有可能出错,需进行奇偶校验,其方法是将乙机的RB8和PSW的奇偶校验位P进行比较,如果相同,接收数据;否则拒绝接收。
并行接口芯片82C55的应用
根据题53图,要求82C55的PC口工作在方式0,并从PC5脚输出连续的方波信号,频率为500Hz,并用示波器观察。
82C55的接口电路
利用74LSTTL 扩展的I/O接口的应用
电路如题54图所示,编写程序把开关S7~ S0的状态通过74LS373输出端的8个发光二极管显示出来。例如当S5合上时,则LED5点亮。
利用74LSTTL 扩展的I/O接口
测量引脚上正脉冲的宽度
设计要求:利用定时器/计数器门控制位GATEx的应用:测量引脚上正脉冲的宽度(该脉冲宽度应该可调),并在6位LED数码管上以机器周期数显示出来。其方法如题55图所示。
题55图 利用GATE位测量正脉冲的宽度
正在加载中,请稍后...您还可以使用以下方式登录
当前位置:&>&&>& > 甲单片机控制乙机的LED灯
单片机控制led灯 甲单片机控制乙机的LED灯
单片机第七次作业7任务一—甲单片机控制乙机的LED灯一、电路仿真图 二、程序源代码 1.甲单片机程序:#include &REGX52.H& voidUartInit(void)
PCON &= 0x7F;
//波特率不倍速
SCON = 0xD0;
//9位数据,可变波特率
TMOD &= 0x0F;//清除定时器1模式位
TMOD |= 0x20;//设定定时器1为8位自动重装方式
TL1 = 0xFD;
//设定定时初值
TH1 = 0xFD;
//设定定时器重装值
//禁止定时器1中断
//启动定时器1 }bitParityCal(unsigned char dat){
for(i=0;i&8;i++)
if(dat&0x01){
dat&&=1;}} void main(){
unsigned char x=0;
UartInit();
TB8=ParityCal(x);
while(!TI);
while(P1==x);}} 2.乙单片机程序:#include &REGX52.H& #define LED_PORT P0 void UartInit(void)
//9600bps@11.0592MHz {
PCON &= 0x7F;
//波特率不倍速
SCON = 0xD0;
//9位数据,可变波特率
TMOD &= 0x0F;
//清除定时器1模式位
TMOD |= 0x20;
//设定定时器1为8位自动重装方式
TL1 = 0xFD;
//设定定时初值
TH1 = 0xFD;
//设定定时器重装值
//禁止定时器1中断
//启动定时器1 }bitParityCal(unsigned char dat) {
for(i=0;i&8;i++)
if(dat&0x01)
} }void main() {
UartInit();
while(!RI);
rdat=SBUF; RI=0;if(ParityCal(rdat)==RB8)
LED_PORT=~}} 三、设计说明本设计实现了一片单片机通过串口控制另一片单片机驱动的LED亮灯状态的功能。硬件上甲机外接拨码开关用来获得用户的设置,然后其两根串口引脚与乙机的串口引脚交叉连接。乙机外接条形LED显示。程序方面两机器首先初始化,包括启动串口和一些必要的寄存器配置。然后甲机循环检测拨码开关的状态并将状态发送给乙机,发送时在TB8,即第九位数据上加入奇校验位,乙机循环检测接收状态并读取数据,对数据校验通过后将其显示到LED上。四、出现的问题及解决方案1、程序完成后,乙机接收到的数据不正确解决过程:首先我怀疑是数据本身不正确,于是让甲机持续发送拨码开关数据,然后在串口数据线上接入示波器观察波形,发现波形确实是正确的。改变几次拨码开关后我发现好像乙机接收到的数据中间缺少一位。于是我怀疑是不是波特率不对。但是两个单片机的串口初始化程序是一模一样的。于是我就怀疑是不是晶振频率不对,检查晶振频率后发现果然我只修改了甲机的晶振频率到11.0592MHz,而乙机依旧是12MHz。于是修改乙机晶振频率后问题解决。 任务二—甲机控制乙机的计时一、电路仿真图 二、程序源代码
1.甲单片机程序#include "C51GenLib.h" #define START 1 #define STOP 2 #define RESET 3 sbittst= P3^7; voidInitInt() {
IT1=1;} void main(){
UartInit();
InitInt();
while(1);}void Start() interrupt 0 {
static bit keyst = 0;
Delay10ms();if(!INT0){if(keyst == 0)
SBUF = START;
SBUF = STOP;
while(!TI);
while(INT0);}} void Reset() interrupt 2{
Delay10ms();
SBUF = RESET;
while(!TI);
while(INT1);
} } 2.乙单片机程序#include "C51GenLib.h" #define START 1 #define STOP 2 #define RESET 3 unsigned char a=0; unsigned char codescreen[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98,0xbf,0x86,0xaf,0xa3};
//0~9,'-','E','r'void Timer0Init(void)
//50毫秒@12.000MHz {TMOD &= 0xF0;
//设置定时器模式
TMOD |= 0x01; //设置定时器模式
TL0 = 0xB0;
//设置定时初值
TH0 = 0x3C;
//设置定时初值
//清除TF0标志 }voidSysInt(){
Timer0Init();
ES=1;P2=screen[a%10];
P0=screen[a/10];
}void main(){
UartInit();
while(1); }void Timer() interrupt 1 {static unsigned char i=0;
TL0 = 0xB0;
//设置定时初值
TH0 = 0x3C;
//设置定时初值
if(++i==20){
if(++a==100){a=0;
P2=screen[a%10];
P0=screen[a/10];
} }void Control() interrupt 4 {
switch(rb)
case START: TR0=1;
case STOP: TR0=0;
case RESET:
P2=screen[a%10];
P0=screen[a/10];
RI=0; }串口初始化程序与上一任务一致,在此不再赘述 三、设计说明本设计实现了甲机通过串口控制乙机定时的功能。硬件连接方面乙机外接两个数码管用于显示时间,甲机连接两个按钮用于接收用户的操作。两机串口交叉相连,实现串口通信。程序方面甲机开启两个按钮对应的中断,在中断中发送开始计时,暂停计时和复位的编码。乙机程序为一定时器程序,在接收到相应编码后执行相应的动作。四、出现的问题及解决方案有了上一次任务的经验,本次任务完成过程中没有出现问题。调试时首先调试乙机的定时器程序,单独测试乙机是否能正常计时,然后与甲机相连,甲机在发送数据的同时加入一段代码,将发送的编码反映到IO口上,这样我可以观察到甲机是否正常发送了指令。编译运行后发现功能正常,从而完成了整个调试过程。
欢迎转载:
推荐:    

我要回帖

更多关于 pic单片机iic从机程序 的文章

 

随机推荐