浙江理工大学单片机

2022-09-11

第一篇:浙江理工大学单片机

云南大学单片机实验6.6

实验6.6 航标灯实验

一、实验目的与要求

用实验电路板上的PIC16F877A控制一个发光二极管来模拟航标灯工作。模拟航标灯以精确的1Hz频率闪烁,其中关闭时间为0.5s,发光时间为0.5s。要求1Hz闪烁的长期误差达到20ppm以下。

二、实验内容

1、硬件设计思路

0.5s或1s的定时属于一个较长时间的定时,根据本章前半部分的分析,如果TMR1正常工作在定时模式,使用单片机指令周期作为计数脉冲频率,则由于外接晶体频率较高(通常采用4MHz或频率更高的外接晶体),很难实现长时间的定时,因此,本实验通过TMR1的外接晶体振荡器产生的低频信号作为TMR1的计数脉冲,从而提高计时精度和降低软件开发的难度。

出于对成本、通用性和软件开发难度的考虑,本实验选用了32.768kHz的钟表晶体作为外接低频晶体。从这种低频钟表晶体的数据手册可以发现,即使是低成本的钟表晶体的精度和长期稳定性也能达到10ppm以上,为达到实验精度要求提供了物质保障。

2、软件设计思路

无论采用哪一个定时/计数器时,向计数器TMR0、TMR

1、或TMR2寄存器写入初值的操作都将引起预分频器的清零,从而造成从而造成不确定且无法矫正的定时误差。因此,为了达到高精度定时的目的,最好的方法是不使用预分频器。但不使用预分频器有可能造成定时时间太短,解决该问题的办法之一是用软件对达到定时时间的次数计数,这样做又会增加软件的负担。通过外接低频晶体来降低计数脉冲频率是解决上述矛盾的另一种有效方法。以32.768kHz钟表晶体为例,在不使用预分频器的条件下,TMR1溢出的最长时间是2^6/32.768kHz=2s,完全可以达到本实验0.5s定时的要求。

通过T1CON寄存器启用TMR1的内置低频振荡器后,如果不对TMR1寄存器赋初值则TMR1中断时间间隔为2s。当需要每秒一次唤醒单片机时,计数的剩余计数值为最大值的一半,只需要对TMR1设置初值为8000H;当每0.5s唤醒时,考虑剩余计数值为最大值的四分之一,TMR1的初值为0C000H。为了达到0.5s改变一次航标灯开关状态的要求,程序需要在中断对TMR1寄存器赋初值0C000H。

根据本章第三小节中关于为16位的TMR1寄存器赋初值问题的描述,为了防止在对TMR1的高或低两个字节TMR1H和TMR1L赋初值的间隙,发生TMR1L向TMR1H进位从而造成错误,对TMR1H和TMR1L赋初值时应该暂停TMR1的工作。然后采用加法分别对高低两个字节的寄存器赋初值。但由于本实验采用了32.768kHz的计数脉冲频率,上述问题将不再存在,这是因为需要赋的初值为0C000H,低字节是0,这带来两方面的好处:

(1)由于低字节初值是0,距离低字节向高字节进位还很远,几乎不可能产生在高低字节赋值的间隙进位的情况。所以,在本例中赋初值时不用暂停TMR1计数,从而大大提高了计时精度。 (2)采用加法对TMR1L和TMR1H赋初值时,TMR1L可以不用做加法,进而避免了加法中产生的进位问题。

综上,采用外接32.768kHz钟表晶体的方法,完全消除了预分频器和赋初值暂停这两个产生TMR1计时误差的主要来源。这样,定时精度仅受晶体制造精度的影响,这种影响足以达到使航标灯的定时精度降低到20ppm以上的精度。

三、实验步骤及结果

1.从本实验套件提供的元器件中找出32.768kHz的钟表晶体,器件外形为圆柱状。将其焊接在印制电路板上标有Y的位置。

2.从实验套件提供的元器件中找出2只33pF的电容,将其焊接在钟表晶体两侧标有CY1和CY2的位置上。

3.引脚功能选择跳线器JP_RD用于选择单片机PORTD的硬件连接方式。当这组跳线器跨接在左边时,PORTD的引脚将被连接到数码管上,用来驱动两只数码管显示数字;当跳线器跨接在右边位置上时,PORTD的引脚可用于驱动分离的发光二极管LED0~LED7,本实验仅需要一个发光二极管LED0,将其对应的跳线器连接到右边的位置上。

4.在PC机的缺省路径上安装MPLAB及ICD3的驱动程序。

