资源描述
目 录
1. 实验板介绍 2
2. 让实验箱成为仿真器 3
实验1 熟悉实验环境与简单编程 4
实验2 数据排序实验 17
实验3端口的输入、输出实验 18
实验4 阵列键盘与显示 20
实验5 外部中断实验 24
实验6 计数器实验 25
实验7 定时器实验 28
实验8 A/D实验 29
实验9 串口RS232实验 31
实验10 数字时钟 32
1. 实验板介绍
COM1
COM2
miniUSB
USB
S2
S1
主芯片
测温
电路
基准
电压
自定义
扩展区
SW19
实时
时钟
LED流水灯
红外收发
数码管
74595
74595
SP3232
CH340
1204
IS62C256
sw17
sw18
ADC按键
4*4扫描
阵列键盘
J8
J9
J7
J10
J5
J12
74573
实验板的布局
功能介绍:
(1) 供电:通过miniUSB或USB口供电(实验箱提供miniUSB数据口),然后通过SB1204稳压后作为整个实验板的工作电源
(2) 主芯片:IAP15F2K61S2,可在线仿真
(3) 电路板复位:SW19,按下断电,松开上电
(4) 流水灯:由LED7、LED8、LED9、LED10组成
(5) 串行口:电路板上有三个串口,主芯片通过芯片SP3232电平转换连接到COM1和COM2口。另外一个COM通过芯片CH340实现USB转串口,用于程序的下载及在线调试。
(6) 数码显示:八个数码管由2芯片74595驱动
(7) 红外收发:实现红外的信号收发
(8) 实时时钟:芯片为PCF8563
(9) 测温电路:未提供热敏电阻SDNT2012X103F3950FTF
(10) 基准电压:由芯片CD431给ADC提供基准电压2.5V
(11) 阵列接盘:通过扫描端口的方式检测按键
(12) ADC键盘:通过AD采样的方式检测键盘
(13) 中断按键:外部中断按键SW17、SW18
(14) 扩展RAM:通过外部并行总线的方式扩展了32K SRAM,芯片为IS62C256AL,其中74573为地址锁存器
(15) 自定义扩展区:过孔焊盘,可根据需要进行扩展
(16) 其他接插口:J5、J7、J8、J9、J10、J12(扩展液晶12764接口)
2. 让实验箱成为仿真器
为了方便学习单片机的硬件编程,一般采用在线仿真的方式进行。因此每次实验前,请先做这一步“创建仿真器”
烧写仿真器设置
用USB线将PC电脑和实验箱连接,单片机型号选择IAP15F2K61S2,串口号会自动检测USB-SERIAL CH340 (COMx),一般不需要调整。然后如上图,进入到“Keil仿真设置”页面,点击“将IAP15F2K61S2设置为仿真芯片(5.0V系统)”按钮,再在实验箱中按一下SW19按钮,当程序下载完成后仿真器便制作完成了。
烧写仿真器的过程
实验1 熟悉实验环境与简单编程
一、实验目的
1. 熟悉基于KEIL下的实验环境。
2. 掌握程序调试的单步、断点、连续运行方法。
3. 熟悉在KEIL环境下观察内部RAM , 特殊功能寄器的方法。
二、实验内容
编写并调试一个双字节无符号十进制数加法程序。其功能为将被加数写入30H、31H单元,
加数写入40H、41H单元,运行程序结果写入50H、51H、52H单元中,加法程序功能为:
(30H)(31H)+(40H)(41H)=(50H)(51H)(52H)(都是高位在前、低位在后)。
三、实验设备
1.STC学习板-套。
2.PC机一台。
四、实验步骤
1. 启动PC 机, 打开桌面上的 Keil μVision4 软件,进入μVision4 界面,如图1-1。
图1-1 μVision4 界面
2. 创建和打开项目(项目管理)
项目是用来保存文件、链接工具、目标代码生成和窗口配置信息的。可以使用“Project”
菜单中的“New μVision Project”选项来创建项目。一旦项目被保存,将保存如下信息:
● 当前所有打开的文件。
● 集成链接工具的设置。
● 目标生成配置。
● 主IDE 窗口及已经打开的调试窗口的位置和大小。
● 编辑器的设置如字体和文字颜色等。
2.1 创建新项目
2.1.1 选择【Project】/【New μVision Project】选项,并打开。如图1-2 。
2.1.2 在弹出的“Create New Project”对话框中选择要保存项目文件的路径,如图1-3。在“E盘” 以自己的学号建立一文件夹,以后自己的实验程序都存在此文件夹中。例如:新文件夹为“12345678” , 然后单击“保存”按钮。
图1-2 Project菜单
新建文件夹按钮
图1-3“Create New Project”对话框
2.1.3 在弹出的“Create New Project”对话框中的“文件名”文本框中输入项目名,例如:shiyan1,然后单击“保存”按钮。如图1-4。到此建立项目完成。
图1-4 建立项目
2.1.4 在弹出的对话框中要求选择单片机的型号。
在Keil中新建项目时选择芯片型号时,便会有“STC MCU Database”的选择项,如下图
图1-5 选择单片机类型
然后从列表中选择相应的MCU型号(目前STC支持仿真的型号只有STC15F2K60S2),所以我们在此选择“STC15F2K60S2”的型号,点击“确定”完成选择
图1-6 选择STC15F2K60S2型号
2.1.5 弹出的对话框点击“确定”按钮后,会弹出的如图1-7 的对话框,询问是否要将启动代码“Startup Code”加入到项目中。C 语言文件编程点击“是”;汇编文件点击“否”。
图1-7 “Startup Code”
3. 源程序编辑
IDE 包括一个全功能的编辑器。可用文件菜单中的“New File”命令来新建文件,或用文件工具栏中的“New”按钮 ,然后开始键入源程序。只有当文件的扩展名为.asm或.c时,才具有源程序关键字符彩色显示功能。可用文件保存按钮,或用文件菜单中的“Save”或“SaveAs”命令保存文件。然后再将编辑好的源代码添加到项目中。
3.1 建立一个新的实验源程序文件。选择【File】/【New】选项,或者单击工具栏 按钮。如果已经有源程序文件,可以忽略这一步。
3.2 在弹出的程序文本框中输入一个简单的程序,如图1-8 所示。
图1-8 输入新的实验源程序
3.3 程序输入完成后,要保存程序文件。选择【File】/【Save】选项,或者单击工具栏 按钮,保存文件。
3.4 将编辑好的源代码文件添加到项目中。单击Target1 前面的 + 号,展开里面的内容Source Group1,如图1-9 所示。
3.5 用右键单击Source Group1,在弹出的快捷菜单中选择Add File to Group`Source
Group1`选项,如图1-10所示。
3.6 如果是C 文件,则选择 “C Source file”;如果是汇编文件,则选择“Asm Source file”, 选择刚才源程序文件“shiyan1”,单击“Add”按钮,如果要添加多个文件,可以不断添加。添加完毕后单击“Close”按钮,关闭该窗口,如图1-11 。
图1-9 Target 展开图
图1-10 Add Files to Group ‘Source Group1’菜单
图1-11 Add Files to Group ‘Source Group1’对话框
3.7 接下来要对目标进行一些设置。用鼠标右键(注意用右键)单击Target1,在弹出的
会计菜单中选择Options for Target “Target 1”选项,如图1-12 所示。
图1-12 Options for Target “Target 1”选项
3.11 选择设置Debug 选项卡,这里有两类仿真形式可选:Use Simulator 和Use:STC Monitor-51 Driver,前一种是纯软件仿真,后一种是带有Monitor-51 目标仿真器的仿真。如图1-13 所示。
纯软件仿真仿真,选择“Use Simulator”即可。
选择STC仿真驱动
图1-13 设置Debug 选项
如上图,首先进入到项目的设置页面,选择“Debug”设置页,第2步选择右侧的硬件仿真“Use …”,第3步,在仿真驱动下拉列表中选择“STC Monitor-51 Driver”项,然后点击“Settings”按钮,进入下面的设置画面,对串口的端口号和波特率进行设置,波特率一般选择115200或者57600。到此设置便完成了。
4. 源程序的编译和链接
编译程序,选择【Project】/【Rebuild all target files】选项.或者单击工具栏中的 按钮,开始编译程序。如果编译成功,开发环境下面会显示编译成功的信息,图1-14;如果不成功,图1-15,需修改程序语法等,选中图中程序错误的行,双击左键,则在程序编辑窗口中,在错误源代码所在的行处显示一标记,对程序错误进行修改,全部修改后,重新编译,直至编译成功。
图1-14 编译成功
图1-15 编译不成功
5. 调试,运行程序菜单
5.1 编译完毕之后,选择【Debug】/【Start/Stop Debug Session】选项,或者单击工具栏中的铵钮,即就进入调试环境,如图1-16 ,或图1-17,单击工具栏 铵钮,可在汇编程序与反汇编程序之间来回切换。
开始调试程序。程序调试前应先要熟悉调试菜单Debug 、调试命令,视图菜单View、项目菜单Project 和项目命令Project。见表1、表2、表3
5.2 单步执行程序:
A. 单击工具栏 铵钮, 显示存储器窗口,在MEMORY#1 中的 / ddress 窗口处输入:D : 30H, 然后按回车键,在程序执行过程中,注意观察RAM 30H, 31H, 40H, 41H, 50H, 51H, 52H D1数据变化,
注意观察特殊功能寄存器的存数据变化情况。(A,B,SP,DPTR,PC,PSW,R0—R7)。
B. 单击工具栏 或快捷键 F11 ,单步执行程序,观察RAM ,特殊功能寄器“ A” 变化情况。
C. 当单步执行程序到 “ while(1); ” 时,停止向下执行,原地踏步。
D. 单击工具栏 复位。
E. 重新单步执行程。
观察和堆栈窗口
专用寄存器窗口铵钮
专用寄存器
存储器窗口
观察和堆栈窗口铵钮
汇编程序与反汇编程序切换铵钮
存储器窗口铵钮
图1-16 汇编程序
汇编程序
汇编程序与反汇编程序切换铵钮
图1-17 反汇编程序
5.2.2 程序的修改
A. 如果程序需要修改,单击工具栏 退出调试状态。
B. 对程序进行修改,并保存
C. 编译程序
D. 重新开始调试程序。
5.2.3 断点执行程序:
A. 断点的设置:单击要设置断点的程序行后,移动鼠标到工具栏,单击 ,此时要设置断点的程序行前,显示一红色标记,断点设置完成。可设置多个断点。
B. 单击工具栏 或快捷键 F5,直到遇到一个中断后停止,
C. 再次单击工具栏 或快捷键 F5,程序从断点处开始向下执行程序。
D. 断点的取消:单击要取消设置断点的程序行后,移动鼠标到工具栏,单击 ,此时设置断点的红色标记消除,断点被取消。
E. 单击工具栏 复位。
5.2.3 连续执行程序:单击工具栏 或快捷键 F5 ,连续执行程序,单击工具栏 或快捷键 Esc,停止程序运行。
6. 修改数据 :
ww0=0x55; //存储器窗口 察看30h
ww1=0x77; //察看31h
ww2=0xaa; //察看32h
ww3=0x44; //察看33h
ww4=0xdf; //察看34h
ACC=0xa3; //专用寄存器窗口 察看 A
B=0xbb; //专用寄存器窗口 察看 B
7.重新调试。
表1 视图菜单View。
菜单
工具栏
描述
Status Bar
显示 / 隐藏状态条
File Toolbar
显示 / 隐藏文件菜单条
Build Toobar
显示 / 隐藏编译菜单条
Debug Toobar
显示 / 隐藏调试菜单条
Project Window
显示 / 隐藏项目窗口
Output Window
显示 / 隐藏输出窗口
Source Browser
打开资源浏览器
Disassembly Window
显示 / 隐藏反汇编
Watch & Call Stack Window
显示 / 隐藏观察和堆栈窗口
Memory Window
显示 / 隐藏存储器窗口
Code Coverage Window
显示 / 隐藏代码报告窗口
Performance Analyzer Window
显示 / 隐藏性能分析窗口
Symbol Window
显示 / 隐藏字符变量窗口
Serial Window #1
显示 / 隐藏串口1的观察窗口
Serial Window #2
显示 / 隐藏串口2的观察窗口
Toolbox
显示 / 隐藏自定义工具栏窗口
Periodic Window Update
程序运行时刷新观察窗口
Workbook Mode
显示 / 隐藏窗口框架模式
Options . . .
设置颜色,字体,快捷键和编辑器的选项
表2 项目菜单Project 和项目命令Project
菜单
工具栏
快捷键
描述
New Project⋯
创建新项目
Import μ Vision1
Project⋯
转化μ Vision1 的项目
Open Project⋯
打开一个已经存在的项目
Close Project⋯
关闭当前的项目
Target Environment
定义工具、包含文件和库的路径
Targets,Groups,Files
维护一个项目的对象、文件组和文件
Select Device for Target
选择对象的CPU
Remove ⋯
从项目中移走一个组或文件
Options ⋯
Alt+F7
设置对象、组或文件的工具选项
File Extensions
选择不同文件类型的扩展名
Build Target
F7
编译修改过的文件并生成应用
Rebuild Target
重新编译所有的文件并生成应用
Translate ⋯
Ctrl+F7
编译当前文件
Stop Build
停止生成应用的过程
1~7
打开最近打开过的项目
表3 调试菜单和调试命令Debug
菜单
工具栏
快捷键
描述
Start/Stop Debugging
Ctrl+F5
开始/停止调试模式
Go
F5
运行程序,直到遇到一个中断
Step
F11
单步执行程序,遇到子程序则进入
Step over
F10
单步执行程序,跳过子程序
Step out of
Ctrl+F11
执行到当前函数的结束
Current function stop
Runing
Esc
停止程序运行
Breakpoints⋯
打开断点对话框
Insert/Remove Breakpoint
设置/取消当前行的断点
Enable/Disable Breakpoint
使能/禁止当前行的断点
Disable All Breakpoints
禁止所有的断点
Kill All Breakpoints
取消所有的断点
Show Next Statement
显示下一条指令
Enable/Disable Trace
Recording
使能/禁止程序运行轨迹的标识
View Trace Records
显示程序运行过的指令
Memory Map⋯
打开存储器空间设置对话框
Performance Analyzer⋯
打开设置性能分析的窗口
Inline Assembly⋯
对某一行重新汇编,可以修改汇编代码
Function Editor⋯
编辑调试函数和调试设置文件
Reset CPU
复位CPU
实验2 数据排序实验
一、实验目的
1. 熟悉51指令系统,掌握程序设计方法。
2. 掌握排序程序的设计方法。
二、实验内容
1. 本例程采用交换排序法将内部RAM 中的30~39H 单元中的10个单字节无符号二进制数按从小到大的次序排列,
2. 将排序后的数据中的最大的一个数和最小一个数去掉,求其他八个数的和,和放40H,41H
中, 求这八个数的平均值,放在50H中。
三、实验步骤
1.用 C 语言语言编写程序。
2.编译、生成项目、下载程序,调试运行程序。
3. 用单步、断点、连续执行程序的方法调试程序。
4. 打开RAM数据窗口,分别观察看30H—39H、40H, 41H(02H)(0C0H)和50H(58H)的单元。
四、实验参考程序
#include < STC15F2K61S2.H>
#include <stdio.h>
unsigned char a[10] _at_ 0x30;
unsigned char data0 _at_ 0x40;
unsigned char data1 _at_ 0x41;
unsigned char data2 _at_ 0x50;
void main()
{
unsigned char tmp,i,j;
unsigned int sum;
a[0]=0x5f;
a[1]=0x56;
a[2]=0x5a;
a[3]=0x5e;
a[4]=0x51;
a[5]=0x5b;
a[6]=0x53;
a[7]=0x58;
a[8]=0x57;
a[9]=0x55;
for(i=1;i<10;i++)
for(j=0;j<10-i;j++)
{
if(a[j]>a[j+1])
{tmp=a[j];a[j]=a[j+1];a[j+1]=tmp;}
} //数据排序
;
;
;
}
实验3端口的输入、输出实验
一、实验目的
1.掌握单片机I/O口数据输入、输出的方法。
2.掌握独立按键的接口和编程方法。
3.了解实验系统板硬件机构。
二、实验内容
本实验提供了一个2位按键,如果有键按下,则相应输出位为低电平,否则输出为高电平。4位逻辑电平显示电路,当相应的输入位为低电平时,指示灯亮。
1.要求编写一程序实现下列功能:SW17键按下,一盏指示灯亮;SW18键按下两盏指示灯亮;两键都按下时,LED10指示灯连续闪烁;两键全释放时,指示灯全部熄灭。
2.编写一程序实现下列功能:SW17键每按下一次,30H单元加一(30H初值为30H=0x00),并将30H 单元内容送到4位逻辑电平显示电路显示(4位二进制数,LED亮代表1);SW18键每按下一次,31H单元加二(31H初值为31H=0x03),并将31H 单元内容送到4位逻辑电平显示电路显示(4位二进制数,LED亮代表1)。
注意:MCU 判断有键按下后,要有一定的延时,防止由于键盘抖动而引起误操作。读出键值后,MCU 应再判断键按是否释放,如释放则根据键值进行相应操作。
三、实验步骤
1. 将实验箱成为仿真器。
2.用 C 语言编写程序。
3.编译、生成项目、下载程序,调试运行程序。
4. 观察发光二极管的亮灭与按键开关的要求是否一致。
四、实验程序参考框图
1. 按键点亮LED灯的参考程序如下,请补充后完成调试
#include <STC15F2K60S2.H>
#define uchar unsigned char
void delay1m(uchar i)
{
uchar j;
while(i--)
{
for(j=0;j<250;j++)
{;}
}
}
void main (void)
{
uchar key;
while(1)
{
………
if(key==0x08) //SW17
P16 = 0;
else if(key==0x04) //SW18
{
…….
}
else if(key==0x00) //两键
{
…….
}
else
{
……..
}
}
}
2. 按键计数并显示
#include <STC15F2K60S2.H>
#define uchar unsigned char
void delay1m(uchar i) //延时子程序
{……}
void disp(uchar i)
{ //二进制位: LED7、LED8、LED9、LED10
switch(i&0x0f)
{
case 0: P17=1;P16=1;P47=1;P46=1;break;
case 1: …..
……
default:P17=1;P16=1;P47=1;P46=1;
}
}
unsigned char ww0 _at_ 0x30;
unsigned char ww1 _at_ 0x31;
/*** 主函数 ****************/
void main (void)
{
uchar key,new;
ww0=0x00;
ww1=0x03;
while(1)
{
while(!(…..); //等按键按下
delay1m(1);
new=(P3&0x0c);
if(new==key)
{
while((…..){;} //等按键释放
switch(new)
{
case //SW17
case //SW18
default: disp(ww0);
}
}
}
}
实验4 阵列键盘与显示
一、实验目的
1.掌握数码管显示原理及编程方法。
2.掌握矩阵式键盘的接口和编程方法。
3.了解实验系统板硬件机构。
二、实验内容
本实验提供了一个4x4的矩阵式按键(实验箱右下角),其电路连接图如下。
实验箱中上部为八位共阴极数码管,由两片串入并出的移位寄存器74595驱动。如下图。
要求编写一程序实现下列功能:将按键0~F值用一位数码管显示,按一次键,显示键符。
三、实验步骤
1. 将实验箱成为仿真器。
2.用 C 语言编写程序。
3.编译、生成项目、下载程序,调试运行程序。
4. 观察数码管的显示是否与按键一致。
四、实验程序参考框图
#include <STC15F2K60S2.H>
#define uchar unsigned char
/************* 本地常量声明 **************/
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07, 0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black
0x00};
//公阴极
uchar code T_COM[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//位码
/************* IO口定义 **************/
sbit P_HC595_SER = P4^0; //pin 14 SER data input
sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock
sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock
/**************** 向HC595发送一个字节函数 ******************/
void Send_595(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
dat <<= 1;
P_HC595_SER = CY;
P_HC595_SRCLK = 1;
P_HC595_SRCLK = 0;
}
}
uchar KeyCode=0xFF; //给用户使用的键码, 0~15有效
// 0 1 2 3
// 4 5 6 7
// 8 9 A B
// C D E F
uchar IO_KeyState, IO_KeyState1, IO_KeyHoldCnt; //行列键盘变量
uchar code T_KeyTable[16] = {0,1,2,0,3,0,0,0,4,0,0,0,0,0,0,0};
void IO_KeyDelay(void)
{ uchar i;
i = 60;
while(--i);
}
void IO_KeyScan(void) //50ms call
{
uchar j;
j = IO_KeyState1; //保存上一次状态
P0 = 0xf0; //X低,读Y
IO_KeyDelay();
IO_KeyState1 = P0 & 0xf0;
P0 = 0x0f; //Y低,读X
IO_KeyDelay();
IO_KeyState1 |= (P0 & 0x0f);
IO_KeyState1 ^= 0xff; //取反
if(j == IO_KeyState1) //连续两次读相等
{
j = IO_KeyState;
IO_KeyState = IO_KeyState1;
if(IO_KeyState != 0) //有键按下
{
F0 = 0;
if(j == 0) F0 = 1; //第一次按下
else if(j == IO_KeyState)
{
if(++IO_KeyHoldCnt >= 20) //1秒后重键
{
IO_KeyHoldCnt = 18;
F0 = 1;
}
}
if(F0)
{
j = T_KeyTable[IO_KeyState >> 4]; //第j行,1,2,3,4
if((j != 0) && (T_KeyTable[IO_KeyState& 0x0f] != 0)) //第几列
KeyCode = (j - 1) * 4 + T_KeyTable[IO_KeyState & 0x0f] -1;
//计算键码,0~15
}
}
else IO_KeyHoldCnt = 0;
}
P0 = 0xff;
}
/********************** 主函数 ************************/
void main(void)
{
uchar i;
for(i=0;i<8;i++)
{
Send_595(T_COM[i]);
Send_595(t_display[0x10]); //消隐,全灭
P_HC595_RCLK = 1;
P_HC595_RCLK = 0; //锁存输出数据
}
while(1)
{
IO_KeyScan();
if(KeyCode<=15) //有键按下
{
Send_595(0x07F); //显示在最右边
Send_595(t_display[KeyCode]);
P_HC595_RCLK = 1;
P_HC595_RCLK = 0; //锁存输出数据
}
}
}
实验5 外部中断实验
一、实验目的
1. 掌握外部中断技术的基本使用方法
2.掌握中断处理程序的编写方法
二、实验内容
要求编写一程序实现下列功能:主程序一盏指示灯亮(LED7)连续闪动,当SW17键按下,进入中断,另一盏指示灯亮(LED8)亮一定时间后熄灭。
三、实验内容及步骤
1.将实验箱成为仿真器。
2.编译、生成项目、下载程序,调试运行程序。
3.观察发光二极管的亮灭与按键开关的要求是否一致。
四、实验程序参考框图
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
void delay1m(uint i)
{……}
void interEX0 () interru pt 0 //using 2
{
P17=1;
P16=0;
delay1m(8000);
P16=1;
}
void main()
{
TCON =0x01;
IP =0;
IE =1;
EA =1;
while(1)
{
P17=0;
delay1m(800);
P17=1;
delay1m(800);
}
}
实验6 计数器实验
一、实验目的
1. 学习8051内部计数器使用方法
2. 学习计数器各种工作方式的用法
3. 进一步掌握中断处理程序的编写方法
二、实验内容
要求编写一程序实现下列功能:主程序一盏指示灯LED7连续闪动,片内计数器 T0与按键脉冲输入联接,每当输入5个脉冲后,计数器T0产生中断,在中断程序中,R0加一,并将R0数值的个位数通过数码管显示出来。
三、实验电路
在用户扩展区焊接如下电路:
四、实验步骤
1.编译、生成项目、下载程序,调试运行程序。
2.观察指示灯LED7是否连续闪动。
3. 连续按动按键, 是否每按动五次,数码管显示出来的数据加一。
五、实验程序参考框图
#include <STC15F2K60S2.H>
#define uchar unsigned char
#define uint unsigned int
uchar ccout=0;
/************* 本地常量声明 **************/
uchar code t_display[]={ //标准字库
// 0 1 2 3 4 5 6 7
0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
// 8 9 A B C D E F
0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,
//black
0x00};
//公阴极
uchar code T_COM[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};//位码
/************* IO口定义 **************/
sbit P_HC595_SER = P4^0; //pin 14 SER data input
sbit P_HC595_RCLK = P5^4; //pin 12 RCLk store (latch) clock
sbit P_HC595_SRCLK = P4^3; //pin 11 SRCLK Shift data clock
/**************** 向HC595发送一个字节函数 ******************/
void Send_595(uchar dat)
{
uchar i;
for(i=0; i<8; i++)
{
dat <<= 1;
P_HC595_SER = CY;
P_HC595_SRCLK = 1;
P_HC595_SRCLK = 0;
}
}
void delay1m(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<250;j++)
{;}
}
}
void juq() interrupt 1
{
TH0= 0xFF;
TL0= 0xFB;
ccout++;
Send_595(0x07F);
Send_595(t_display[ccout%10]);
P_HC595_RCLK = 1;
P_HC595_RCLK = 0; //锁存输出数据
}
void main (void)
{
uchar i;
TMOD = 0x05;
TH0= 0xFF;
TL0= 0xFB;
IE = 0x82;
TR0=1;
for(i=0;i<8;i++)
{
Send_595(T_COM[i]);
Send_595(t_display
展开阅读全文