课程名称:_单片机原理与应用
专业班级: 嵌入式14103班
姓 名:_赵存档 _ __
学 号:_14160310317 __
2015--2016 学年第 1 学期
实验项目( 四 ) — 预习报告
项目
名称
驱动7段数码管实验
实验
目的
及
要求
1、掌握用proteus画电路图。
2、用Keil编写代码,进行调试。
3、进行仿真测试
4、将hex文件下载到单片机中,是否可以运行。
实验
内容
及
原理
实验内容:
打开proteus软件,画出单片机最小系统以及数码管的电路图,然后打开keil软件
编写驱动数码管的代码。代码调试完成没有错误后,设置晶振频率为12MHZ,生成hex文件后,将hex文件加载到proteus中,进行仿真测试运行。测试运行没有错误后,将hex文件下载到单片机开发板中,进行演示。
实验原理:
由原理图可知,数码管接线方式为共阳极,所以给予数码管P1.0/1/2/3一个低电平0即可点亮数码管。P0则是赋值0x16进制数。如果让数码管显示0的话,则赋值0xc0即可显示0. 显示“0”是点亮了数码管的a,b,c,d,e,f,段。
预习
过程
中的
疑问以及解答
驱动数码管的实验
疑问:
疑问一:什么才能点亮数码管?
解答:先看原理图,数码管是否共阴极还是共阳极,由原理图可知,该数码管共阳极,所以给P1的0、1、2、3口一个低电平0即可点亮数码管,反之给一个高电平1就能将数码管熄灭。
疑问二:数码管怎么才能显示数字呢?
解答:数码管分7段,只要点亮各个数码管段,即可显示要求的数字。以共阳极数码管为例子:将(dp)gfedcba转成二进制 1100 0000 ,转成16进制0xc0即可点亮0。
疑问三:我要让数码管中的一个依次显示10个数,代码怎么写呢?
解答:先定义要点亮的数码管,例如点亮P1.0,开头定义sbit P1_0 =P1^0;然后定义一个数组来存放0—9的16进制unsigned char code table[]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90}; 然后while(i--)依次遍历数组赋值给P0。点亮P1_0 = 0延迟函数 delay();点亮P1_0=1;
疑问四:怎么写延迟函数?
一个机器周期1us, for循环8us, 第2个for循环8*1200约等于10ms,delay()函数延迟x*10ms
void delay(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<1200;j++);
}
疑问五:数码管为什么要接电阻?
解答:保护数码管,限流。
疑问六:怎么才能知道数码管共阳极还是共阴极?
解答:看数码管是否接电源。接电源为共阳极。
疑问七:共阴极数码管跟共阳极数码管点亮方式一样吗?
解答:不一样。共阴极给以高电平点亮,共阳极给以低电平点亮。
实验项目( 四 ) — 实验报告
项目
名称
驱动数码管的实验
指导教师
高照玲
实验室
教室
实验日期
2015/10/16
分组
情况
赵存档
成 绩
实验步骤(算法、代码、方法)给出流程图
实验代码:
#include <reg51.h>
sbit P2_0 = P2^0;
void delay(int);
unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82, 0xf8,0x80,0x90};
void main()
{
int i=10;
while(i--)
{
P0=table[i];
P2_0 = 0;
delay(100);
P2_0 = 1;
}
}
void delay(int x)
{
int i,j;
for(i=0;i<x;i++)
for(j=0;j<1200;j++);
}
实验结果(结论及
分析)
实验结果以及分析:
通过本实验,学会了proteus 数码管电路图该怎么画,keil代码该怎么写。其中,for循环依次让数码管显示数字时出了错,不像纯C语言那样,用while(i--)就好了。在下载hex文件到开发板时注意 软件中开发板芯片是否选对。经过此次实验学到很多知识。
成绩
转载于:https://www.cnblogs.com/zhaocundang/p/4925730.html
相关资源:Verilog数码管的动态显示