用4个动态数码管显示,实现0~9999计数功能,延时为1s,用c语言。

用4个动态数码管显示,实现0~9999计数功能,延时为1s,用c语言。,第1张

/***数显秒表,范围0~9999***/漏局

/***源程序默认硬件纤搜歼环境: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]确定,即可。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12284907.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存