5.从开始菜单运行MPLAB,打开MPLAB后,在Project菜单中选择Project Wizard。单击弹出的工程向导窗口中的“下一步”按钮;在工程向导第一步(Stop One)的窗口中选择本工程要使用的单片机型号——PIC16F877A;在工程向导第二部(Step Two)的窗口中选择合适的编译工具包——Microchip MPASM Toolsuite,窗口中部显示了这个编译工具包内的工具,单击任何一个工具就会在窗口下部显示这个工具所在的路径,如果MPLAB安装在缺省路径则无需修改这些工具的路径;在工程向导第三步(Step Three)的窗口中给新创建工程命名并选择新创建的工程所在的路径;在工程向导第四步(Stop Three)的窗口中,可以将能重复使用的程序文件拷贝到本工程中。完成以上四步后就输入了创建新工程所需的所有参数,工程向导将在最后的总结窗口中显示这些参数,核实无误后单击 “完成”即可完成新工程的创建工作。

6.配置单片机的基本工作方式。单击MPLAB开发环境中单击Configure菜单下Configuration Bits,在弹出的配置位窗口中首先去掉Configuration Bits set code复选框前面的小钩。接着逐一设置窗口中提供的单片机配置位:将振荡器(Oscillator)类型设置为“XT”;“看门狗(Watchdog Timer)”应该关闭,将其设置为“OFF”;将上电复位定时器(Power Up Timer)关闭;将电压检测电路(Brown Out Detect)关闭;低电压编程(Low Voltage Program)设置为“Disabled”;将数据EEPROM读保护(Data EE Read Protect)关闭;将用户程序Flash写保护(Flash Program Write)设置为“Write Protection Off”;将代码保护(Code Protect)关闭。完成以上设置后关闭配置位窗口。

7.将仿真器ICD3和实验实验套件电路板相连。连接时注意仿真器连接电缆的第一脚应该和实验套件的第一脚相连。

8.将仿真器和PC机用USB连接起来,在Debugger菜单Select Tool选择调试工具为ICD3. 9.将外接电源适配器的一端连接在200v的市电插座上,另一端连接在实验电路板套件上供电。 10.使用软件模拟器测试代码。在MPLAB开发环境的Debugger菜单中选择MPLAB SIM,此时MPLAB环境的外观和菜单项都会发生变化。

11.选择File菜单下的New命令新建一个汇编语言文件,输入按本实验要求所写的代码,保存时注意选择文件的类型为汇编语言源文件。

12.用右键单击MPLAB的工程管理窗口(可以用View菜单下Project打开或关闭),从弹出的快捷菜单中选择Add Files.....,将第四步编写好的汇编文件加入工程中。

13.编译工程。在Project菜单中选择Build All。如果有错误,则根据输出窗口的提示改正之,直到完全正确。

14.单击Program Target Device快捷方式,分别将刚才编译成功的主机和从机的程序下载到目标单片机中。

15.如果程序编写正确,则可以观测到LED以1Hz的频率闪烁,其中点亮和熄灭的时间各为一半。

16.观测LED0闪烁100次200次的时间是否为100s或200s。

17.通过修改赋予TMR1H和TMR1L的初值可改变LED闪烁的频率,试将闪烁频率改为0.5Hz和0.25Hz。 程序代码如下

#include p16f877a.inc w_temp EQU 20H status_temp EQU 21H pch_temp EQU 22H COUNT EQU 23H COUNT1 EQU 24H COUNT2 EQU 25H PORTD_TEMP EQU 26H COUNT3 EQU 27H

ORG 00H NOP GOTO MAIN

ORG 0004H ;中断入口地址

MOVWF w_temp MOVF STATUS,w

CLRF STATUS MOVWF status_temp MOVF PCLATH,W MOVWF pch_temp GOTO INTTMR1 MAIN ORG 20H BCF STATUS,RP1 BSF STATUS,RP0 ;转到体1

CLRF TRISD ;设置PORTD口为输出

BCF STATUS,RP0 ;转到体0 MOVLW 0EH MOVWF T1CON ;TMR1配置为对外计数模式,使用T1自带振荡器,不使用预分频和同步电路

BSF STATUS,RP0 ;转到体1 BSF PIE1,TMR1IE ;允许TMR1中断

BSF INTCON,GIE ;开启全局中断

BSF INTCON,PEIE ;开启外设中断

BCF STATUS,RP0 ;转到体0 BCF PIR1,TMR1IF MOVLW 00H ADDWF TMR1L,f MOVLW 0C0H ADDWF TMR1H,f ;设定TMR1定时半秒初值为0xC0h,低位可用默认值00,只需送入高位TMR1H CLRF PORTD BSF T1CON,TMR1ON GOTO $

INTTMR1

BTFSS PIR1,TMR1IF GOTO RECOVER BCF PIR1,TMR1IF MOVLW 0C0H ADDWF TMR1H,f BTFSC PORTD,0 GOTO CRL_PORTD0 GOTO SET_PORTD0 CRL_PORTD0 BCF PORTD,0 GOTO RECOVER SET_PORTD0 BSF PORTD,0 GOTO RECOVER

