海南工商职业学院
《单片机技术综合实训》课程
实训指导书
主编:胡晓辉、王锋
参编:王伟、许桂月、金晶
2020年4月1日
目 录
一、总体要求
1、课程实训目的
1)进一步掌握单片机结构及其工作原理。
2)理解单片机C语言编程方法。
3)掌握单片机外围电路的控制方法。
4)根据本校学生实际培养学生对单片机的学习兴趣。
2、课程实训项目统计与学时分配
序号 |
实训项目名称 |
学时 分配 |
必开 /选开 |
可否 开出 |
平台 类别 |
实训 结果 |
1 |
Led灯闪烁 |
2 |
必开 |
是 |
真实 设备
|
分析原理 编写程序 设计作品
|
2 |
跑马灯 |
2 |
必开 |
是 |
||
3 |
蜂鸣器驱动实训 |
2 |
必开 |
是 |
||
4 |
继电器驱动实训 |
2 |
必开 |
是 |
||
5 |
交通灯实训 |
2 |
必开 |
是 |
||
6 |
外部中断驱动led显示实验 |
2 |
必开 |
是 |
||
7 |
静态数码管显示实验(直连) |
2 |
必开 |
是 |
||
8 |
动态数码管显示实验(直连) |
4 |
必开 |
是 |
||
9 |
138译码器驱动数码管显示实验 |
2 |
必开 |
是 |
||
10 |
独立按键实验(结合数码管) |
4 |
必开 |
是 |
||
11 |
矩阵键盘扫描 |
4 |
必开 |
是 |
||
12 |
74hc595驱动共阳极数码管(I/O口扩展) |
2 |
必开 |
是 |
||
13 |
Led点阵(16x16点阵) |
4 |
必开 |
是 |
||
14 |
步进电机驱动 |
2 |
必开 |
是 |
||
15 |
液晶屏LCD1602 |
4 |
必开 |
是 |
||
16 |
LCD1602显示接收到串口数据(串口通信) |
4 |
选开 |
是 |
||
17 |
12864中文点阵字符显示 |
4 |
选开 |
是 |
||
合计 |
48 |
15/2 |
100% |
3、课程实训资源
1)配套教材:《单片机原理及应用项目教程》(基于C语言),作者:杨居义,2014年
参考资料:51单片机入门到精通
2)实训场地及条件:
实训场地:智能控制实训室
实训设备或平台:普中科技单片机实验开发仪
4、课程考核方法
|
考核方法 |
得分 |
|||||||||||||||||||
方法 |
项目式考试(过程化考核) |
100分 |
|||||||||||||||||||
考核 |
自我评价 |
软件(程序)完整度 |
软件件调试完成(结果正确) |
遵守实训室纪律、爱护设备 |
|
||||||||||||||||
比重 |
10%(10分) |
40%(40分) |
40%(40分) |
20%(40分) |
100%(100分) |
||||||||||||||||
项目总分 |
|
|
|
|
|
||||||||||||||||
每个项目得分(17个项目) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
课程成绩 |
每项得分和/17= ( ) |
||||||||||||||||||||
采用自我评价和项目式评价的考核方式
1、实训目的与要求
掌握普中科技单片机开发仪的使用方法(驱动识别、程序下载)
学会查看常见单片机原理图的方法
理解单片机I/O口的操作方法
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将led与相应I/O口连接在一起
(3)对照原理图编写led闪烁程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 单片机I/O口位的含义;
n 单片机I/O口输入输出结构理解;
4、实训步骤
(2)打开开发板原理图,对照原理图将JP8余J12连在一起;
(3)打开KEIL软件编写led闪烁程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
//--声明全局函数--//
Sbit led=P1^0;
void Delay10ms(unsigned int c); //延时10ms
void main()
{
while(1)
{
led = 0x00; //置P0口为低电平
Delay10ms(50); //调用延时程序,修改括号里面的值可以调整延时时间
led = 0xff; //置P0口为高电平
Delay10ms(50); // 调用延时程序
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
8个led闪烁
8、思考与练习
(1)多个led怎么编程
(2)74HC573驱动原理
1、实训目的与要求
巩固单片机I/O口操作方法。
掌握单片机延时函数定义方法。
掌握单片机左移右移函数调用及移动原理。
掌握普中科技单片机试验仪原理图接线方法。
2、实训内容
(1)打开原理图并阅读原理图根据实验任务接线
(2)建立KEIL工程
(3)完成led间隔500ms右移一次任务
(4)调试实验结果
(5)根据实验要求对做完任务进行总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 74hc573驱动方法
n 右移函数的移动原理
n 单片机I/O口操作方法
4、实训步骤
(1)将开发板与电脑连接在一起检查串口驱动是否正确,记录串口号
(2)将单片机P0口与开发板J12连在一起
(3)建立KEIL工程编写驱动程序,使开发板上的led灯从左往右点亮,间隔时间为500ms
(4)打开isp下载软件,选择单片机型号(stc90c516RD+),打开hex文件,选择对应串口号
(5)下载程序,观察实验结果
图 实验原理图
5、实训小结(或结果)
#include
#include
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时10ms
void main(void)
{
unsigned char LED;
LED = 0xFE;
while(1)
{
P0 = LED;
Delay10ms(50);
LED = _crol_(LED,1); //循环右移1位,点亮下一个LED 此函数于库函数
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
6、评定标准
l 能否正确使用开发板
l 能否正确建立keil工程
l led灯能否逐个间隔500ms从左到右点亮
l 听从指挥爱护设备
7、实训任务拓展
间隔1s从左到右点亮,然后间隔500ms从右往左点亮,整体间隔100ms闪烁3次,全体熄灭。
8、思考与练习
(1)P0口在使用的过程中为什么加上上拉电阻?
(2)点亮led灯时通过右移函数,每次右移2个实验现象有什么区别?
1、实训目的与要求
了解蜂鸣器的种类,有源无源蜂鸣器的区别。
掌握蜂鸣器原理图电路。
掌握蜂鸣器驱动的程序代码。
掌握蜂鸣器的整个驱动流程。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将蜂鸣器电路与相应I/O口连接在一起
(3)对照原理图编写无源蜂鸣器驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 蜂鸣器相关知识;
n 单片机I/O口输入输出知识;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,对照原理图将J8与p1.5连在一起;
(3)打开KEIL软件编写蜂鸣器驱动程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
sbit Beep = P1^5 ;
void delay(unsigned int i) ;
void main()
{
Beep= 1;
delay(5);
Beep= 0;
delay(5);
}
void delay(unsigned int i)
{
char j;
for(i; i > 0; i--)
for(j = 200; j > 0; j--);
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
实现在实训2中跑马灯中加入报警效果
8、思考与练习
(1)如何实现蜂鸣器演奏音乐
1、实训目的与要求
了解继电器原理。
掌握单片机控制继电器原理和方法。
掌握继电器驱动的原理图电路和程序代码。
实现按键控制继电器的整个驱动流程。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将继电器电路与相应I/O口连接在一起
(3)对照原理图编写继电器驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 继电器原理;
n 单片机I/O口输入输出使用;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,对照原理图将J2与p1.4连在一起;并将p0.0口连接到继电器。
(3)打开KEIL软件编写继电器驱动程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
//--定义要使用的IO口--//
sbit RELAY = P1^4; //定义继电器使用的IO口
sbit K1 = P0^0; //定义按键使用的IO口
void main()
{
while(1)
{
if(K1 == 0) //如果按键按下
{
RELAY = 0; //闭合
}
else
{
RELAY = 1;
}
}
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
实现在继电器和蜂鸣器同时响应。
8、思考与练习
(1)加入延时程序对继电器的控制
1、实训目的与要求
掌握定时器T0的代码配置和实现。
掌握动态显示数码管的使用及代码的实现。
实现交通灯的控制流程。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将数码管电路与相应I/O口连接在一起
(3)对照原理图编写交通灯驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 动态显示数码管;
n 定时器T0;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,按以下图接线
(3)打开KEIL软件编写交通灯流程程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
//--定义使用的IO口--//
#define GPIO_DIG P0
#define GPIO_PLACE P1
#define GPIO_TRAFFIC P2
sbit RED10 = P2^0; //上人行道红灯
sbit GREEN10 = P2^1; //上人行道绿灯
sbit RED11 = P2^2;
sbit YELLOW11= P2^3;
sbit GREEN11 = P2^4;
sbit RED00 = P3^0; //右人行道红灯
sbit GREEN00 = P3^1; //右人行道绿灯
sbit RED01 = P2^5;
sbit YELLOW01= P2^6;
sbit GREEN01 = P2^7;
//--定义全局变量--//
unsigned char code DIG_PLACE[8] = {
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选控制 查表的方法控制
unsigned char code DIG_CODE[17] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
unsigned char Time, Second; //用来存放定时时间
//--声明全局函数--//
void DigDisplay(); //动态显示函数
void Timer0Cofig(void);
void main(void)
{
Second = 1;
Timer0Cofig();
while(1)
{
if(Second == 70)
{
Second = 1;
}
//--宝田路通行,30秒--//
if(Second < 31)
{
DisplayData[0] = 0x00;
DisplayData[1] = 0x00;
DisplayData[2] = DIG_CODE[(30 - Second) % 100 / 10];
DisplayData[3] = DIG_CODE[(30 - Second) %10];
DisplayData[4] = 0x00;
DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];
DisplayData[7] = DisplayData[3];
DigDisplay();
//--宝田路通行--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
RED00 = 1;
GREEN00 = 1;
GREEN11 = 0; //宝田路绿灯亮
GREEN10 = 0; //宝田路人行道绿灯亮
RED01 = 0; //前进路红灯亮
RED00 = 0; //前进路人行道红灯亮
}
//--黄灯等待切换状态,5秒--//
else if(Second < 36)
{
DisplayData[0] = 0x00;
DisplayData[1] = 0x00;
DisplayData[2] = DIG_CODE[(35 - Second) % 100 / 10];
DisplayData[3] = DIG_CODE[(35 - Second) %10];
DisplayData[4] = 0x00;
DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];
DisplayData[7] = DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
RED00 = 1;
GREEN00 = 1;
YELLOW11 = 0; //宝田路黄灯亮
RED10 = 0; //宝田路人行道红灯亮
YELLOW01 = 0; //前进路红灯亮
RED00 = 0; //前进路人行道红灯亮
}
//--前进路通行--//
else if(Second < 66)
{
DisplayData[0] = 0x00;
DisplayData[1] = 0x00;
DisplayData[2] = DIG_CODE[(65 - Second) % 100 / 10];
DisplayData[3] = DIG_CODE[(65 - Second) %10];
DisplayData[4] = 0x00;
DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];
DisplayData[7] = DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
RED00 = 1;
GREEN00 = 1;
RED11 = 0; //宝田路红灯亮
RED10 = 0; //宝田路人行道红灯亮
GREEN01 = 0; //前进路绿灯亮
GREEN00 = 0; //前进路人行道绿灯亮
}
//--黄灯等待切换状态,5秒--//
else
{
DisplayData[0] = 0x00;
DisplayData[1] = 0x00;
DisplayData[2] = DIG_CODE[(70 - Second) % 100 / 10];
DisplayData[3] = DIG_CODE[(70 - Second) %10];
DisplayData[4] = 0x00;
DisplayData[5] = 0x00;
DisplayData[6] = DisplayData[2];
DisplayData[7] = DisplayData[3];
DigDisplay();
//--黄灯阶段--//
GPIO_TRAFFIC = 0xFF; //将所有的灯熄灭
RED00 = 1;
GREEN00 = 1;
YELLOW11 = 0; //宝田路黄灯亮
RED10 = 0; //宝田路人行道红灯亮
YELLOW01 = 0; //前进路红灯亮
RED00 = 0; //前进路人行道红灯亮
}
}
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0; i<8; i++)
{
GPIO_PLACE = DIG_PLACE[i]; //发送位选
GPIO_DIG = DisplayData[i]; //发送段码
j = 10; //扫描间隔时间设定
while(j--);
GPIO_DIG = 0x00; //消隐
}
}
void Timer0Cofig(void)
{
TMOD = 0x01; //定时器0选择工作方式1
TH0 = 0x3C; //设置初始值,定时50MS
TL0 = 0xB0;
EA = 1; //打开总中断
ET0 = 1; //打开定时器0中断
TR0 = 1; //启动定时器0
}
void Timer0() interrupt 1
{
TH0 = 0x3C; //设置初始值
TL0 = 0xB0;
Time++;
if(Time == 20)
{
Second ++;
Time = 0;
}
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
处理紧急状况,由按键引发外部中断进入紧急状况。在紧急状况下前进路、宝田路均为红灯,15秒钟后恢复进入紧急状况之前的正常运行状态。。
8、思考与练习
(1)实现当绿灯闪烁和黄灯亮时,蜂鸣器发声提示。
1、实训目的与要求
掌握中断的概念
理解单片机中断整个工作过程
掌握外部中断0外部中断1的使用方法
理解中断服务函数的工作过程
2、实训内容
(1)根据实训任务及原理图将相关接线连接正确
(2)根据实训任务编写按键触发外部中断的程序
(3)检查并验证试验结果
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 外部中断的的原理
n 外部中断的触发方法
n 中断服务函数的格式
4、实训步骤
(1)检查开发装置驱动线及串口是否正确
(2)将开发板上面的K1键的引出线接单片机P3.2口的引出线,将单片机的P2口与J12连在一起
(3)建立KEIL工程,定义P2口的接口(详细定义见实训小结的驱动程序)
(4)调试keil程序使结果无错误、无警告;生成hex文件
(5)打开isp下载软件,下载hex文件到单片机中;
(6)按下K2键查看实验结果。
5、实训小结(或结果)
#include < reg51.h >
sbit led1=P2^0;
sbit led2=P2^1;
unsigned int i;
i=50000;
void main(void)
{
IT0=1; //下降沿触发
EA=1;
EX0=1;
while(1)
{
led1=0;
while(1--)
led1=1;
while(1--)
}
}
void counter(void) interrupt 0
{
EX0=0;
led2=1;
while(i--);
EX0=1;
led2=0;
}
6、评定标准
l 正确接线、正确使用开发装置
l 能够正确编写外部中断驱动程序
l 实验结果正确
l 实验态度及行为良好
7、实训任务拓展
使用外部中断2如何来拓展以上实训?
8、思考与练习
(1)外部中断设为低电平触发该怎么设置?
(2)外部中断可不可以用来检测按键是否被按下?
1、实训目的与要求
掌握共阴极、共阳极数码管内部结构
掌握单片机控制数码管显示的原理
掌握一维数组的定义及调用方法
2、实训内容
(1)分析共阴极、共阳极数码管内部结构
(2)单片机P0、P1口控制数码管的方法
(3)编写静态数码管的驱动程序
(4)调试实训结果
(5)验证实训内容
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 共阴极、共阳极数码管的内部结构
n 数码管驱动原理
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)将开发板上的JP8接J16,JP10接J12
(3)建立keil工程,编写驱动程序
(4)调试实验结果,生成hex文件
(4)打开isp下载软件,下载程序,调试结果
(5)提交实验作业并总结
5、实训小结(或结果)
#include
#define GPIO_DIG P1
void Delay10ms(unsigned int c); //误差 0us
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void main(void)
{
unsigned char i = 0;
GPIO_DIG=0;
while(1)
{
for(i=0;i<16;i++)
{
P0=DIG_CODE[i];
Delay10ms(50);
}
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
6、评定标准
l 接线正确
l 驱动程序无警告无错误
l 实验结果正确
l 遵守实训室规章制度
7、实训任务拓展
如何让两个甚至多个数码管同时显示不同数字?
8、思考与练习
(1)多个数码管显示不同数字?
(2)共阳极数码管驱动程序怎么编写?
1、实训目的与要求
掌握共阴极数码管动态显示工作原理
掌握单片机驱动数码管动态显示的工作原理
2、实训内容
(1)根据动态显示任务接线
(2)分析动态显示的工作原理
(3)编写共阴极数码管的驱动程序
(4)调试程序使结果正确
(5)实训总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 共阴极数码管的动态显示原理
n 单片机驱动共阴极数码管驱动原理
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)将开发板上的JP8接J16,JP10接J12
(3)建立keil工程编写动态显示驱动程序
(4)生成hex文件并下载到单片机中去
(5)提交文件并总结
5、实训小结(或结果)
#include
sbit seg1=P1^0;
sbit seg2=P1^1;
void Delay10ms(unsigned int c); //误差 0us
unsigned char code DIG_CODE[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,
0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71};
void display(unsigned char shi,unsigned char ge)
{
seg1=0;seg2=1;
P0=DIG_CODE[shi];
Delay10ms(1);
P0=0;
seg1=1;seg2=0;
P0=DIG_CODE[ge];
Delay10ms(1);
P0=0;
}
void main(void)
{
while(1)
{
display(5,8);
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}
6、评定标准
l 能够正确理解动态显示的原理
l 能够正确编写驱动程序
l 能够正确连接相关I/O口
l 能够正确下载并调试程序
7、实训任务拓展
结合开发板上面的独立按键制作一个单片机定时器
8、思考与练习
(1)多个数码管显示数据是不是同时显示的?
(2)8个数码管显示不同数据间隔5ms,数据能否稳定显示?
1、实训目的与要求
了解译码器的相关知识。
掌握八字段LED数码管驱动显示工作原理。
掌握74LS138三—八译码器工作原理及如何控制数码管工作原理 。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将译码器电路与相应I/O口连接在一起
(3)对照原理图编写交通灯驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 字段LED数码管驱动显示工作原理;
n 译码器的相关知识;
n 数码管工作原理;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,ABC分别接p20,p21,p22.P0口接数码管,以下表格所示。
输入 |
3—8译码器输出 |
现象 |
||||||||||
P2口的值 |
P21 |
P21 |
P20 |
|||||||||
C |
B |
A |
Y7 |
Y6 |
Y5 |
Y4 |
Y3 |
Y2 |
Y1 |
Y0 |
|
|
0x00 |
0 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
Y0对应的数码管亮 |
0x01 |
0 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
Y1对应的数码管亮 |
0x02 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
Y2对应的数码管亮 |
0x03 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
Y3对应的数码管亮 |
0x04 |
1 |
0 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
Y4对应的数码管亮 |
0x05 |
1 |
0 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
Y5对应的数码管亮 |
0x06 |
1 |
1 |
0 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
Y6对应的数码管亮 |
0x07 |
1 |
1 |
1 |
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
Y7对应的数码管亮 |
(3)打开KEIL软件编写译码器流程程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
//--定义使用的IO--//
#define GPIO_DIG P0
sbit LSA=P2^0;
sbit LSB=P2^1;
sbit LSC=P2^2;
//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char DisplayData[8];
//用来存放要显示的8位数的值
//--声明全局函数--//
void DigDisplay(); //动态显示函数
void main(void)
{
unsigned char i;
for(i=0;i<8;i++)
{
DisplayData[i]=DIG_CODE[i];
}
while(1)
{
DigDisplay();
}
}
void DigDisplay()
{
unsigned char i;
unsigned int j;
for(i=0;i<8;i++)
{
switch(i) //位选,选择点亮的数码管,
{
case(0):
LSA=0;LSB=0;LSC=0; break;//显示第0位
case(1):
LSA=1;LSB=0;LSC=0; break;//显示第1位
case(2):
LSA=0;LSB=1;LSC=0; break;//显示第2位
case(3):
LSA=1;LSB=1;LSC=0; break;//显示第3位
case(4):
LSA=0;LSB=0;LSC=1; break;//显示第4位
case(5):
LSA=1;LSB=0;LSC=1; break;//显示第5位
case(6):
LSA=0;LSB=1;LSC=1; break;//显示第6位
case(7):
LSA=1;LSB=1;LSC=1; break;//显示第7位
}
GPIO_DIG=DisplayData[i];//发送段码
j=10; //扫描间隔时间设定
while(j--);
GPIO_DIG=0x00;//消隐
}
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
74HC138接成的4线-16线译码器
8、思考与练习
(1)74HC138接成的4线-16线译码器
1、实训目的与要求
了解按键与单片机接口原理图。
掌握八字段LED数码管驱动显示工作原理。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将按键、数码管电路与相应I/O口连接在一起
(3)对照原理图编写驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
l 按键扫描代码;
l 定时器的使用;
l 数码管显示原理;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)P1.0~P1.5接按键,功能实现及流程:
1,在无指令的情况下 数码管以一秒加一的速度开始0~99计时,到99自动弹回0重新计时。
2,按下key1数码管清零;之后松开key1又开始计时。
3,按下key2计时暂停在当前的那位,要使其继续计时必须按下key4,才可以解除暂停。
4,按下key3自动加10计时也就是说每按下一次指示器加10;比如由20变为30,(按下key3之后必须按下key4才会加10否则只会暂停在当前 那位,因为总中断再被关闭后在我写的这个程序上只有按下key4才会被从新打开)
5,按下key5自动减10原理和key3差不多,但要注意的是只是在当前的那位减10而不会出现倒计时!(这里不需要在按下key5后按key4才能启动,直接按下key5就可以减10)
(3)打开KEIL软件编写译码器流程程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
#define uchar unsigned char
#define uint unsigned int
uchar aa,bb,ge,shi,bai;
uchar code shuzi[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
sbit key1=P1^0;
sbit key2=P1^1;
sbit key3=P1^2;
sbit key4=P1^4;
sbit key5=P1^5;
void time(uchar k)
{
uchar x,y;
for(x=100;x>0;x--)
for(y=k;y>0;y--);
}
void dsq0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
aa++;
if(aa==20)
{
aa=0;
bb++;
if(bb==100)
{
bb=0;
}
bai=bb/10;
shi=bb%10/10;
ge=bb%10;
}
}
void keyscan()
{
if(key1==0)
{
time(5);
if(key1==0)
{
bb=0;
}
}
if(key1==1)
{
time(5);
if(key1==1)
{
}
}
if(key2==0)
{
time(5);
if(key2==0)
{
EA=0;
}
}
if(key2==1)
{
time(5);
if(key2==1)
{
}
}
if(key3==0)
{
time(5);
if(key3==0)
{
EA=0;
bb++;
if(bb==99)
{
bb=0;
}
}
}
if(key3==1)
{
time(5);
if(key3==1)
{
}
}
if(key4==0)
{
time(5);
if(key4==0)
{
EA=1;
}
}
if(key4==0)
{
time(5);
if(key4==0)
{
}
}
if(key5==0)
{
time(5);
if(key5==0)
{
bb--;
if(bb==0)
{
bb=100;
}
}
}
if(key5==0)
{
time(5);
if(key5==0)
{
}
}
}
void init()
{
P0=0;
P2=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;
ET0=1;
TR0=1;
IT0=0;
}
void display( bai,shi,ge)
{
P0=shuzi[bai];
P2=0xfd;
time(1);
P0=0x00;
P2=0x00;
P0=shuzi[shi];
P2=0xfe;
time(1);
P0=0x00;
P2=0x00;
P0=shuzi[ge];
P2=0xfb;
time(1);
P0=0x00;
P2=0x00;
}
void main()
{
init();
while(1)
{
keyscan();
display(bai,shi,ge);
}
} 6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
实现按键的累加实验并在数码管显示
8、思考与练习
(1)定时器原理
1、实训目的与要求
理解矩阵键盘扫描的原理;
掌握矩阵键盘与51单片机原理图接口和编程方法。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将矩阵键盘电路与相应I/O口连接在一起
(3)对照原理图编写扫描矩阵键盘电路程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 按钮矩阵原理,单片机I/O口的使用;
n 防抖的意义;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板,原理图接线图如下所示。
(3)打开KEIL软件编写按钮矩阵程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
#include
//--定义使用的IO口--//
#define GPIO_DIG P0
#define GPIO_KEY P1
//--定义全局变量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码
unsigned char KeyValue;
//用来存放读取到的键值
//--声明全局函数--//
void Delay10ms(unsigned int c); //延时10ms
void KeyDown(); //检测按键函数
void main(void)
{
while(1)
{
KeyDown();
GPIO_DIG = ~DIG_CODE[KeyValue];
}
}
void KeyDown(void)
{
char a = 0;
GPIO_KEY=0x0f;
if(GPIO_KEY!=0x0f)//读取按键是否按下
{
Delay10ms(1);//延时10ms进行消抖
if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
{
//测试列
GPIO_KEY=0X0F;
switch(GPIO_KEY)
{
case(0X07): KeyValue=0;break;
case(0X0b): KeyValue=4;break;
case(0X0d): KeyValue=8;break;
case(0X0e): KeyValue=12;break;
}
//测试行
GPIO_KEY=0XF0;
switch(GPIO_KEY)
{
case(0X70): KeyValue=KeyValue+3;break;
case(0Xb0): KeyValue=KeyValue+2;break;
case(0Xd0): KeyValue=KeyValue+1;break;
case(0Xe0): KeyValue=KeyValue;break;
}
while((a<50) && (GPIO_KEY!=0xf0)) //检测按键松手检测
{
Delay10ms(1);
a++;
}
}
}
}
void Delay10ms(unsigned int c) //误差 0us
{
unsigned char a, b;
//--c已经在传递过来的时候已经赋值了,所以在for语句第一句就不用赋值了--//
for (;c>0;c--)
{
for (b=38;b>0;b--)
{
for (a=130;a>0;a--);
}
}
}6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
通过按键实现两个按键的加法,并在数码管显示。
8、思考与练习
(1)按钮矩阵原理
1、实训目的与要求
掌握74HC595(串入并出)基本原理和使用
掌握I2C总线的驱动方法
掌握74HC595编程方法
理解单片机外围芯片编程思想
2、实训内容
(1)分析共阳极数码管工作原理
(2)根据实训任务接线
(3)分析74HC595的芯片手册
(4)根据芯片手册编写驱动程序
(5)调试、下载单片机程序
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 74HC595串入并出原理
n 共阳极数码管控制方法
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)将开发板上面的P595A与JP3连在一起,P595跳线帽要接上
(3)打开KEIL软件,建立keil工程
(4)打开74hc芯片手册编写驱动程序
(5)调试并下载
(6)实训总结,提交作业
5、实训小结(或结果)
#include
#include
#define NOP() _nop_() /* 定义空指令 */
sbit MOSIO =P3^4;
sbit R_CLK =P3^5;
sbit S_CLK =P3^6;
void delay(unsigned int i); //函数声名
void HC595SendData(unsigned char SendVal);
main()
{ unsigned char Led=0xfe;
HC595SendData(0xff);
while(1)
{
HC595SendData(Led);
Led<<=1;
Led = Led| 0x01;
if (Led == 0xff )
delay(200);
}
}
void delay(unsigned int i)
{
unsigned int j;
for(i; i > 0; i--)
for(j = 300; j > 0; j--);
}
void HC595SendData(unsigned char SendVal)
{
unsigned char i;
for(i=0;i<8;i++)
{
if((SendVal<最高位与SendVal左移的最高位 进行逻辑运算
else MOSIO=0; // 如果为真 MOSIO = 1
S_CLK=0;
NOP(); //产生方形波
NOP();
S_CLK=1;
}
R_CLK=0; //set dataline low
NOP(); //产生方形波
NOP();
R_CLK=1; //片选
}
6、评定标准
l 开发板接线正确
l 实验结果正确
l 遵守实验室规章制度
7、实训任务拓展
两片74HC595连接在一起怎么驱动?
8、思考与练习
(1)如74HC595真值表所示并口在什么时候输出数据?
(2)多片74HC595连在一起控制点阵led屏怎么驱动?
1、实训目的与要求
掌握led点阵扫描原理
掌握74HC595串入并出的工作原理
掌握16x16点阵取模软件的使用方法
2、实训内容
(1)按照任务设置连线
(2)根据原理图分析16X16点阵行线和列线对应的595芯片
(3)编写595芯片的驱动程序
(4)按照步骤一次扫描点阵屏的行和列,理解点阵屏驱动原理
(5)使用取模软件,按照横向取模方式将相关自己名字汉子取模
(6)调试点阵屏显示汉字结果
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 8x8、16x16点阵显示屏驱动原理
n 4块74HC595级联驱动led屏的原理
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)将P595_A端口接J17,P595_B端口接J18,J21跳线跳左边,断开JP165,接JP595跳线帽,断开JP1302、JP11。
(3)打开取模软件设置取模字形16x16,方向D0-D7,横向取模;字体为宋体、12号字如下图
(4)如上图依次将自己姓名汉字通过取模软件取出字形码
(5)编写16x16点阵汉字显示驱动程序,将取模得到的字形码定义成相关数组
(6)调试程序,观察结果
(7)总结实训过程,提交作业
5、实训小结(或结果)
定义74hc595的I/O口
sbit MOSIO = P3^4;
sbit R_CLK = P3^5;
sbit S_CLK = P3^6;
点阵显示数组,扫描行
uchar code tab0[] = {0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80,0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x08, 0x00, 0x10, 0x00, 0x20, 0x00, 0x40, 0x00, 0x80, 0x00};
显示汉字
uchar code tab1[] = {64,0,128,8,254,31,16,2,32,1,255,63,64,0,64,0,254,31,64,0,72,6,68,8,82,16,
32,0,0,0,0,0};
扫描行和列显示汉字
for(ms = i; ms > 0; ms--)
{
for(k = 0; k < 16; k++)
{
HC595SendData(~tab1[2*k +1],~tab1[2*k],tab0[2*k],tab0[2*k + 1]);
}
}
4片595驱动程序
void HC595SendData( uchar BT3, uchar BT2,uchar BT1,uchar BT0)
{
uchar i;
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT3 >> 7 ; //从高位到低位
BT3 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT2 >>7; //从高位到低位
BT2 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT1 >> 7; //从高位到低位
BT1 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--发送第一个字节--//
for(i=0;i<8;i++)
{
MOSIO = BT0 >> 7; //从高位到低位
BT0 <<= 1;
S_CLK = 0;
S_CLK = 1;
}
//--输出--//
R_CLK = 0; //set dataline low
R_CLK = 1; //片选
}
6、评定标准
l 接线正确
l 程序编译无误
l 点阵能够显示自己名字
l 遵守实训室纪律
7、实训任务拓展
点阵纵向横屏该怎么编写驱动程序?
8、思考与练习
(1)如果扩展到32x32点阵屏以上驱动程序及电路该怎么修改?
(2)滚动显示“海南工商职业学院欢迎您!”该怎么修改?
1、实训目的与要求
理解步进电机工作原理。
实现步进电机单双八拍工作方式 。
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将步进电机与相应I/O口连接在一起
(3)对照原理图编写步进电机驱动程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 单片机I/O口位的含义;
n 单片机I/O口输入输出结构理解;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,接线图如下所示。
(3)打开KEIL软件编写单双八拍工作流程程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
/**************************************************************************
*; 单双八拍工作方式:
*; A-AB-B-BC-C-CD-D-DA (即一个脉冲,转 3.75 度)
* J14短路冒需断开
************************************************************************* /
#include "reg52.h"
unsigned char code RUN[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //步进电机相序表
void delay(unsigned int t);
//步进电机驱动
void motor_ffw()
{
unsigned char i;
for (i=0; i<8; i++) //一个周期转3.75*8=30度
{
P1 = RUN[i]&0x1f; //取数据
delay(100); //调节转速
}
}
/******延时函数****************/
void delay(unsigned int t)
{
unsigned int k;
while(t--)
{
for(k=0; k<60; k++)//用for的空循环延长程序的执行时间
{ }
}
}
main()
{
while(1)
{
motor_ffw(); //调用旋转处理函数
}
}
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
通过按键控制步进电机的正转、反转和停止。
8、思考与练习
(1)实现步进电机的减速、加速,正传反转实验。
1、实训目的与要求
掌握液晶显示屏LCD1602的驱动方法
理解单片机驱动液晶屏的思想
2、实训内容
(1)根据实训任务在开发板上安装1602液晶屏
(2)根据液晶屏的开发手册分析液晶屏的驱动原理
(3)编写驱动程序
(4)下载驱动程序并调试
(5)总结实训结果
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 1602液晶显示屏的显示原理
n 1602液晶显示屏的驱动电路
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)查看开发板原理图1602液晶显示部分,找出RS\RW\EN对应单片机管教及数据输出控制I/0口
(3)在keil里面定义相关I/O口
(4)根据datasheet手册编写1602数据及指令读写程序
(5)初始化1602液晶显示屏具体指令见液晶屏手册
(6)调试并下载到单片机中
(7)观察实训结果,提交实训作业
5、实训小结(或结果)
#include"reg51.h"
#define uchar unsigned char
#define uint unsigned int
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;
uchar tab1[]="I MISS YOU !";
uchar tab2[]="I LOVE YOU !";
void delay(uchar m)
{
uchar i,j;
for(i=m;i>0;i--)
for(j=110;j>0;j--);
}
void write_com(uchar com)
{
EN=0;
RS=0;
RW=0;
P3=com;
delay(2);
EN=1;
delay(5);
}
void write_dat(uchar dat)
{
EN=0;
RS=1;
RW=0;
P3=dat;
delay(2);
EN=1;
delay(5);
}
void main()
{ uchar k;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(k=0;k<=12;k++)
write_dat(tab1[k]);
delay(100);
write_com(0x80+0x43);
for(k=0;k<=12;k++)
write_dat(tab2[k]);
delay(10);
while(1);
}
6、评定标准
l 能够建立keil工程
l 能够编写1602读或写数据函数
l 能够调用相关函数完成液晶屏初始化
l 液晶屏正确显示字符
l 遵守实训室纪律、爱护实训设备
7、实训任务拓展
如何在液晶屏上显示数据?
8、思考与练习
(1)在液晶屏上面动态显示数据如2016年11月21日等
1、实训目的与要求
掌握单片机串口通信的原理
掌握单片机串口通信的设置方法
掌握单片机串口通信的使用方法
2、实训内容
(1)巩固液晶显示屏的驱动方法
(2)单片机串口通信的原理
(3)单片机串口通信接收数据的设置方法
(4)单片机串口通信接收和发送数据的驱动编写
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 1602的驱动程序编写思想
n 单片机串口通信原理
4、实训步骤
(1)检查开发板的驱动是否安装正确,记录串口号
(2)打开串口调试助手如图
(3)设置串口号(根据单片机串口通信资源管理器设置)波特率、数据位奇偶校验位等
(4)对串口进行初始化
(5)编写串口接收并显示的驱动程序
(6)调试并下载驱动程序
(7)在串口助手中输入需要发送的数据
(8)检查液晶显示屏是否显示发送的数据(显示数据位bcd码)
5、实训小结(或结果)
串口初始化
void UsartConfiguration()
{
SCON=0X50; //设置为工作方式1
TMOD=0X20; //设置计数器工作方式2
PCON=0X80; //波特率加倍
TH1=0XF3; //计数器初始值设置,注意波特率是4800的
TL1=0XF3;
TR1=1; //打开计数器
}
串口接收并显示接收数据
if(RI == 1) //查看是否接收到数据
{
receiveData = SBUF; //读取数据
RI = 0; //清除标志位
LcdWriteCom(0xC0);
//--因为一次接受只能接收到8位数据,最大为255,所以只用显示百位之后--//
LcdWriteData('0' + (receiveData / 100)); // 百位
LcdWriteData('0' + (receiveData % 100 / 10)); // 十位
LcdWriteData('0' + (receiveData % 10)); // 个位
}
液晶屏初始化指令
void LcdInit() //LCD初始化子程序
{
LcdWriteCom(0x32); //将8位总线转为4位总线
LcdWriteCom(0x28); //在四位线下的初始化
LcdWriteCom(0x0c); //开显示不显示光标
LcdWriteCom(0x06); //写一个指针加1
LcdWriteCom(0x01); //清屏
LcdWriteCom(0x80); //设置数据指针起点
}
6、评定标准
液晶屏能否正确显示字符或数据
串口能否发送数据
液晶屏能否显示发送数据
遵守实训室纪律、爱护实训设备
7、实训任务拓展
编写程序将单片机接收数据显示在串口助手上
8、思考与练习
(1)如何实现在串口助手上面实现数据发送并返回?
1、实训目的与要求
认识和熟悉LCD12864;
了解看时序图及按时序图写驱动程序的一般方法;
实现12864进行字符串和汉字的显示
2、实训内容
(1)调试单片机开发仪驱动设置
(2)在单片机开发仪上将12864与相应I/O口连接在一起
(3)对照原理图编写12864显示程序
(4)调试程序并使用ISP下载软件下载程序到单片机中
(5)观察实验现象并总结
3、实训准备
(1)实训环境准备
硬件:(含耗材)普中科技单片机实验开发仪一套、电脑一台、杜邦线若干(耗材)
软件:keil uvision4 stc-isp4.8版本以上
资料:单片机原理与应用
(2)相关知识要点
n 理解12864液晶屏基本原理和使用方法;
n 12864编程思想;
4、实训步骤
(1)将单片机开发仪通过USB线与电脑连接在一起,查看电脑的设备管理器中usb转串口驱动是否正确;
(2)打开开发板原理图,接线图如下所示。
(3)打开KEIL软件编写12864液晶显示程序
(4)调试程序正确无误,生成HEX文件
(5)将生成HEX文件烧录到单片机试验仪中观察实验现象
(6)实验结果正确,提交实验程序包,以备查验;
5、实训小结(或结果)
12864显示功能代码如下:
#include"st7565.h"
void LcdSt7565_WriteCmd(cmd)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 0; //select command,选择命令
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = cmd; //put command,放置命令
_nop_();
_nop_();
LCD12864_RW = 1; //command writing ,写入命令
}
void LcdSt7565_WriteData(dat)
{
LCD12864_CS = 0; //chip select,打开片选
LCD12864_RD = 1; //disable read,读失能
LCD12864_RS = 1; //select data,选择数据
LCD12864_RW = 0; //select write,选择写模式
_nop_();
_nop_();
DATA_PORT = dat; //put data,放置数据
_nop_();
_nop_();
LCD12864_RW = 1; //data writing,写数据
}
void Lcd12864_Init()
{
uchar i;
LCD12864_RSET = 0;
for (i=0; i<100; i++);
LCD12864_CS = 0;
LCD12864_RSET = 1;
//----------------Star Initial Sequence-------//
//------程序初始化设置,具体命令可以看文件夹下---//
//--软件初始化--//
LcdSt7565_WriteCmd(0xE2); //reset
for (i=0; i<100; i++); //延时一下
//--表格第8个命令,0xA0段(左右)方向选择正常方向(0xA1为反方向)--//
LcdSt7565_WriteCmd(0xA1); //ADC select segment direction
//--表格第15个命令,0xC8普通(上下)方向选择选择反向,0xC0为正常方向--//
LcdSt7565_WriteCmd(0xC8); //Common direction
//--表格第9个命令,0xA6为设置字体为黑色,背景为白色---//
//--0xA7为设置字体为白色,背景为黑色---//
LcdSt7565_WriteCmd(0xA6); //reverse display
//--表格第10个命令,0xA4像素正常显示,0xA5像素全开--//
LcdSt7565_WriteCmd(0xA4); //normal display
//--表格第11个命令,0xA3偏压为1/7,0xA2偏压为1/9--//
LcdSt7565_WriteCmd(0xA2); //bias set 1/9
//--表格第19个命令,这个是个双字节的命令,0xF800选择增压为4X;--//
//--0xF801,选择增压为5X,其实效果差不多--//
LcdSt7565_WriteCmd(0xF8); //Boost ratio set
LcdSt7565_WriteCmd(0x01); //x4
//--表格第18个命令,这个是个双字节命令,高字节为0X81,低字节可以--//
//--选择从0x00到0X3F。用来设置背景光对比度。---/
LcdSt7565_WriteCmd(0x81); //V0 a set
LcdSt7565_WriteCmd(0x23);
//--表格第17个命令,选择调节电阻率--//
LcdSt7565_WriteCmd(0x25); //Ra/Rb set
//--表格第16个命令,电源设置。--//
LcdSt7565_WriteCmd(0x2F);
for (i=0; i<100; i++);
//--表格第2个命令,设置显示开始位置--//
LcdSt7565_WriteCmd(0x40); //start line
//--表格第1个命令,开启显示--//
LcdSt7565_WriteCmd(0xAF); // display on
for (i=0; i<100; i++);
}
void Lcd12864_ClearScreen(void)
{
uchar i, j;
for(i=0; i<8; i++)
{
//--表格第3个命令,设置Y的坐标--//
//--Y轴有64个,一个坐标8位,也就是有8个坐标--//
//所以一般我们使用的也就是从0xB0到0x07,就够了--//
LcdSt7565_WriteCmd(0xB0+i);
//--表格第4个命令,设置X坐标--//
//--当你的段初始化为0xA1时,X坐标从0x10,0x04到0x18,0x04,一共128位--//
//--当你的段初始化为0xA0时,X坐标从0x10,0x00到0x18,0x00,一共128位--//
//--在写入数据之后X坐标的坐标是会自动加1的,我们初始化使用0xA0所以--//
//--我们的X坐标从0x10,0x00开始---//
LcdSt7565_WriteCmd(0x10);
LcdSt7565_WriteCmd(0x04);
//--X轴有128位,就一共刷128次,X坐标会自动加1,所以我们不用再设置坐标--//
for(j=0; j<128; j++)
{
LcdSt7565_WriteData(0x00); //如果设置背景为白色时,清屏选择0XFF
}
}
}
#ifdef CHAR_CODE
#include"charcode.h"
uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
{
uchar j, x1, x2, wordNum;
//--Y的坐标只能从0到7,大于则直接返回--//
if(y > 7)
{
return 0;
}
//--X的坐标只能从0到128,大于则直接返回--//
if(x > 128)
{
return 0;
}
y += 0xB0; //求取Y坐标的值
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y);
x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
x2 = x & 0x0F; //去低四位
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
for (wordNum=0; wordNum<50; wordNum++)
{
//--查询要写的字在字库中的位置--//
if ((CN16CHAR[wordNum].Index[0] == *cn)
&&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
{
for (j=0; j<32; j++) //写一个字
{
if (j == 16) //由于16X16用到两个Y坐标,当大于等于16时,切换坐标
{
//--设置Y坐标--//
LcdSt7565_WriteCmd(y + 1);
//--设置X坐标--//
LcdSt7565_WriteCmd(0x10 + x1); //高4位
LcdSt7565_WriteCmd(0x04 + x2); //低4位
}
LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
}
x += 16;
}//if查到字结束
} //for查字结束
cn += 2;
} //while结束
return 1;
}
#endif
6、评定标准
l 能正确查看usb转串口驱动是否正常;
l 能搭建单片机开发环境
l 能调试单片机程序
l 能听从指挥,爱护实训设备;
7、实训任务拓展
如何在LCD12864上任意画点
8、思考与练习
(1)12864进行字符串和汉字的显示
参考教材:
【1】单片机C语言程序设计实训100例:基于8051+Proteus仿真(第2版) -彭伟
【2】单片机原理与应用·实验实训和课程设计--陈朝大 (编者), 韩剑 (编者)
【3】单片机实训项目解析(基于Proteus的汇编和C语言版)
附录一:普中科技实验开发板结构图
附录二:51单片机下载说明
附录三:普中科技原理图