
/***源程序默认硬件纤搜歼环境:52单片机,12MHz晶振,4位共阳数码管,P0 口段选,P10~P13 高电平位选(NPN三极管驱动),P13为最高位数码管***/
#include"reg52.h" //包含52头文件
#define TRUE 1 //定义布尔量'1':真
#define FALSE 0 //定义布尔量'0':假
#define uchar unsigned char //定义 无符号字符型数据 简称
#define uint unsigned int //定义 无符号整型数据 简称
#define th0 0xfc
#define tl0 0x18 //1ms at 12MHz(定时器工作模式1 状态)
#define SEG_Num 4 //数码管位数
#define SEG_Data P0 //数码管段驱动接口
#define SEG_En P1 //数码管位驱动接口
#define SEG_AllOff (SEG_En&=0xf0) //关闭所有数码管(位驱动)
#define DisTimeAt1msCount 4 //单'位'数码管显示时间,数码管刷新频率f=1/(N×t),其中 N为数码管位数, t为单'位'数码管显示时间
#define T1sAt1msCount 1000 //1秒 计数值(在定时器为1ms 情况下计数)
#define TimesEnd 10000 //显毁冲示内容范围 0~9999
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} //共阳数码管代码表"0-9"
uint Sec
uchar bdata Flag=1
sbit DisplayFlag=Flag^0 //显示标志位
sbit TimesUpFlag=Flag^1 //时间更新标志位
void Timer0() interrupt 1 //定时器0中断函数
{
static uchar t1ms //定义静态变量 t1ms 定时计数寄存空间
static uint t1ms_sec
TL0=tl0
TH0=th0 //重赋 1ms 定时初值
t1ms=++t1ms%DisTimeAt1msCount //先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE //若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
t1ms_sec=++t1ms_sec%T1sAt1msCount //在 T1sAt1msCount(1000) 范围内加1
if(!t1ms_sec) TimesUpFlag=TRUE //若 归0,则1s 时间到,时间更新标志位 置位
}
void SystemInit() //系统初始化函数
{
TMOD=0x01 //关闭定时器1,开启定时器0,且工作在模式1(16位定时器)
TH0=th0
TL0=tl0 //装定时初值(1ms at 12MHz)
TR0=1 //启动计时
ET0=1 //允许定时器0中断
EA=1 //开启系统中断功能
}
float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数
{
float sum
if(x==0 &&y==0) return //0 的 0 次方无意义
else if(x==0) sum=0 //可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1 //除上述情况外,任何数的 0 次方均为 1
else if(y==1) sum=x //任何数的 1 次方 均为 本身
else if(y>1) sum=Pow_Self(x,--y)*x //递归调用,降幂
return sum //返回计算结果
}
void TimesUpdata() //时间更新 函数
{
if(TimesUpFlag) //若 时间更新标志 为真
{
Sec=++Sec%TimesEnd //Sec (秒)在 TimesEnd (0~999) 范围内加1
TimesUpFlag=FALSE //清 时间更新标志位
}
}
void Display(uint dis_num) //显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca //定义静态变量 显示位置
if(DisplayFlag) //若显示标志位为真(单'位'显示时间结束),则执行以下任务
{
DisplayFlag=FALSE //清显示标志位
dis_loca=++dis_loca%SEG_Num //先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff //关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10] //将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
SEG_En|=1<<dis_loca //开启本次需要显示的位驱动
}
}
void main() //主函数
{
SystemInit() //调用 系统初始化函数
while(1) //循环系统
{
TimesUpdata() //调用 时间更新函数
Display(Sec) //调用 显示函数 显示内容为 Sec
}
}
/***数显秒表——火柴天堂作品-20121210***//***源程序默认硬件环境:52单片机,11.0592MHz晶振,四位共阳数码管,P0段选,P20-P23高电平位选,P20最高位,P23最低位,P14-17四独立按键(开始,停止,继续,清零)***/
/***功能要求:数码管高2位显示“分”,低2位显示“秒”,中间使用小数点(常亮)分隔***/
#include"reg52.h"//包含52头文件
#define TRUE 1//定义布尔量'1':真
#define FALSE 0//定义布尔量'0':假
#define uchar unsigned char//定义 无符号字符型数据 简称
#define uint unsigned int//定义 无符号整型数据 简称
#define th0 0x4c
#define tl0 0x00//50ms at 11.0592MHz(定时器工作模式1 状态)
#define th1 0xfc
#define tl1 0x66//1ms at 11.0592MHz(定时器工作模式1 状态)
#define T1sAt50msCount 20//定义 1s 在 50ms 计时基准状态下 的计数值 为20
#define SEG_Num 4
#define SEG_Data P0//数码管段驱动接口
#define SEG_En P2//数码管位驱动接口
#define SEG_AllOff (SEG_En&=0xf0)//关闭所有数码橡槐管(位驱动)
#define DisTimeAt1msCount 4//单'位'数码管显示时间,数码管刷新频率f=1/(N*t),其中 N为数码管位数,t 为单'位'数者做码管显示时间
uchar code SEG_B_List[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}//共阳数码管代码表"0-9"
sbit KeyStart=P1^4//开始键
sbit KeyStop=P1^5//停止键
sbit KeyGoOn=P1^6//继续键
sbit KeyClear=P1^7/首如衡/清零键
#define NotKeyValue 0//无按键键值
#define KeyStartValue 1//开始键键值
#define KeyStopValue 2//停止键键值
#define KeyGoOnValue 3//继续键键值
#define KeyClearValue 4//清零键键值
uchar Sec=0,Min=0//秒、分 寄存器
uchar bdata Flag=2//标志位 寄存器
sbit T1sTimesUpFlag=Flag^0//1s时间到标志位
sbit DisplayFlag=Flag^1//显示(刷新)标志位
sbit ClockStartFlag=Flag^2//时钟开始标志位
sbit ClearFlag=Flag^3//清零(请求)标志位
void Timer0() interrupt 1//定时器0中断函数
{
static uchar t50ms
TL0=tl0
TH0=th0
if(!ClearFlag)//无 清零请求
{
t50ms=++t50ms%T1sAt50msCount//先对50ms计时变量加1,后对变量范围进行限制(0~19)(即对20取模)
if(!t50ms) T1sTimesUpFlag=TRUE//若计时变量归0,表示计时变量曾经到达20(1s),则对1s计时标志位 置位
}
else//有 清零请求
{
t50ms=0//清 50ms寄存器
ClearFlag=FALSE//清 清零标志位
}
}
void Timer1() interrupt 3
{
static uchar t1ms
TL1=tl1
TH1=th1
t1ms=++t1ms%DisTimeAt1msCount//先计数值加1,后对计数范围进行限制0~(DisTimeAt1msCount-1)
if(!t1ms) DisplayFlag=TRUE//若定时计数值归0,则表示计数值曾到达 单'位'显示时间(DisTimeAt1msCount),显示标志 置位
}
void TimerInit()
{
TMOD=0x11//开启定时器0、定时器1,并都工作在模式1
TH0=th0
TL0=tl0
TR0=0//未启动T0定时器 计时(上电时,秒表停止状态)
ET0=1//允许定时器0中断
TH1=th1
TL1=tl1
TR1=1//启动T1定时器 计时
ET1=1//允许定时器1中断
EA=1//开启系统中断功能
}
void TimesUpdata()//时间更新函数
{
if(T1sTimesUpFlag)//若 1s计时标志位 为 真,即 1s定时时间到
{
Sec=++Sec%60//秒Sec在0-59范围内加1
if(!Sec) Min=++Min%60//若秒Sec 重归0,则分Min在0-59范围内加1
//if(!Sec) Min=++Min%100//分Min 计数范围0-99(与上一条语句2选1)
T1sTimesUpFlag=FALSE//清 1s计时标志位
}
}
uchar KeyScan()
{
if(KeyStart &&KeyStop &&KeyGoOn &&KeyClear) return NotKeyValue//无按键按下,返回 无按键键值
if(!KeyStart) return KeyStartValue//开始键按下,返回 开始键键值
if(!KeyStop) return KeyStopValue//停止键按下,返回 停止键键值
if(!KeyGoOn) return KeyGoOnValue//继续键按下,返回 继续键键值
if(!KeyClear) return KeyClearValue//清零键按下,返回 清零键键值
return NotKeyValue//误 *** 作,返回 无按键键值
}
void KeyResp()//按键响应函数
{
static uchar KeyValue//定义静态变量 存储按键值,设置位
static bit KeyDownFlag,KeyReadyFlag//定义静态变量 按键按下标志位,按键准备(响应)标志位
uchar key_value=KeyScan()//调用 按键扫描函数,并将扫描结果放在 key_value中
if(key_value!=NotKeyValue)//若扫描结果 有按键
{
KeyValue=key_value//存储按键值
KeyDownFlag=TRUE//按键按下标志位 置位
KeyReadyFlag=TRUE//按键准备(响应)标志位 置位
}
else KeyDownFlag=FALSE//若扫描结果 无按键,则 清 按键按下标志位
if(KeyReadyFlag &&!KeyDownFlag)//若按键准备就绪,且无按键按下,则表示已松手情况
{
switch(KeyValue)//选择对应按键处理
{
case KeyStartValue://开始键 处理
TR0=1//开启 时钟定时器
ClockStartFlag=TRUE//置 时钟开始标志位
break//开始键处理结束
case KeyStopValue://停止键 处理
TR0=0//关闭时钟定时器
ClockStartFlag=FALSE//清 时钟开始标志位
break//停止键处理结束
case KeyGoOnValue://继续键 处理
TR0=1//开启时钟定时器
ClockStartFlag=TRUE//置 时钟开始标志位
break//继续键处理结束
case KeyClearValue://清零键 处理
Sec=0//清 秒
Min=0//清 分
ClearFlag=TRUE//置 清零标志位
break//清零键处理结束
default:break//其他键处理,无 *** 作
}
KeyValue=0//清 按键值
KeyReadyFlag=FALSE//清 按键准备(就绪)标志位
}
}
float Pow_Self(float x,uint y)//自编简易 x 的 y 次方函数,y只能是 非负整数
{
float sum
if(x==0 &&y==0) return//0 的 0 次方无意义
else if(x==0) sum=0//可有可无,y!=0的情况已经包含x=0,不加不影响结果,但影响运算速度
else if(y==0) sum=1//除上述情况外,任何数的 0 次方均为 1
else if(y==1) sum=x//任何数的 1 次方 均为 本身
else if(y>1) sum=Pow_Self(x,--y)*x//递归调用,降幂
return sum//返回计算结果
}
void Display(uint dis_num)//显示函数,显示内容为 无符号整型数据 dis_num
{
static uchar dis_loca//定义静态变量 显示位置
dis_loca=++dis_loca%SEG_Num//先对 显示位置 加1,后对变量范围进行限制 0~(SEG_Num-1)
SEG_AllOff//关闭所有数码管显示(位驱动)
SEG_Data=SEG_B_List[(dis_num/(uint)(Pow_Self(10,dis_loca)))%10]//将显示内容(dis_num) 本次需显示的位(dis_loca)上的数值转成代码,并送到数据端口
if(dis_loca==2) SEG_Data &=0x7f//显示 小数点,用于区分 Min 跟 Sec
SEG_En|=1<<(SEG_Num-1-dis_loca)//开启本次需要显示的位驱动(高驱动)
}
void ClockDisplay()//时钟显示函数
{
if(DisplayFlag)//若 显示标志位 为 真
{
Display(Min*100+Sec)//调用 显示函数,显示内容为:高2位显示 分Min,低2位显示 秒Sec
DisplayFlag=FALSE//清 显示标志
}
}
void main()//主函数
{
TimerInit()//调用 定时器初始化函数
while(1)//循环系统
{
KeyResp()//调用 按键响应函数
TimesUpdata()//调用 时间更新函数
ClockDisplay()//调用 时钟显示函数
}
}
1.进入参数设置程序的方法:接通电源,数显表完成自检并进入正常工作状态后,按面板电源按键关闭显示屏,按着按[abs/inc]键,再按面板电源按键可进入设置程序,窗口显示字母 SET UP
2.进入设置程序后,再按[<]或[>] 键滚动显示,看到字母ERR SET时,(表示设置线性误差补偿因数)按[ent] 进入把左边两窗口显示的补偿系数,记录在纸上,以备后用,然后再次按[ent],回到主菜单。
3.接着按[>]键,不断重复直到出现NORMRL(表示进入恢复出厂设置),按[ent]即可恢复出设置。DEFAULT表示所有设定参数改回出厂设定,选择QUIT退出。
4.继续按[<]或[>]键滚动显示,ERROR SET(打开补偿方式)出现按[ent]键进入:
(ERROR SET表示设置分段误差补偿因数)
按X0后再按[>]键,穗迟选择LIM COMP(右边,进入)、选择Lin Err(线者族仿性补偿)按[ent]确定。SEC ERR(表示区域补偿)
按Y0后再按[>]键,选择LIM COMP(右边,进入)、选择LIM COMP(右边,进入)、选择Lin Err(线性补偿)按[ent]确定。
按[<]或[>]键直到ERROR SET出现,按[ent]进入
5.按X0此时若显示IER0时,按[>]键出现ENT COMP(表示输入补偿因数)输入数值,把刚才记录的X向补偿参数的数据输入进去,然后按[ent]确定。
6.按Y0此时若显示IER0时,按[>]键出现ENT COMP(表示输入补偿因数)输入数值,把刚才记录的Y向补偿参数的数据输入进去,然后按[ent]确定。退出,进入主菜单。
7.首纤重复按[>]键,直到QUIT出现,按[ent]确定,即可。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)