RECOVER

CLRF STATUS MOVF pch_temp,w MOVWF PCLATH MOVF status_temp,w MOVWF STATUS SWAPF w_temp,f SWAPF w_temp,w RETFIE END

四、实验心得 在本次试验中,我们按照书上的要求认真编写了程序,在编写的过程中出现了一些小问题在请教同学之后都顺利地解决了。程序下载后我们发现LED灯并没有闪烁,令我们百思不得其解,后来无意中拔掉了JP_RA和JP_RC的条线端子后灯就闪烁起来的,在请教了老师之后知道了原来是外部晶振的问题。

第二篇:南京工业大学自动化单片机实习报告

南 京 工 业 大

单 片 机 应 用 实

学生姓名: 学

号: 专

业: 班

级:

2014年6月

一、 实习地点

学科楼D30

1、D208

二、 实习时间

2014-5-26——2014-6-6

三、 实习项目

1. 绘制学习板的电路图,熟悉Altium Designer软件。

2. 利用STC89C52RC的定时器1实现:可调时电子钟(液晶显示)。

3. 使用开发板上的DS18B20进行环境温度测量,并将测量到的温度值显示(七段码显示),小数点后一位有效数字,单位为C。

4. 熟悉STC89C52RC的定时器2,并用定时器2实现可调时电子钟(七段码显示器)。

5. 第3题基础上实现:当温度大于等于28.0℃时,蜂鸣器鸣叫,同时,继电器闭合;当温度小于28.0℃时,蜂鸣器停止鸣叫,同时,继电器断开。 6. 在第3题基础上增加一个温度报警点设置界面(七段数码显示),例如第5题中的28.0℃报警点可通过按键进行设置任意修改,修改后的温度报警值不需要存储,每次开机后先进行报警值的设置,程序其他功能与第5题相同。 7. 利用24C02芯片,对第3题中开机1分钟内的环境温度测量值进行永久保存。 8. 将第7题中保存的温度值利用按键操作依次进行读取,利用数码管显示。

四、 实习项目完成情况

1.电路图能够很好的完成,在老师进行了该软件的大概讲解后,对软件有一定的了解,但是在应用过程中遇到了问题有:找不到该放置的元器件,网络标识的放置等等。在自己的摸索下能够很好的完成该电路图,但是完成后出现警告,仔细检查后解决了该问题。评价——优秀

2.定时器1实现可调电子钟,在液晶屏上显示。这个项目是在课堂例题定时器实现可调电子钟的基础上修改的。采用一个动态显示函数就可以实现,将数据送入液晶显示即可。 评价——良好

3使用开发板上的DS18B20进行环境温度测量,并将测量到的温度值显示在数码管上。这个DS18B20之前没有接触过,自己能力毕竟有限。所以就从网上找了相关的程序。有的地方不合适的改进了一下,最终完成了这个项目。评价——及格

4用定时器2实现可调电子钟。这个项目是在课堂案例里面的定时器实现电子钟的基础上修改的。用定时器2取代定时器1。但是定时器2没有学过,于是参考课本上的讲解,实现它的初始化,打开,清零等功能。但是在52单片机里面没有定时器2,所以头文件还是应该换成52单片机的。 评价——良好

5.这个项目是在第三个项目的基础之上,加个报警程序就好了。这个报警程序之前不会,从网上参考了一些,实现了该功能。评价——及格

6.显示当前的温度并设置报警温度:该程序主要是几个小程序的组合,最初整合以后会有些功能无法实现,错误在于几个小程序整合的位置不正确,纠正各部分的位置,将显示整合为一个,程序运行还是不满意,还是有点问题。 评价——及格

以下项目根据自己完成情况进行描述: 7. ................................ 8. ................................

五、 典型项目实习报告

1. 项目描述

项目2:

功能:利用STC89C52RC的定时器1实现:可调时电子钟(液晶显示)。 操作说明书:

① 上电后液晶正常显示,显示时间。

② 左起第一个按键(S17)作为调整时间切换按键。

③ 下左起第二个按键(S18),为递增;左起第三个按键(S19),为递减。 ④ 调整完成后,按下S17,时间修改完成。 附实物图:

2. 学习板电路图

3. 程序清单 #include //头文件

#include "lcd12232.h" #include "delay.h" #define KEY_PIN P3

