单片机实验
报告
软件系统测试报告下载sgs报告如何下载关于路面塌陷情况报告535n,sgs报告怎么下载竣工报告下载
含流水灯交通灯时钟双机通讯
单片机实验报告
班 级:
学 号:
姓 名:
指导老师:
同 组:
实验一 流水灯实验
一、实验目的
1)简单I/O引脚的输出
2)掌握软件延时编程方法
3)简单按键输入捕获判断
二、实验实现的功能
按下电源开关,首先所有发光二极管点亮并闪烁三下,然后顺时针依次亮灭,
形成顺时针流水灯。在发光二极管顺时针旋转时,按下按键1,则发光二级管逆
时针依次亮灭,形成逆时针流水灯。当再次按下按键1时,又恢复顺时针流水灯。
三、系统硬件
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
四、系统软件设计
试验程序如下:
#include
#define uint unsigned int
sbit P3_2 P3^2;
sbit P3_3 P3^3;
sbit P3_4 P3^4;
sbit P3_5 P3^5;
sbit P3_6 P3^6;
sbit P3_7 P3^7;
sbit P0_5 P0^5;
sbit P0_6 P0^6;
sbit P4_4 P4^4;
// 延时100毫秒
void Delay100ms
unsigned char i, j, k;
i 5;
j 52;
k 195;
do
do
while --k ;
while --j ;
while --i ;
// 延时300毫秒
void Delay300ms
unsigned char i, j, k;
i 13;
j 156;
k 83;
do
do
while --k ;
while --j ;
while --i ;
// 流水灯顺时针旋转
void shun_z
uint m,n;
bit a;
for m 0;m 0;
EX0 1; //开外部中断0
a P0_5; //将P0_5口赋给P3_2口
P3_2 a;
P2 0xfe;
P4_4 1;
a P0_5;
P3_2 a;
P3_3 1;
P3_4 1;
P3_5 1;
Delay300ms ;
for n 0;n 8;n++
a P0_5;
P3_2 a;
P2 P2 1;
P2 P2|0x01;
if n 7 break;
Delay300ms ;
P4_4 0;
Delay300ms ;
P4_4 1;
P3_3 0;
Delay300ms ;
P3_3 1;
P3_4 0;
Delay300ms ;
P3_4 1;
P3_5 0;
Delay300ms ;
P3_5 1;
// 流水灯逆时针旋转 interrupt0
void int0 interrupt 0
uint m,n;
EX0 0;
for m 0;m 0;
P4_4 1;
P3_3 1;
P2 0xff;
P3_5 0;
Delay300ms ;
P3_5 1;
if P0_5 0 break;
P3_4 0;
Delay300ms ;
P3_4 1;
if P0_5 0 break;
P3_3 0;
Delay300ms ;
P3_3 1;
if P0_5 0 break;
P4_4 0;
Delay300ms ;
P4_4 1;
if P0_5 0 break;
P2 0x7f;
Delay300ms ;
if P0_5 0 break;
for n 0;n 8;n++
P2 P2 1;
P2 P2|0x80;
if n 7 break;
Delay300ms ;
if P0_5 0 break;
if P0_5 0 break;
// 所有灯点亮并闪烁三下
void SSS
uint m,n;
EX0 0;
P2 0xfe; //所有灯顺时针点亮
P4_4 1;
P3_3 1;
P3_4 1;
P3_5 1;
Delay100ms ;
for n 0;n 8;n++
P2 P2 1;
if n 7 break;
Delay100ms ;
P4_4 0;
Delay100ms ;
P3_3 0;
Delay100ms ;
P3_4 0;
Delay100ms ;
P3_5 0;
Delay100ms ;
for m 0;m 4;m++ //所有灯闪三下
P2 0x00;
P4_4 0;
P3_3 0;
P3_4 0;
P3_5 0;
Delay300ms ;
P2 0xff;
P4_4 1;
P3_3 1;
P3_4 1;
P3_5 1;
Delay300ms ;
Delay300ms ;
// 主函数
void main
P4SW| 0x10; //将P4_4口定义为普通I/O口
P3_6 0;
IT0 0;
EX0 1;
EA 1;
SSS ;
shun_z ;
五、实验过程中遇到的问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
及解决方法
1)如何将外部中断0与按键1联系到一起,
解决方法:通过设置一个中间变量a,将按键1的端口P0^5的值赋给a,再把a的值赋给外部中断0的端口P3^2,这样问题就解决了。
2)外部中断0的端口与灯D9的端口重合,怎样才能使它们相互不受影响, 解决方法:利用杜邦线吧D9的端口移到空管脚P4^4上,但是在此之前要把P4^4端口定义为普通I/O口才可以用。定义方法为在主函数里写一条语句,P4SW| 0x10,这样问题就解决了。
指导老师签字:
日期:
实验二 定时器实验
一、实验目的
1)数码管动态显示技术
2)定时器的应用
3)按键功能定义
二、实验实现的功能
利用按键1、2、4、5设置定时器初值,按键1和按键4分别实现十位加一和减一功能,按键2和键5分别实现个位加一和减一功能,按下键3,开始倒计时,时间到所有灯开始闪烁。
三、系统硬件设计
试验中用到的硬件有:1块stc51单片机、5个按键、1个共阴极四位数码管
四、系统软件设计
试验程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
Uchar code table[]
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e
,0x79,0x71 ; //0~F的共阴极字段码表
uchar chocode[] 0xfe,0xfd,0xfb,0xf7 ; //位选码表
uchar N,M;
sbit P3_5 P3^5; //位定义
sbit P3_6 P3^6;
sbit P3_7 P3^7;
sbit P4_4 P4^4;
sbit P3_3 P3^3;
sbit P3_4 P3^4;
sbit P0_7 P0^7;
// 延时1毫秒
void Delay1ms
unsigned char i, j;
_nop_ ;
i 11;
j 190;
do
while --j ;
while --i ;
// 延时300毫秒
void Delay300ms
unsigned char i, j, k;
i 13;
j 156;
k 83;
do
do
while --k ;
while --j ;
while --i ;
// 数码管显示
void display uchar N,M
P1M0 0xff;
P1M1 0x00;
P0 chocode[3];
P1 table[M];
Delay1ms ;
P0 chocode[2];
P1 table[N];
Delay1ms ;
P0 chocode[1];
P1 table[0];
Delay1ms ;
P0 chocode[0];
P1 table[0];
Delay1ms ;
// 扫描键盘,设置倒计时初值
void Scan_Key void
uchar m;
bit FLAG0 0;
P3_6 0;
P3_7 1;
P0 0xff;
m P0;
switch m&0xf0
case 0xd0: N++;
FLAG0 1;
break;
case 0xb0: M++;
FLAG0 1;
break;
default: break;
if FLAG0
while P0|0x0f ! 0xff //松手检测
display N,M ;
else
display N,M ;
P3_6 1;
P3_7 0;
P0 0xff;
m P0;
switch m&0xf0
case 0xd0: N--;
FLAG0 1;
break;
case 0xb0: M--;
FLAG0 1;
break;
default: break;
if FLAG0
while P0|0x0f ! 0xff //松手检测
display N,M ;
else
display N,M ;
P3_7 1;
P3_6 0;
// 主函数
main
P4SW| 0x10; //将P4_4口定义为普通I/O口
P1 0x0;
while 1
uchar i;
Scan_Key ; //扫描键盘,确定倒计时初值
P0 0xff;
if P0_7 0 //检测是否开始倒计时
while P0|0x0f ! 0xff //松手检测
display N,M ;
while 1 //定时开始
for i 0;i 120;i++ //循环定时120次,实现定时1秒
钟
TMOD 0x01;
TH0 0xd8;
TL0 0xf0;
TR0 1;
display N,M ;
do display N,M ; while TF0 0 ;//检测是否完成一次
定时
if M|N 0 //定时到,所有灯闪烁
while 1
P0 0xff;
P2 0x00;
P4_4 0;
P3_3 0;
P3_4 0;
P3_5 0;
Delay300ms ;
P2 0xff;
P4_4 1;
P3_3 1;
P3_4 1;
P3_5 1;
Delay300ms ;
if M 0
M 9;
N--;
else M--;
五、实验过程中遇到的问题及解决方法
1 如何进行按键扫描,使得每一次按键都能有效,
解决方法:通过看书后面的例题,在结合课设核心板的具体情况,自己慢慢
摸索出来了扫描键盘的方法。
2)怎样实现按一下按键,数码管显示的数值加1或者减1, 解决方法:首先自己试了试很多种方法,但无论如何都无法实现此功能,最
后通过询问同学才知道,在按下按键时要才用“松手检测”的方法,即当按下按
键时数码管一直显示当前值,此方法用while()语句实现。
3)单片机的定时器最大只能实现几十毫秒的定时,怎样才能实现定时一秒
的功能,
解决方法:利用for循环语句使定时器多执行几次定时功能,然后再跳
出循环语句,这样就能实现一秒的定时功能了。
指导老师签字:
日期:
实验三 双机通信实验
一、实验目的
UART 串行通信接口技术应用
二、实验实现的功能
双机通信,当两块板的按键按下时,对方的数码管上显示该键键值 三、系统硬件设计
实验中用到硬件有:两块课程设计核心板,四根杜邦线 四、系统软件设计
试验程序如下:
#include
#include
#define uchar unsigned char #define uint unsigned int uchar code table[] 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d ; //0~6
的共阴极字段码表
sbit P3_6 P3^6; //位定义
sbit P3_7 P3^7;
sbit P0_3 P0^3;
uchar n;
// 延时10毫秒
void Delay10ms //@11.0592MHz
unsigned char i, j;
_nop_ ;
_nop_ ;
i 108;
j 144;
do
while --j ;
while --i ;
// 确定定时器和串行口工作方式以及波特率计算
void UartInit void //9600bps@11.0592MHz
PCON & 0x7F; //波特率不倍速
SCON 0x50; //8位数据,可变波特率
AUXR & 0xBF; //定时器1时钟为Fosc/12,即12T
AUXR & 0xFE; //串口1选择定时器1为波特率发生器
TMOD & 0x0F; //清除定时器1模式位
TMOD | 0x20; //设定定时器1为8位自动重装方式
TL1 0xFD; //设定定时初值
TH1 0xFD; //设定定时器重装值
ET1 0; //禁止定时器1中断
TR1 1; //启动定时器1
ES 1; //开串口
EA 1; //开总中断
// 键盘扫描
void Scan_Key void
uchar m,i;
bit FLAG0 0;
P3_6 0;
P3_7 1;
for i 0;i 2;i++
P0 0xf7; //设置P0口,P0^3位是0,即最右边的
数码管显示键值
m P0;
Delay10ms ; //延时10毫秒,给按键消抖
switch m&0xf0
case 0xd0: n i*3+1; //检测第一列按键是否被按下,如
果有则是table[i*3+1]键
FLAG0 1; //表示有按键被按下
break;
case 0xb0: n i*3+2; //检测第二列按键是否被按下,如
果有则是table[i*3+2]键
FLAG0 1;
break;
case 0x70: n i*3+3; //检测第三列按键是否被按下,如
果有则是table[i*3+3]键
FLAG0 1;
break;
default: break;
P3_6 1;
P3_7 0;
// 串行口发送
void send
SBUF table[n];
while !TI ;
TI 0;
// 串行口接收
void receive
while RI 0 ;
P1 SBUF;
RI 0;
// 主函数
main
UartInit ;
P1M0 0xff; //强推挽输出,使数码管更亮
P1M1 0x00;
P1 0x0;
while 1
Scan_Key ;
send ;
receive ;
五、实验过程中遇到的问题及解决方法
1)不懂得双机通信的原理。
解决方法:仔细看书,不懂的地方问同学,参考书生的例程,最终把双机通信的原理弄懂了。
2)怎样实现串口的接收与发送数据,
解决方法:翻阅参考资料,与同学一起探讨商量,最终找到了较好的办法。
指导老师签字:
日期:
实验四 交通灯实验
一、实验目的
1)按键、数码管、发光二极管综合应用编程技术
2)数据存储于EEPROM的技术(也可以不使用)
3)定时中断技术
4)按键中断技术
二、实验实现的功能
模拟交通灯:通过按键1和按键2设置红灯点亮时间,通过按键4和按键5设置绿灯点亮时间 注意:红灯时间要比绿灯时间多两秒),设置好时间后按下按键3,交通灯开始工作,交通灯工作时按下按键6,所有红灯点亮(出现紧急情况),再次按下按键6恢复正常。
三、系统硬件设计
实验中用到的硬件有:1块stc51单片机、12个发光二极管、6个按键、1个共阴极四位数码管
四、系统软件设计
实验程序如下:
#include
#include
#define uchar unsigned char
#define uint unsigned int
uchar code table[]
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,
0x77,0x7c,0x39,0x5e,0x79,0x71 ; //0~F的共阴
极字段码表
uchar chocode[] 0xfe,0xfd,0xfb,0xf7 ; //位选码表
uchar N,U,M,K,a,b,c,d;
sbit P3_5 P3^5; //位定义
sbit P3_6 P3^6;
sbit P3_7 P3^7;
sbit P4_4 P4^4;
sbit P3_2 P3^2;
sbit P3_3 P3^3;
sbit P3_4 P3^4;
sbit P0_7 P0^7;
sbit P1_7 P1^7;
// 延时1毫秒
void Delay1ms //@11.0592MHz
unsigned char i, j;
_nop_ ;
i 11;
j 190;
do
while --j ;
while --i ;
// 延时10毫秒
void Delay10ms //@11.0592MHz
unsigned char i, j;
_nop_ ;
_nop_ ;
i 108;
j 144;
do
while --j ;
while --i ;
// 数码管显示
void display uchar N,U,M,K
P1M0 0xff; //强推挽输出,使数码管更亮
P1M1 0x00;
P0 chocode[3]; //位选第4位
P1 table[K]; //显示数码管第4位
Delay1ms ;
P0 chocode[2]; //位选第3位
P1 table[U]; //显示数码管第3位
Delay1ms ;
P0 chocode[1]; //位选第2位
P1 table[M]; //显示数码管第2位
Delay1ms ;
P0 chocode[0]; //位选第1位
P1 table[N]; //显示数码管第1位
Delay1ms ;
// 扫描键盘,设置数码管初值
void Scan_Key1 void //扫描第一行按键
uchar m;
bit FLAG0 0;
P3_6 0; //将第一行按键打开,处于能扫描状态
P3_7 1; //将第二行按键关断,不能被扫描
P0 0xff;
m P0;
switch m&0xf0
case 0xd0: N++; a++;
FLAG0 1;
break;
case 0xb0: M++; b++;
FLAG0 1;
break;
default: break;
if FLAG0 //FLAG0为1表示有按键按下
while P0|0x0f ! 0xff //松手检测
display N,U,M,K ;
else
display N,U,M,K ;
void Scan_Key2 void //扫描第二行按键
uchar m;
bit FLAG0 0;
EA 1; //开总中断
IT0 0; //外部中断0为低电平触发
EX0 1; //开外部中断0
P3_6 1;
P3_7 0;
P0 0xff;
m P0;
switch m&0xf0
case 0xd0: U U+1; c++;
FLAG0 1;
break;
case 0xb0: K K+1; d++;
FLAG0 1;
break;
case 0x70: while P0|0x0f ! 0xff //松手检测
display N,U,M,K ;
P3_2 0; //执行外部中
断0
Delay10ms ;
break;
default: break;
if FLAG0 //FLAG0为1表示有按键按下
while P0|0x0f ! 0xff //松手检测
display N,U,M,K ;
else
display N,U,M,K ;
// 定时器
void Timer void
uchar i;
for i 0;i 100;i++ //循环定时100次,实现定时1秒钟
EA 1;
IT0 1;
EX0 1;
Scan_Key2 ; //调用函数,扫描第2行按键
TMOD 0x01; //设置寄存器TMOD,使定时器0工作在方式1
TH0 0xd8; //给定时器0装入初值
TL0 0xf0;
TR0 1; //启动定时器0
display N,U,M,K ;
do display N,U,M,K ; while TF0 0 ; //检测是否完成一次定
时
if K 0 //定时1秒钟到,数码管相应位减1
K 9;
U--;
else K--;
if M 0
M 9;
N--;
else M--;
main
P4SW| 0x10; //将P4_4口定义为普通I/O口
while 1
Scan_Key1 ; //进行按键扫描,定义交通灯显示初值
Scan_Key2 ;
P3_6 0;
P3_7 1;
if P0_7 0 //检查按键3是否按下,如果为0即表示按下,
交通灯开始工作
while P0|0x0f ! 0xff //松手检测
display N,U,M,K ;
while 1
EA 1; //开总中断
IT0 0; //外部中断0选择低电平触发
EX0 1; //开外部中断0
Scan_Key2 ; //扫描第二行按键,看是否有外部中断
P2 0x9e; //南北红灯,东西绿灯亮
P4_4 1;
P3_4 1;
P3_5 0;
do //检查绿灯时间是否减到0
Timer ;
while U|K ! 0 ;
Scan_Key2 ;
K 0x2; //设置黄灯时间2秒
P2 0x5d; //东西绿灯灭,黄灯亮
do //检查东西黄灯,南北红灯时间是否减
到0
Timer ;
while U|K ! 0 ;
Scan_Key2 ;
P2 0xf3; //东西红灯,南北绿灯亮
P4_4 0;
P3_3 0;
P3_5 1;
N a; //将设置的初值赋给数码管
M b;
U c;
K d;
do //检查绿灯时间是否减到0
Timer ;
while U|K ! 0 ;
Scan_Key2 ;
K 0x2; //设置黄灯时间2秒
P2 0xeb; //南北绿灯灭,黄灯亮
P3_4 0;
P3_3 1;
P4_4 0;
do //检查南北黄灯,东西红灯时间是否减
到0
Timer ;
while U|K ! 0 ;
Scan_Key2 ;
N a; //将设置的初值赋给数码管
M b;
U c;
K d;
// 外部中断0
void int0 interrupt 0 //外部中断0的程序
uchar t,d1,d2,d3,d4;
t P2; //保存中断前各灯的状态
d1 P4_4;
d2 P3_3;
d3 P3_4;
d4 P3_5;
P3_6 1; //关闭第一行按键,打开第二行按键
P3_7 0;
do //没有按键按下时,红灯全亮,数码管显示中断
之前的值
display N,U,M,K ;
P2 0xdb;
P4_4 0;
P3_5 0;
P3_3 1;
P3_4 1;
while P0_7 1 ;
while P0|0x0f ! 0xff //松手检测
display N,U,M,K ;
P2 t; //恢复中断前各灯的状态
P4_4 d1;
P3_3 d2;
P3_4 d3;
P3_5 d4;
P3_2 1;
P0_7 1;
五、实验过程中遇到的问题及解决方法
1)如何实现紧急情况,即如何实现按下按键6交通灯所有红灯亮,停止工
作,
解决方法:在程序中加一个外部中断0,当执行中断时,所有红灯亮,
交通灯停止工作。
2)外部中断如何加在程序中才能有效的实现功能,
解决方法:把执行中断的指令“P3_2 0”放在扫描函数中,当按键6按下时,立马执行中断。然后在定时函数中调用扫描函数,实现随时对键盘进行扫描,查看是否有外部中断命令到来。
3)执行外部中断时,如何实现所有红灯亮且数码管显示中断前的数值,
解决方法:首先想到的是在外部中断函数中写一个循环函数,在循环函数中点亮所有红灯,并且数码管显示中断前数值,然后当按键6按下时,跳出循环,实现中断返回。但是实际应用时,中断无法返回,尝试各种办法都无法实现功能。最后通过上网查资料才得知中断中不能加死循环函数,否则无法返回中断。最后我用了do―while语句才实现功能。
指导老师签字:
日期:
《单片机接口技术》实验报告
- 2 -
《单片机接口技术》实验报告
- 16 -
《单片机接口技术》实验报告
- 21 -
《单片机接口技术》实验报告
- 31 -