1、山东大学单片机实验 硬件实验信息科学与工程学院20162017学年第二学期实验报告课程名称: 单片机原理与应用实验名称: 4.1声光报警实验4.58255并行I/O口扩展及交通灯信号控制实验4.77279键盘扫描及动态LED显示实验 实验报告【实验源程序】实验4.1:按键声光报警实验源程序:#include#define uint unsigned int#define uchar unsigned charsbit bell=P11; /P1.1口位赋值给铃声sbit led=P10; /P1.0口位赋值给灯sbit key0=P12; /P1.2口位赋值给按键uint count;/*主程
2、序*/void main() /按键按下后就触发中断 EA=1; /开放中断 EX0=1; /允许外部中断0中断 IT0=0; /外部中断0设置为电平触发方式 while(1); /循环执行void delay(uint count) /延时1ms uint x,y; for(x=count;x0;x-) for(y=120;y0;y-); void show(uint count) uint i;for(i=0;i=10) /到10清零按键数 count=0; EA=1; /开放中断实验 4.5:8255 并行 I/O 扩展及交通信号灯控制实验#include#include#include
3、 / 可使用其中定义的宏来访问绝对地址#define uchar unsigned char#define uint unsigned int#define PA XBYTE0x7FFC /PA指代外部数据存储器7FFCh的地址#define COM XBYTE0x7FFF /由P0 P2口联合输出地址sbit P30=P30;sbit P31=P31;uint temp,shi,ge,t;uchar a;void show(uint temp);void delay();void delays();void init_8255();void init_8255() COM=0x80; / c
4、 = out, a = out,b = outvoid delay() /延时500MS子程序 uint i,j; for(i=500;i0;i-) for(j=120;j0;j-);void delays() /延时1S子程序 uint i,j; for(i=1000;i0;i-) for(j=120;j0;j-);/*主程序*/void main() init_8255(); TMOD=0x01; /设定工作模式1 EA=1; /开放中断 ET0=1; /允许T0中断 TF0=0; /定时器0溢出标志位 while(1) a=0x26; /变量a赋初值 for(temp=25;temp19
5、;temp-) /绿灯倒计时25s a=a-1; PA=0x69; /东西绿灯亮 show(a); /调用数码管显示子程序 delays(); /延时1s a=0x1a; /变量a赋值 for(temp=19;temp9;temp-) /倒计时 a=a-1; PA=0x69; /东西绿灯亮 show(a); delays(); a=0x0a; for(temp=9;temp0;temp-) a=a-1; PA=0x69; show(a); delays(); for(t=5;t0;t-) /绿灯闪烁5s a=0; /当计时值为0时闪烁 show(a); PA=0xeb; /东西绿灯灭 dela
6、y(); /延时0.5s PA=0x69; /东西绿灯亮 delay(); /延时0.5s a=0x26; for(temp=25;temp19;temp-) /绿灯倒计时25s a=a-1; PA=0x96; /南北绿灯亮 show(a); delays(); a=0x1a; for(temp=19;temp9;temp-) a=a-1; PA=0x96; show(a); delays(); a=0x0a; for(temp=9;temp0;temp-) a=a-1; PA=0x96; show(a); delays(); for(t=5;t0;t-) /绿灯闪烁5s a=0; /当计时值
7、为0时闪烁 show(a); PA=0xbe; /南北绿灯灭 delay(); /延时0.5s PA=0x96; /南北绿灯亮 delay(); /延时0.5s void show(uint a) /显示子程序 SCON=0x00; /工作模式0 SBUF=a; /将变量a的值送给缓存寄存器 while(!TI) /等待发送是否完成 TI=0; /中断标志位清零实验 4.7:7279 键盘扫描及动态 LED 显示实验#include /* 函数定义 *#include #define uchar unsigned char#define uint unsigned int#define RES
8、ET 0xa4 / 复位指令#define RL 0xa1 /左移指令#define DECODE1 0xc8 /译码方式1#define READ 0x15 /读键盘指令void delay1(void); / 长延时void delay2(void);void write7279(uchar, uchar); / 写入到7279uchar read7279(uchar); / 从7279读出void send_byte(uchar); / 发送一个字节uchar receive_byte(void); / 接收一个字节uchar keyma=0x1b,0x13,0x0b,0x03,0x1a
9、,0x12,0x0a,0x02,0x19,0x11,0x09,0x01,0x18,0x10,0x08,0x00;/* 变量及I/O口定义 *sbit cs=P10; / cs 连接于 P1.0sbit clk=P11; / clk 连接于 P1.1sbit dio=P12; / dio 连接于 P1.2sbit key=P13; / key 连接于 P1.3void main() uchar anjian,i,num; send_byte(0xa4); /全部复位指令 while(1) if(key=0) /如果按键按下 send_byte(0x15); /读键盘指令 anjian=recei
10、ve_byte(); /接收键盘数据 for(i=0;i16;i+) if(anjian=keymai) num=i; break; send_byte(0xa1); write7279(0xc8,num);while(key=0); void write7279(uchar cmd, uchar num) send_byte (cmd); send_byte (num); uchar read7279(uchar command) send_byte(command); return(receive_byte();void send_byte( unsigned char out_byte)
11、 unsigned char i; cs=0; /芯片使能 delay1(); for (i=0;i8;i+) /分8次移入数据 if (out_byte&0x80)/先传高位 dio=1; else dio=0; clk=1; delay2(); clk=0; delay2(); out_byte=out_byte*2;/数据左移 dio=0;uchar receive_byte(void) uchar i, in_byte; dio=1; /设置传输口打开 delay1(); for (i=0;i8;i+)/分8次读入数据高位在前 clk=1; delay2(); in_byte=in_byte*2; /数据左移 if (dio) in_byte=in_byte|0x01; clk=0; delay2(); dio=0; return (in_byte);void delay1(void) uchar i; for (i=0;i0x30;i+);void delay2(void) uchar i; for (i=0;i8;i+);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1