SHOW_MIN_ADJ,SHOW_HOUR_ADJ, }ShowState; enum {

LED_GOOUT = 10, CHAR_DEC = 12,

unsigned char GetKey(void);

//取键值

unsigned char LEDBuffer[8];

//显示缓冲区

unsigned char Second;

//秒

unsigned char Minute;

//分

unsigned char Hour;

//时

bit Timer1sFlg;

//定时1秒标志位 bit Timer05sFlg;

//定时0.5秒标志位

typedef enum

//枚举 状态法 { NULL, KEY_ENTER, KEY_UP, KEY_DOWN }TYPEDEF_KEY;

enum SHOW_STATE

{ SHOW_NORMAL,

SHOW_SEC_ADJ,

};

/*函数声明*/

void AT89S51Config(void);

void VariableInitial(void); void ShowNormal(void);

void ShowSecondAdj(void); void ShowMinuteAdj(void);

void ShowHourAdj(void); /*主函数*/

void main() {

LcdConfig();

//AT89S51配置

AT89S51Config(); //AT89S51配置

VariableInitial(); 量初始化

while(1)

{

switch(ShowState) 示按键对应状态

{

// // case SHOW_NORMAL:

ShowNormal(); break; case SHOW_SEC_ADJ:

ShowSecondAdj(); break; case SHOW_MIN_ADJ:

ShowMinuteAdj(); break; case SHOW_HOUR_ADJ:

ShowHourAdj(); break; default:

break; } DrawWord(LEDBuffer[7],0,29,8); //送LCD显示

DrawWord(LEDBuffer[6],0,37,8); DrawWord(LEDBuffer[2],0,45,8); DrawWord(LEDBuffer[4],0,53,8); DrawWord(LEDBuffer[3],0,61,8); DrawWord(LEDBuffer[5],0,69,8);

DrawWord(LEDBuffer[1],0,77,8);

DrawWord(LEDBuffer[0],0,85,8);

Delay_ms(5); // 延时若干

毫秒

}

}

/*AT89S51配置*/

void AT89S51Config(void) { TMOD = 0x01; //* TL0 = (6553650000)/256; //*

TR0 = 1; //* IE = 0x82;

} /*

* TMOD(89H):GATE C//T M1 M0 GATE C//T M1 M0

默认:0x00

其中:C//T:定时计数选择

M1-0: 工作方式选择

GATE:启动方式设定

0:软件启动(常用)

1:外部中断启动

* 工作方式1: TL0和TH0组成16位的定

时器

* TR0(TR1): 1: 启动定时计数器0(1);

0: 关闭定时计数器0(1) * IE(0A8H): EA / / ES ET1 EX1 ET0 EX0

默认:0x00

*/

/*变量初始化*/

void VariableInitial(void) {

ShowState = 0;

Second = 0;

Minute = 0;

Hour = 0;

Timer1sFlg = 0; Timer05sFlg = 1;

}

/************************************ *********************/ /*正常显示界面*/

/************************************ *********************/ void ShowNormal(void) {

TYPEDEF_KEY key;

//1秒钟到,显示值更新

if(Timer1sFlg)

{ Timer1sFlg = 0;

Second++;

if(Second >= 60)

{

Second = 0;

Minute ++;

if(Minute >= 60)

{

Minute = 0;

Hour ++;

if(Hour >= 24)

{

Hour = 0;

}

}

}

}

//界面显示

LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区 LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区 LEDBuffer[3] = Minute % 10; LEDBuffer[4] = Minute / 10; LEDBuffer[6] = Hour % 10; LEDBuffer[7] = Hour / 10; if(Timer05sFlg) { LEDBuffer[2] = CHAR_DEC; LEDBuffer[5] = CHAR_DEC;

} else

{

LEDBuffer[2] = LED_GOOUT; LEDBuffer[5] = LED_GOOUT; }

//正常显示界面下响应按键

key = GetKey(); if(key == KEY_ENTER) { ShowState = SHOW_SEC_ADJ; }

}

/*********************************************************/ /*秒针调整界面*/ /*********************************************************/ void ShowSecondAdj(void) { TYPEDEF_KEY key; unsigned char i;

//界面显示

for(i = 0; i < 8; i++) { LEDBuffer[i]

=

LED_GOOUT; //熄灭

} LEDBuffer[0] = Second % 10; //秒个位送显示缓冲区

LEDBuffer[1] = Second / 10; //秒十位送显示缓冲区

//秒针调整界面下响应按键

key = GetKey(); switch(key) {

case KEY_ENTER:

ShowState = SHOW_MIN_ADJ;

break;

case KEY_UP:

Second++;

if(Second >= 60)

{

Second = 0;

}

break;

case KEY_DOWN:

if(0 == Second)

{

Second = 59;

}

else

{

Second--;

}

break;

}

} /*********************************************************/ /*分针调整界面*/ /*********************************************************/ void ShowMinuteAdj(void) { TYPEDEF_KEY key; unsigned char i; //界面显示

for(i = 0; i < 8; i++) { LEDBuffer[i]

=

LED_GOOUT; //熄灭

} LEDBuffer[3] = Minute % 10; //分个位送显示缓冲区

LEDBuffer[4] = Minute / 10; //分十位送显示缓冲区

//分针调整界面下响应按键

key = GetKey(); switch(key) { case KEY_ENTER:

ShowState = SHOW_HOUR_ADJ; break; case KEY_UP:

Minute++; if(Minute >= 60)

{

Minute = 0;

}

break;

case KEY_DOWN:

if(0 == Minute)

{

Minute = 59;

}

else

{

Minute--;

}

break;

}

}

/*********************************************************/ /*小时调整界面*/

/*********************************************************/ void ShowHourAdj(void) { TYPEDEF_KEY key; unsigned char i; //界面显示

for(i = 0; i < 8; i++) {

LEDBuffer[i]

=

LED_GOOUT;//熄灭

} LEDBuffer[6] = Hour % 10; //小时个位送显示缓冲区 LEDBuffer[7] = Hour / 10; //小时十位送显示缓冲区

//小时调整界面下响应按键 key = GetKey(); switch(key) { case KEY_ENTER: ShowState = SHOW_NORMAL; break; case KEY_UP: Hour++; if(Hour >= 24) {

Hour = 0; } break; case KEY_DOWN:

if(0 == Hour) {

Hour = 23; } else { Hour--; }

break;

}

}

