/*
****************************************************************************************************
* 沈阳市万柳塘路56号
* (c)著作权2005,世信汇诚电子版权所有
* 世信汇诚电子的源代码是不公开, 属于世信汇诚电子的企业机密文件, 任何未经允许使用
* 或发表的行为都是违法行,任何个人或组织尝试或者参与修改源代码的行为,都应尽早得到世信
* 汇诚电子设计组的同意.
*
* 版本号:1.0
* 作 者:linan4526
* 日 期:2005-05-08
*---------------------------------------------------------------------------------------------------
* 描 述:SXHC-I型MCU51实验
****************************************************************************************************
*/
#include <test51.h>
/**********************************************************************
函数功能: 外部中断0函数
(监测光耦触发信号)
入口参数: 无
出口参数: 无
***********************************************************************/
void Extern_Int0() interrupt 0
{
if (!g_bInt0_Time)/*50毫秒之内的多次重复触发只确认一次*/
{
g_bInt0_Time=5;
g_btInt0_Flag=1;
}
else
g_bInt0_Time=5;
}
/**********************************************************************
函数功能: 定时器中断函数(扫描键盘)(10ms 16位定时)
入口参数: 无
出口参数: 无
***********************************************************************/
void Time0_Func() interrupt 1
{
TH0=(0xffff-9259)/256;
TL0=(0xffff-9259)%256;
if (g_bInt0_Time)
{
g_bInt0_Time--;
}
if (g_wTime)
{
g_wTime--;
}
Key_Scan();
Disp_Func();
}
/**********************************************************************
函数功能: 显示刷新函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Disp_Func(void)
{
static byte bTimes=30; /*闪烁延时150ms*/
static byte bPause_Times=50;/*暂停闪烁延时150ms*/
P0=0xff;/*清除显示*/
if (!g_btPause_Flag)/*正常显示*/
{
if ((g_bCurrent_Local+1)==g_strDisp.bDisp_Flag)/*有闪烁位*/
{
bTimes--;
if (bTimes>16)
{
P0=0xff;/*清除显示*/
}
else if (bTimes<16)
{
if (!bTimes)
bTimes=30;
P0=g_strDisp.bpDisp[g_strDisp.bDisp_Flag-1];/*显示段码*/
}
}
else/*无闪烁位*/
{
P0=g_strDisp.bpDisp[g_bCurrent_Local];/*显示段码*/
}
}
else/*按下暂停键后所有已经显示的数字闪烁*/
{
bPause_Times--;
if (bPause_Times>25)
{
P0=0xff;/*清除显示*/
}
else if (bPause_Times<25)
{
if (!bPause_Times)
bPause_Times=50;
P0=g_strDisp.bpDisp[g_bCurrent_Local];/*显示段码*/
}
}
if (g_bCurrent_Local)
{
Setb_Func(DS1_CS);
Clr_Func(DS2_CS);
g_bCurrent_Local=0;
}
else
{
Setb_Func(DS2_CS);
Clr_Func(DS1_CS);
g_bCurrent_Local=1;
}
P2=g_bP2_Io;
}
/**********************************************************************
函数功能: 清相应IO口函数(仅限中断服务函数使用)
入口参数: bPort:相应IO口
出口参数: 无
***********************************************************************/
void Clr_Func(byte bPort)
{
bit btEa_Bak;
btEa_Bak=EA;
EA=0;
bPort =~ bPort;
g_bP2_Io &= bPort;
EA=btEa_Bak;
}
/**********************************************************************
函数功能: 置相应IO口函数(仅限中断服务函数使用)
入口参数: bPort:相应IO口
出口参数: 无
***********************************************************************/
void Setb_Func(byte bPort)
{
bit btEa_Bak;
btEa_Bak=EA;
EA=0;
g_bP2_Io |= bPort;
EA=btEa_Bak;
}
/**********************************************************************
函数功能: 判断行列键是否有键函数
入口参数: 无
出口参数: 0/1 无键/有键
***********************************************************************/
byte Key_Func(void)
{
byte bI;
Clr_Func(KEY_OUT1);
Clr_Func(KEY_OUT2);
P2 = g_bP2_Io;
bI=P2;
if ((bI&KEY_IN1) && (bI&KEY_IN2))
return 0;
else
return 1;
}
/**********************************************************************
函数功能: 行列键盘扫描函数
入口参数: 无
出口参数: 0/1 无键/有键
***********************************************************************/
void Key_Scan(void)
{
byte bK,bKey,bLine,bRow;
if (Key_Func())
{
if (g_btKey_Press || g_btKey_Flag)
{ /*键盘未抬起或键值未处理则不扫描键盘*/
return;
}
Setb_Func(KEY_OUT2);
for (bRow=0; bRow<2; bRow++)
{
if (bRow)
{
Setb_Func(KEY_OUT1);
Clr_Func(KEY_OUT2);
}
P2=g_bP2_Io;
bK=P2;
bK &=(KEY_IN1 | KEY_IN2);
bK>>=2;
switch (bK)
{
case 1:
bLine=0;
break;
case 2:
bLine=1;
break;
default :
bLine=0xff;
break;
}
if (bLine!=0xff)
{
bKey=bLine+bRow*2;/*扫描到键值*/
break;
}
}
if (g_bKey_Bak != bKey)/*为去抖而备份当前按键*/
{
g_bKey_Time=0;
g_bKey_Bak=bKey;
}
else
{
if (g_bKey_Time==2)/*去抖有效*/
{
g_bKey=g_bKey_Bak;
g_bKey_Bak=0xff;
g_btKey_Press=1;
g_btKey_Flag=1;
Clr_Func(BELL_ON);
}
else/*去抖*/
g_bKey_Time++;
}
}
else/*按键抬起*/
{
g_btKey_Press=0;
Setb_Func(BELL_ON);
}
}
/**********************************************************************
函数功能: 扫描键盘函数
入口参数: bFlag:0/1 死等/不死等
出口参数: 0/1 无键值/有键值
***********************************************************************/
byte Wait_Key(byte bFlag)
{
if (bFlag)
{
if (g_btKey_Flag)
{
g_btKey_Flag=0;
return 1;
}
else
return 0;
}
else
{
while (!g_btKey_Flag);
g_btKey_Flag=0;
return 1;
}
}
/**********************************************************************
函数功能: 转换显示数据函数
入口参数: bDisp_Data 显示数据0~99
bDisp_Break 闪烁位数0~2
出口参数: 无
***********************************************************************/
void Hex_To_Disp(byte bDisp_Data,byte bDisp_Break)
{
byte bI,bJ,bpDisp[2];
if (bDisp_Data<100)
{
bI=Bin_Bcd_Func((dword)bDisp_Data,bpDisp);/*二进制转十进制*/
for (bJ=0; bJ<bI; bJ++)
{ /*查找显示段码*/
bpDisp[bJ]=g_bpDisp_Seg[bpDisp[bJ]];
}
if (bI==1)
{ /*如果转换十进制结果为一位,则将此位移到个位*/
Right_Move(bpDisp,1,1,g_bpDisp_Seg[0]);
}
if (g_unInit_Count.strInit.bDot_Len==1)
{ /*如果有小数点,则将显示段码的小数点点亮*/
bpDisp[0] &= DOT_SEG;
if (bI==1)
{
bI=2;
}
}
while (g_bCurrent_Local);
ET0=0;
g_strDisp.bDisp_Flag=bDisp_Break;
Init_Array_Func(2,g_strDisp.bpDisp,0xff);
for ( bJ=0; bJ<2; bJ++)
g_strDisp.bpDisp[bJ]=bpDisp[bJ];
ET0=1;
}
}
/**********************************************************************
函数功能: 设置计数初始值函数
入口参数: 无
出口参数: 无
***********************************************************************/
void Set_Counter(void)
{
byte bBak_Flag,bBak_Ex0;
byte bBreak,bLen,bpInput[2];
byte bBak_Init_Count;
bBak_Flag=g_btPause_Flag;
bBak_Ex0=EX0;
g_btPause_Flag=0;
EX0=0;
bBak_Init_Count=g_unInit_Count.strInit.bInit_Count;
Init_Array_Func(2,bpInput,0);
bLen=Bin_Bcd_Func((dword)bBak_Init_Count,bpInput);
Right_Move(bpInput,2-bLen,bLen,0);
bBreak=2;
while (1)
{
while (g_bCurrent_Local);
ET0=0;
g_strDisp.bDisp_Flag=bBreak;
Init_Array_Func(2,g_strDisp.bpDisp,0xff);
for ( bLen=0; bLen<2; bLen++)
g_strDisp.bpDisp[bLen]=g_bpDisp_Seg[bpInput[bLen]];
if (g_unInit_Count.strInit.bDot_Len)
{
g_strDisp.bpDisp[0] &= DOT_SEG;
}
ET0=1;
if (Wait_Key(0))
{
switch (g_bKey)
{
case S1:
if (bBreak==1)
bBreak=2;
else
bBreak--;
break;
case S3:
if (g_unInit_Count.strInit.bDot_Len==1)
g_unInit_Count.strInit.bDot_Len=0;
else
g_unInit_Count.strInit.bDot_Len++;
break;
case S2:
if (bpInput[bBreak-1]==9)
bpInput[bBreak-1]=0;
else
bpInput[bBreak-1]++;
break;
case S4:
bBak_Init_Count=(byte)Bcd_Bin_Func(bpInput,2);
if (g_unInit_Count.strInit.bDot_Len)
没有合适的资源?快使用搜索试试~ 我知道了~
沈阳世信汇诚--单片机实验板程序
共236个文件
bak:60个
obj:19个
lst:19个
需积分: 9 9 下载量 6 浏览量
2009-08-23
21:39:09
上传
评论
收藏 324KB RAR 举报
温馨提示
以80C51系列单片机为主体,详尽细介绍了单片机的工作原理和应用方面的知识,内容包括单片机结构、指令系统以及典型接口器件等。作者为本书的写作开发了实验仿真板;设计了实验电路板;以动画形式记录了多个使用实验仿真板进行实验的过程及现象。本书融进了作者多年教学、科研实践所获取的经验及实例,是作者在对单片机课程进行教学改革的基础上编写而成,摒弃了以学科体系为主线的编排方式,而采用以读者的认知规律为主线的编排方式。随书光盘提供了作者所设计的实验仿真板、实验电路板的原理图和印刷线路板图、书中所有的例子、一些常用工具软件、作者自编软件、实验过程及现象的动画等。读者获得的不仅是一本文字教材,更是一个完整的学习环境。本书可作为中等专业技术学校、中等职业学校、电视大学等的教学用书,也是业余电子爱好者或PC机编程爱好者自学单片机很好的教材。
资源推荐
资源详情
资源评论
收起资源包目录
沈阳世信汇诚--单片机实验板程序 (236个子文件)
a 2KB
a 1KB
a 1KB
a 1KB
ds18b20.ASM 3KB
test51.c.bak 11KB
test51.c.bak 5KB
test51.c.bak 4KB
test51.c.bak 3KB
test51.h.bak 3KB
at24.c.bak 2KB
main.c.bak 2KB
buzz.h.bak 2KB
bottem.c.bak 2KB
led_Uv2.Bak 2KB
ledrun_Uv2.Bak 2KB
all.h.bak 2KB
test51.h.bak 2KB
temprature_Uv2.Bak 2KB
counter_Uv2.Bak 2KB
I2CRW_Uv2.Bak 2KB
key_Uv2.Bak 2KB
test51.h.bak 2KB
seg8_Uv2.Bak 2KB
ledint_Uv2.Bak 2KB
comm_Uv2.Bak 2KB
commint_Uv2.Bak 2KB
relay_Uv2.Bak 2KB
buzz_Uv2.Bak 2KB
bottem.c.bak 2KB
bottem.c.bak 2KB
test51.h.bak 2KB
relay.h.bak 1KB
I2CRW_Opt.Bak 1KB
seg8_Opt.Bak 1KB
led_Opt.Bak 1KB
main.c.bak 1KB
counter_Opt.Bak 1KB
ledrun_Opt.Bak 1KB
key_Opt.Bak 1KB
main.h.bak 1KB
main.c.bak 1KB
comm_Opt.Bak 1KB
led.h.bak 1KB
led.h.bak 1KB
bottem.c.bak 1KB
temprature_Opt.Bak 1KB
main.c.bak 1KB
main.h.bak 1004B
main.h.bak 1004B
relay_Opt.Bak 990B
ledint_Opt.Bak 989B
commint_Opt.Bak 988B
main.h.bak 983B
all.h.bak 948B
all.h.bak 907B
buzz_Opt.Bak 866B
relay.c.bak 721B
led.c.bak 699B
buzz.c.bak 690B
led.c.bak 679B
all.h.bak 616B
int.bat.bak 170B
comm.bat.bak 166B
commint.bat.bak 166B
commint.bat 172B
int.bat 170B
seg8.bat 166B
comm.bat 166B
buzz 2KB
test51.c 12KB
test51.c 6KB
test51.c 4KB
test51.c 4KB
at24.c 3KB
main.c 3KB
bottem.c 3KB
at24.c 2KB
bottem.c 2KB
bottem.c 2KB
main.c 2KB
main.c 2KB
main.c 2KB
bottem.c 2KB
led.c 1KB
relay.c 1KB
led.c 1KB
buzz.c 1KB
comm 2KB
commint 4KB
counter 37KB
test51.h 3KB
all.h 3KB
test51.h 2KB
test51.h 2KB
relay.h 2KB
buzz.h 2KB
main.h 2KB
led.h 2KB
led.h 2KB
共 236 条
- 1
- 2
- 3
资源评论
deepbrown
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功