单片机外部中断做流水灯
单片机控制led灯亮和灭,led灯初始状态从左到右两个灯间隔一个灯循环亮灭,然后从右到左循环亮灭,,当按下按键,led灯全亮,然后全灭。然后再恢复循环。
二、实验过程
(一)实验项目的方案分析
1.设计原理
STC12C5A60S2单片机内部包括微处理器、存储器(存放程序指令或数据的ROM、RAM等)、输入/输出口(I/O口)及其他功能部件如定时/计数器、中断系统等。它们通过地址总线、数据总线和控制总线连接起来。
本实验充分利用了8051芯片的I/O引脚。系统已采用STC12C5A60S2系列单片机为中心器件来设计数码管显示系统,实现数码管循环显示。
2.器件配置清单
表1器件配置表
名称
型号
数值
数量
面包板
MB-102
165*55*
(二)实验项目的硬件电路设计
通过Proteus仿真电路软件搭建电路
(三)实验项目的程序设计
1、C51程序编写
2、keil软件调试截图
通过Keil软件进行C51控制程序的编写,通过不断调试修改,最终的调试好的Keil
调试无措的Keil程序
(四)实验项目的虚拟仿真
打开Keil C软件将上面程序输入,调试无误后编译输出".hex"文件,打开Proteus软件,将之前编译好的".hex"文件加入到芯片中,开始运行仿真。
(五)实验项目的实际验证电路及验证结果
将单片机C51程序编译无误后,生成HEX文件,通过STC-ISP下载到单片机中,下载的软件界面搭建的实际

单片机实验(proteus+keil)串行通信实验
我给你
程序:
#include reg51.h
volatile char temp;
volatile char flag;
void main(void)
{
P3 |= 0x03;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
SM0=0;
SM1=1;
REN=1;
IP=0x00;
flag= 0;
while(1)
{
while ( flag == 0 );
flag = 0;
TI = 0;
SBUF = temp;
while ( !TI );
}
}
void SerialIsr(void) interrupt 4
{
if(RI)
{
RI=0;
temp = SBUF;
flag = 1;
}
}
keil错误:error c129: missing ';' before 'unsigned' 程序怎么修改还是编译不了,请各位前辈指点,谢谢
原因:因为缺少';。解决步骤如下:
1.第一步是打开devc++5.11,然后进入以下界面。
2.接下来,输入以下代码。
3.然后单击下面的框并运行选项。
4.接下来,在下面的框中选择compile选项,如下图所示。
5.然后您可以在下面的框中看到错误。
6.下一步是通过搜索英语单词来寻找期望;'before'z'的意思是:在…之前;“然后通过查看代码找到缺失的第6行”;然后添加它。
7.如果最后进行编译,将发现错误为0,如下图所示。
(keli和Protus仿真软件)单片机中断实验程序代码,小部分有错误,求修改
一、代码写的也很清楚,问题也很明白。先说一下你这个程序想完成的功能吧:
P0口的数码管属于后台程序,他一直循环计数 0~8 。他能被任何一个中段所打断,并且该中断退出后,P0口的数码管能接着被打断之前的数字继续计数,而不是从 0 重新开始,这一点你的程序没有做到。
P2口的数码管由 INT0 中断控制,中断一次,只完成一次 0~8 的计数。他可以打断 P0 口,而不能打断 P1 口,因为 INT0 的优先级低。如果 INT0 被 INT1 打断了,INT1 退出后,INT0 应接着原来的数继续计数,而不是 INT1 退出之后,INT0 不会动了,这一点你的程序也没做到。
P1口的数码管由 INT1 中断控制,中断一次,也完成一次 0~8 的计数。他可以打断 P0口,也可以打断 P2口(INT0),他退出之后,被中断的程序应该恢复之前的工作。
这些问题都是由于在中断服务程序中,没有对现场进行保护引起的。问题找到了,解决方法很简单,就是在每个中断服务程序中加上现场保护就行了,即在每个中断服务程序的开始各加一条语句“PUSH ACC”即可,现场恢复你的程序里边有。
二、下面是修改过的程序,并按照题目的要求添加了注释
ORG 0000H
SJMP STAR
ORG 0003H
SJMP INT0S
ORG 0013H
SJMP INT1S
ORG 0030H
STAR:
MOV IE,#85H //中断允许
MOV TCON,#05H //低电平触发中断
MOV P3,#0FFH //P3口拉高,为两个按钮服务
SETB PX1 //提高 INT1 的优先级
ST0:
MOV A,#1 //立即数 1 送 A,准备读 0 的段码
ST1:
PUSH ACC //入栈保存
ACALL SEG7 //去读段码
MOV P0,A //送 P0 口显示
ACALL DELAY //延时一小会
POP ACC //把保存的 立即数弹回 A
INC A //A 自身加 1,为读取下一个段码做准备
CJNE A,#10,ST1 // A=10:往下走,否则转到ST1
SJMP ST0 //开始下一轮 0~8 的显示
INT0S:
PUSH ACC //该句是添加的,用于现场保护
MOV A,#0
LOOP:
INC A
PUSH ACC
ACALL SEG7
MOV P2,A
POP ACC
ACALL DELAY
CJNE A,#9,LOOP
POP ACC //原来就有,用于现场恢复
MOV P2,#0FFH
RETI
INT1S:
PUSH ACC //这句也是现场保护
MOV A,#0
LOOP1:
INC A
PUSH ACC
ACALL SEG7
MOV P1,A
POP ACC
ACALL DELAY
CJNE A,#9,LOOP1
MOV P1,#0FFH
POP ACC //现场回复
RETI
DELAY:
MOV R7,#250
D1:
MOV R6,#250
D2:
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DJNZ R6,D2
DJNZ R7,D1
RET
SEG7:
MOVC A,@A+PC
RET //这条语句一字节,所以执行上句之前 A 要加 1
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H
END
如果感到满意,你就跺跺脚,踩------纳!!!!!
Keil方法类_中断实验
中断系统和外部中断
实现一个C51单片机中断需要在中断请求标志位、中断允许标志位和
中断优先级控制位进行组合的实现。
下面举一个例子:
1)学会增加中断1并且能够设定优先级对于中断0的打断。
2)加入一个按键查询方式。
3)实现各自的花样流水灯。
头文件和定义引脚:
主函数程序:
主程序中 TCON = 0x00 or TCON = 0x01 or 不填,其实跟整个运行没关系,IE已经确定电平触发方式。
IP = 0x04 高级中断外部中断1(中断号2)对低级中断外部中断(中断号0)的控制。
中断函数1
中断函数2
延时函数
整个程序由几个部分组成:
头文件、主函数、中断函数、延时函数。
其实单片机中断可以很快入门,在学习TCON、IE、IP寄存器过程中,需要进行必要性的记忆,而且应该在每次设计C语言时必须设计程序框图,这样更好去编写程序和发现程序中的问题和编写技巧。
以下的是较为简单的程序图,但是过程较为复杂。注意每一个过程对应每一块模块程序。