/*定时中断0的中断函数*/ Timer0() interrupt 1

//*

{ static unsigned char count_1s; static unsigned char count_05s; TL0 = (6553650000)/256;

count_1s++; count_05s++; if(count_1s >= 20) {

Timer1sFlg = 1;

count_1s =0;

}

if(count_05s >= 10) {

Timer05sFlg = !Timer05sFlg;

count_05s =0;

}

} /*

*

0-4号中断分别为:外部中断0

定时中断0 外部中断1 定时中断1 串

行中断

*/

/*得到按键值*/

TYPEDEF_KEY GetKey(void)

{

TYPEDEF_KEY key = NULL;

if( ~KEY_PIN & 0x1c)

//有键按下

{ Delay(1000);

//去抖动

if(~KEY_PIN & 0X04)

{

key = KEY_UP;

}

else if(~KEY_PIN & 0X08)

{

key = KEY_DOWN;

}

else if(~KEY_PIN & 0X10)

{

key = KEY_ENTER;

}

else

{

return(NULL);

}

while( ~KEY_PIN & 0x1c) //等待键抬起

{

Delay(2);

}

return(key);

}

return(NULL);

}

//---------------------- //文件名称:lcd12232.c #include

#include "delay.h" #include "lcd12232.h"

//LCD接口定义

#define LCD12232_A0 P2_7 #define LCD12232_E1 P2_6 #define LCD12232_E2 P2_5

#define LCD12232_DATA P0

void

out_major_instruction(unsigned

char i);

void out_major_data(unsigned char i); void

out_secondary_instruction(unsigned

char i);

void out_secondary_data(unsigned char i);

void out_data(unsigned char

page,unsigned char address,unsigned char dat);

//字库(纵向取模,倒序,宋体,12号) unsigned char code wordBmp[]= {

0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00, //0 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00, //1 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00, //2 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00, //3 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00, //4 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00, //5 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00, //6 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00, //7 0x00,0x70,0x88,0x08,0x08,0x88,0x7

0,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00, //8

0x00,0xE0,0x10,0x08,0x08,0x10,0xE

0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00, //9

0x00,0x00,0x00,0x00,0x00,0x00,0x0

0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //10 清0

0x00,0x00,0x00,0x00,0x00,0x00,0x0

0,0x00,0x00,0x30,0x30,0x00,0x00,0x00,0x00,0x00, //11 小数点

0x00,0x00,0x00,0x18,0x18,0x00,0x0

0,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00, //12 杠

};

//12232点阵液晶配置,开机后仅调用一次 void LcdConfig(void) { out_major_instruction(0XE2); // 复位 (13)

out_secondary_instruction(0XE2); // 复位 (13)

Delay_ms(1500);

out_major_instruction(0XA9); //1/32占空比(10)

out_secondary_instruction(0XA9); //1/32占空比(10)

out_major_instruction(0XA4); //正常驱动 (9)

out_secondary_instruction(0XA4); //正常驱动 (9)

out_major_instruction(0XA0); //设置显示方向为正向(8); OCM12232-1 out_secondary_instruction(0XA0); //设置显示方向为正向(8); OCM12232-1 //out_major_instruction(0XA1); //设置显示方向为反向(8); HDM32GS12-B //out_secondary_instruction(0XA1); //设置显示方向为反向(8); HDM32GS12-B

out_major_instruction(0X00); //设置起始列为第0列 (4)

out_major_instruction(0XC0); //设置起始行为第0行 (2)

out_secondary_instruction(0X00); //设置起始列为第0列 (4)

out_secondary_instruction(0XC0); //设置起始行为第0行 (2)

