被发送字符的ASCII码。
5.编制一个中断方式通信程序。 编程要求同上一条。
五.编程提示
1.按照结构要求写好编程代码和注释。
2.计算波特率,SCInInit(SCI初始化子程序)设置SCI比特率寄存器(SCInBDH,SCInBDL),设置允许SCI、正常码输出、8位数据、无校验,即设置SCI控制寄存器1(SCIxC1)相应位,设置是否允许发送与接收、是中断接收还是查询接收,即设置SCI控制寄存器2(SCIxC2)相应位。
3.查询方式通信程序的主程序主体是一个死循环,循环体中是不断检测SCI是否发送完毕,即检测SCI状态寄存器1(SCIxS1)第七位是否为1,为1则将字符的ASCII码输出到接在PTB口的LED上,并延时一会。
4.中断方式通信程序的主程序也主体是一个死循环,但该循环体是一个空循环体,所有接收和发送数据程序代码放在中断程序中,这里没有检测代码,数据开始发送和接收的条件就是中断的条件。
六.实验报告要求
1.小结AW60串行通信(SCI)的原理及编程,并画出其流程图和程序代码与硬件接线图。 2.小结中断方式和查询方式的编程方法,并画出其流程图和程序代码与硬件接线图。 3.回答下列问题
(1)串行SCI通信有哪些中断?各在什么情况下发生,作用是什么? (2)如何知道串行口TX发送了信号?
提示:方法一,利用万用表在TX端发送0或者255持续0.5秒钟时的电压值。 方法二,在TX端发送0或255持续0.5秒钟的波形时的小灯变化。
七.参考例程:
void main(void) {
unsigned char SerialBuff[]=\初始化存放接收数据的数组 //1 关总中断
DisableInterrupts; //禁止总中断 //2 芯片初始化 MCUInit();
//3 模块初始化
SCIInit(); //串行口初始化 //4 开放中断
EnableInterrupts; //开放总中断
SCISendN(13,SerialBuff); //串口发送“Hello World!”
//5 主循环 while (1)
{ if
((SCI1S1&SCI1S1_RDRF_MASK)!=0) { PTBD=SCI1D ;
if((SCI1S1&SCI1S1_TDRE_MASK)!=0) SCI1D=PTBD; } else
PTBD=0x00; } }
void MCUInit(void) {
SOPT = 0b01100000; //$70 System Options Register(write once) ICGC2 = 0b00110000; //$30 internal clock generation 2
ICGC1 = 0b01111000; //$78 internal clock generation 1 //等待FLL稳定
while(!ICGS1_LOCK); PTBDD=0xff ; PTBD=0xff ; }
void SCIInit() {
unsigned int ubgs,baud=9600; unsigned char sysclk=20;
//1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk*1000000)
ubgs = sysclk*(10000/(baud/100))/16; //理解参考上一行,此处便于CPU运算 SCI1BDH= (unsigned char)((ubgs & 0xFF00) >> 8); SCI1BDL= (unsigned char)(ubgs & 0x00FF);
//无校验,正常模式(开始信号 + 8位数据(先发最低位) + 停止信号) SCI1C1= 0;
//允许发送,允许接收,查询方式收发 SCI1C2= (0
| SCI1C2_TE_MASK | SCI1C2_RE_MASK ); }
void SCISend1(unsigned char ch) {
while(!(SCI1S1 & SCI1S1_TDRE_MASK));//判断发送缓冲区是否为空 SCI1D = ch; }
void SCISendN(unsigned char n, unsigned char ch[]) {
unsigned i;
for (i = 0; i < n; i++) SCISend1(ch[i]); }
unsigned char SCIRe1(unsigned char *p) {
unsigned int k; unsigned char i;
for (k = 0; k < 0x0b; k++)//有时间限制
if((SCI1S1 & SCI1S1_RDRF_MASK) != 0)//判断接收缓冲区是否满 {
i = SCI1D; *p = 0x00; break; }
if (k >= 0x0b) //接收失败 { i = 0xff; *p = 0x01; }
return i; }
unsigned char SCIReN(unsigned n,unsigned char ch[]) {
unsigned char m;
unsigned char fp; //接收标志 m = 0;
while (m < n) {
ch[m] = SCIRe1(&fp); if (fp == 1) {
return 1; //接收失败 } m++; }
return 0; //接收成功 }
实验三 键盘中断及LED数码块实验
一、实验目的:
1.熟练运用嵌入式开发系统环境、C语言及调试方式。 2.复习串行通信接口(SCI)的内容。 3.加强键盘中断基本原理及编程原理的理解。
4.理解“行扫描”法的原理并能进行键值识别和键值编码。 5.理解键盘接线原理图(如图3-1)。
6.理解LED数码块的显示原理,初步掌握LED数码块显示编程方法。
实验箱提供一个16键键盘,用于键盘中断信号的输入。系统提供两种接线方式: ①当将键盘接入上一排插孔时为固定接线,键盘接线原理图如图3-1所示。
②当将键盘接入下一排插孔时为手动接线,连线的位置在键盘的左边。
实验箱提供四个LED数码块,PB0~PB7为段码接口,PTD0、PTD1、PTD4、PTD5为位码控制接口。
MCU内部上拉电阻 +5V 行线m1 m2 m3 m4 列线 n1 n2 n3 n4 PTD0 1K CS0 7 1 2 3 4 5 6 7 a PTG0 PTG1 PTG2 PTG3 PTG4 PTD2 PTD3 PTD7
a f CS1 8 9 10 PTB0 PTB5 1K 1K CS2 11 PTD1 PTD2 b 12 PTB1 a f g e d a b c h 1 a b f g c h 4 5 8 b f g e d 2 3 b c d 6 CS3 1K f g h e d e c h e d h c g 键盘及LED数码块原理图 PTB4 PTB3 PTB7 PTB2 PTB6 PTD3
二、实验要求:
1.仔细阅读本实验指导书。
2.复习有关的键盘中断和串行通信接口(SCI)的章节。 3.熟悉AW60键盘模块的工作方法及编程。
4.根据实验内容要求编写好程序,为实验做充分地准备。
三.实验设备及其连接
1.PC机
一台
2.飞思卡尔嵌入式实验开发系统 一台 3.串行通信线
一根
四.实验内容
1.理解并运行按键扫描及键值键码发送样例程序(将按键的键值及键码从串行口发送到PC机端的串口工具软件);
2.编制一个中断方式的16键键盘程序,使用“行扫描”法识别按键;
采用键盘中断方式。PTD7,3,2及PTG4接键盘4根列线,PTG3-0接键盘4根行线。要求按下的一个键的键值和键面定义值(键的ASCII码值)通过串口在PC方软件界面显示,同时用小灯显示按键的键面定义值(键的ASCII码值),PTB7-PTB0口与小灯相连;
3.理解并运行LED数码块样例程序(在LED数码块上显示“2011”);
4.参考按键及LED数码块样例程序,设计一个按键显示程序。将按键的键码在LED数码块上显示。
7段LED显示字型码 显示字符 字型码 共阴极 共阳极 h g 0 0 1 1 1 1 1 0 1 1 1 1 0 1 f 1 0 0 0 1 1 1 0 1 1 1 1 1 0 e 1 0 1 0 0 0 1 0 1 0 1 1 1 1 d 1 0 1 1 0 1 1 0 1 1 0 1 1 1 c 1 1 0 1 1 1 1 1 1 1 1 1 0 1 b 1 1 1 1 1 0 0 1 1 1 1 0 0 1 a 1 0 1 1 0 1 1 1 1 1 1 0 1 0 0 1 2 3 4 5 6 7 8 9 A B C D 3F 06 5B 4F 66 6D 7D 07 7F 6F 77 7C 39 5E C0 F9 A4 B0 99 92 82 F8 80 90 88 83 C6 A1