out_major_instruction(0XEE); //关闭"读-修改-写"模式(11)

out_secondary_instruction(0XEE); //关闭"读-修改-写"模式(11)

out_major_instruction(0XAF); //开屏幕显示(不影响显示内容)

out_secondary_instruction(0XAF); //开屏幕显示(不影响显示内容)

ClrScreen();

}

//------------------------------ //清屏

//------------------------------ void ClrScreen(void) { unsigned char page,address; for (page=0;page<4;page++)

for

(address=0;address<122;address++) {

out_data(page,address,0x00);

}

}

//--------- //函数说明:显示汉字

//参数说明:汉字在字表中的位置;显示的行位置;显示的列位置;汉字宽度 //--------- void DrawWord(unsigned

char wordPosition,unsigned

char layer,unsigned char address,unsigned char width) //(内容,行,列,字的宽度) { unsigned char i; unsigned char word_position = (int)wordPosition << 4;

for(i = 0; i < width; i++) { out_data(layer * 2 , address + i, wordBmp[word_position + i]); // *

out_data(layer * 2 + 1, address + i, wordBmp[word_position + i + width]);

}

} /* * proteus存在bug:需一页一页的写,不上下跳着写,显示才正常。

*/

////////////////////////////////////////////////////////////// ///////内部函数

//发指令i到主窗口(内部函数) void

out_major_instruction(unsigned

char i) { LCD12232_E1 = 1;

//选择

LCD12232_A0 = 0;

LCD12232_DATA = i;

LCD12232_E1 = 0;

}

//发数据i到主窗口(内部函数) void out_major_data(unsigned char i) {

LCD12232_E1 = 1;

LCD12232_A0 = 1;

LCD12232_DATA = i; LCD12232_E1 = 0;

}

//发指令i到从窗口(内部函数) void

out_secondary_instruction(unsigned char i) { LCD12232_E2 = 1;

LCD12232_A0 = 0;

LCD12232_DATA = i; } LCD12232_E2 = 0;

{

out_major_instruction(0xB8

|page);

LCD12232_E2 = 1; LCD12232_A0 = 1; LCD12232_DATA = i; LCD12232_E2 = 0;

out_secondary_instruction(0xB8 out_major_instruction(address); } else {

out_major_data(dat); //发数据i到从窗口(内部函数) void out_secondary_data(unsigned char i) {

} //将数据写到指定行和列(内部函数) void out_data(unsigned

char

|page);

out_secondary_instruction(address page,unsigned char address,unsigned char dat) {

- 61);

}

}

out_secondary_data(dat); if(address < 61)

六、 实习感受和总结

两周短暂而又充实的实习,我觉得硬件的理解难度比软件难。但是通过自己对有的项目的理解,还是能看懂的。通过自己的双手却难敲出自己想要实现的功能。

单片机的编程对C语言的要求比较高,若能很好的掌握C语言的话,编程起来很迅速也很熟练。设计到中断那边的话,要懂得查阅相关书籍,了解每个部分的作用,如何打开中断,如何实现,如何初始化等等。在此期间,我更加懂得和别人合作,善于借鉴别人的思想和思路,共同完成一个项目。

当然,在实习过程中我们也遇到了各种问题,比如学习陌生的软件及元器件,对自主学习能力也是一种考验,在难度比较大的项目上我选择了放弃,远远超出了自己的能力范围。在以后的学习中,懂得适当的割舍还是比较好的,搞清楚最基本的原理,才能为以后的学习做铺垫。

时间: 年签名:

月 日

第三篇:西安科技大学2010年(07级)单片机课程设计题目及要求

2010年(07级)单片机课程设计题目及要求

一、题目

1.模拟交通灯控制系统

基本要求(60分): ⑴ 硬件设计:根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。 ⑵ 软件设计:模拟实际交通灯控制系统功能,完成控制软件的编写与调试; ⑶ 功能要求:利用2个数码管进行1秒倒计时显示,最大定时时间为90秒;利用红、绿、黄三种不同颜色的LED显示不同的通行情况,要求LED点亮时间和倒计时时间准确;

⑷ 设计说明书(论文):设计说明书应表明设计思想和所使用的设计方法,主要内容包括:① 系统简介、整体功能说明、各功能模块说明(附图)及系统使用说明;② 设计还需要改进的地方及设计的心得体会;③ 参考文献:包括参考书、资料、网站等,按标准格式列出(可参考教材最后的参考文献引用格式);④ 附件:系统总体原理图及源程序。

扩展功能:

根据实际情况自由添加相关的附加功能,如设定一个紧急情况按钮,当有突发事件发生(如救护车、消防车等通过)时,各路口均为红灯,只允许特定车辆通行。每扩展一项完整的功能加20分。

2.简易数字电压表

基本要求(60分): ⑴ 硬件设计:根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。 ⑵ 软件设计:根据电压测量及显示功能要求,完成相关软件的编写与调试; ⑶ 功能要求:2位数字及1位小数点显示,基本测量范围为0~5V,测量误差为±0.2V。 ⑷ 设计说明书(论文):设计说明书应表明设计思想和所使用的设计方法,主要内容包括:① 系统简介、整体功能说明、各功能模块说明(附图)及系统使用说明;② 设计还需要改进的地方及设计的心得体会;③ 参考文献:包括参考书、资料、网站等,按标准格式列出(可参考教材最后的参考文献引用格式);④ 附件:系统总体原理图及源程序。

扩展功能:

根据实际情况自由添加附加功能,如扩展电压测量范围(可扩展为0~10V,0~20V,0~100V等)、提高精度,实现量程的自动转换等。每扩展一项完整的功能增加20分。

3.数字显示温度计

基本要求(60分): ⑴ 硬件设计:根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。 ⑵ 软件设计:根据温度测量及显示功能要求,完成控制软件的编写与调试; ⑶ 功能要求:至少利用3位数码管进行测量值的显示,温度测量范围:-50℃~100℃,测量误差≤0.1℃; ⑷ 设计说明书(论文):设计说明书应表明设计思想和所使用的设计方法,主要内容包括: ① 系统简介、整体功能说明、各功能模块说明(附图)及系统使用说明; ② 设计还需要改进的地方及设计的心得体会; ③ 参考文献:包括参考书、资料、网站等,按标准格式列出(可参考教材最后的参考文献引用格式); ④ 附件:系统总体原理图及源程序。 扩展功能:

根据实际情况自由添加附加功能,如设置温度的上下限报警功能,利用语音或声光报警等。附加一项完整的功能增加20分。

4.数字电子钟

基本要求(60分): ⑴ 硬件设计:根据任务要求,完成单片机最小系统及其扩展设计,焊接电路板,组成功能完整的样机。 ⑵ 系统软件设计:根据数字电子钟系统功能,完成控制软件的编写与调试;

⑶ 基本功能:设计一个数字电子钟电路,能显示年、月、日和时、分、秒;通过功能键可以完成年、月、日与时、分、秒的调整和显示切换。

⑷ 设计说明书(论文):设计说明书应表明设计思想和所使用的设计方法,主要内容包括:

① 系统简介、系统整体功能说明、各功能模块说明(附图)、系统使用说明;

② 设计还需要改进的地方及设计的心得体会;

③ 参考文献(包括参考书、资料、网站等,按标准格式列出); ④ 附件:系统总体原理图及源程序。 扩展功能:

根据实际情况自由添加附加功能,如万年历、秒表等功能。附加一项完整的功能增加20分。

二、时间安排

第十周:选题目(可以自选题目,但必须由指导教师审批) 第十一周:初步设计方案(包括电路原理图及元件清单) 第十二周~第十五周:软硬件设计

第十六周~第十八周:测控、微电、自动化专业软件调试(在单片机实验室)、硬件调试及验收

注:根据教学计划安排,调试时间截止到十八周。软件调试期间,由于实验室资源有限,各专业各班必须相互协调好使用单片机实验室进行软件调试的时间,不要相互冲突。该项工作由各班班长负责协调。

三、说明

1.设计按最多三人一组选题,组内人员分工必须明确。确定题目后由班长统一报实验室备案。设计题目可以在上述四个题目外自选,但难度应不低于上述要求,且须由任课教师审查后方可确定;

2.初步设计方案完成(包括电路原理图及元件清单)并由教师审定后,元件清单交由班长汇总(一式两份,一份由班长保存,一份上报单片机实验室刘晓荣老师处以准备材料),然后在实验室由班长统一领取有关的元器件及材料,并根据清单按组分发;

3.每组费用不得超过50元。除实验室提供的元器件、材料外,如果还需其它元器件、材料由设计小组自行解决并持正规发票或收据报销;

4.本次课程设计的优秀作品可自愿参加单片机课程设计竞赛,优胜者还可推荐参加校第八届电子设计竞赛。参赛小组原理图必须使用EDA软件完成绘制;

5.硬件电路的焊接在电工电子实验教学中心进行;程序调试、验收在单片机实验室进行。

6.全体学生一律采取面试的方式定出最后成绩,即:最终成绩=作品成绩(60%)+面试成绩(40%)。 7.课程设计报告在“科技创新实验室”论坛上各任课教师专区中上交电子版,并同时上交纸质版以作存留备案。报告内容及格式另文规定。

单片机课程组

2010-05-09

第四篇:上海第二工业大学单片机实验实训实验报告1

单片机实验实训实验报告1 班级:10计科A1

学号:20123430074

姓名:贾强强

第一章Keil教程

1. 源文件的建立

1)启动uVision后,File->New,打开一个新的文本编辑窗口,在窗口中输入汇编语言程序

2)保存文件,扩展名一般用asm或a51.例如:exam1.asm 2. 建立工程文件

1)点击Project->NewProject,出现对话框,输入工程名。点击保存。随后出现第二个对话框,选择CPU(这里选89C51),然后确定 2)工程详细设置

点击Project窗口中的Target1(Project->Optionfortarget’target1’)出现对话框,后面大部分页面默认就行 3.编译、连接

1)将源文件加入到工程

2)选择菜单Project->Build target 3) 进入下一步调试

第二章 文件的下载操作

1. 运行环境:FLIP2.4.6 2. 实验步骤: 1)选择芯片

选择“Select device->AT89C51RC2” 2) 选择要烧写的文件

单击Load HEX File,在对话框中选择要烧写的HEX文件 3)通信设置

单击“Set Communication->RS232/com1/9600波特“后单击Connect 4) 下载烧写文件

单片机与PC连通后单击Run 5) 运行

a.下载成功后,单击Start application b.拔掉w1短接调线,然后执行reset重启操作

2 4.1实验1 Keil及FLIP的使用

实验目的:熟悉Keil2单片机开发软件的使用方法;

熟悉在系统编程下软件FLIP的使用方法,同时利用Keil环境测试汇编语言指令

实验要求:测试如下指令

MOV A,R0; MOV A ,50H MOV A,@R0 MOV A,#20H 实验步骤:

(1)在C盘根目录创建test1的文件夹

(2)创建工程,名为:test1,放于test1文件夹中 (3)创建源文件,名为:test1.asm,内容如下 (4)将test1.asm加入工程,编译 (5)如有错误进行修改

(6)调试(单击debug菜单下的start/stop debuge session,并进行单步跟踪,注意咯寄存器及内存单元变化) 实验程序: ORG 0000H 3 MOV R0,#30H MOV 50H,#3AH MOV A,R0 MOV A,@R0 MOV A,20H MOV @R0,A END 4 实验心得:

回顾起此次课程设计,感觉受益匪浅,从拿到题目到完成整个编程,从理论到实践,学到很多很多的课堂理论中没学到过的东西,在程序调试的过程中提高自己的发现问题、解决问题、实际动手和独立思考的能力。当然,这其中也有很多问题,第

一、不够细心比如由于粗心大意焊错了线,由于对课本理论的不熟悉导致编程出现错误。第二,是在学习态度上,这次课设是对我的学习态度的一次检验。对于这次单片机综合课程实习,我的第一大心得体会就是作为一名工程技术人员,要求具备的首要素质绝对应该是严谨。我们这次实习所遇到的多半问题多数都是由于我们不够严谨。第三,在做人上,我认识到,无论做什么事情,只要你足够坚强,有足够的毅力与决心,有足够的挑战困难的勇气,就没有什么办不到的。

通过这次单片机实习,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。 这次课程设计能顺利的完成,除了我们的努力外,当然也离不开指导老师申老师的辛勤指导,致使我在设计的过程中学到了很多实用性的知识。同时,对给过我帮助的所有同学和各位指导老师表示忠心的感谢!

第五篇:2013年山东建筑大学单片机原理与应用复试笔试考研大纲硕士研究生入学考试大纲

《单片机原理与应用》复试大纲

一、基本内容

1、单片机的硬件系统介绍

基本要求:明确MCS-51系列单片机其硬件资源与软件指令的意义,掌握80

51、8052系列单片机内部的RAM分区,PSW、TCON等特殊寄存器的各位含义。掌握MCS—51系列单片机的具体硬件结构,清楚硬件结构与硬件资源的单片机应用系统的影响。

2、单片机指令系统

基本要求:了解单片机的七种寻址方式,掌握单片机的指令时序;掌握单片机的指令系统的分类,指令形式的应用方法。

3、单片机汇编语言设计基础

基本要求:掌握所学单片机的伪指令及应用格式;掌握所学单片机的顺序程序结构、分支程序结构、循环程序结构、子程序结构和中断的向量分配。

4、定时器/计数器及单片机的中断系统

基本要求:掌握各中断程序入口,与定时器/计数器、外部中断、串行口中断相关的特殊寄存器的意义及设置方法。在掌握中断源矢量的基础上,编写出中断子程序,并实现栈保护。

5、单片机串行口应用

基本要求:掌握串行口应用相关的特殊寄存器的作用及设置。

6、实际应用

基本要求:会用查询、中断等各种方式设计包括键盘查询、LED显示等与实际应用密切相关的硬件电路及软件。

二、参考书目

霍孟友等.单片机原理与应用.机械工业出版社.2007.1;

上一篇:总经理秘书工作流程下一篇:自驾车旅游服务合同

本站热搜