以51单片机为基体 用C语言设计一个计数器 要求显示数据8位 有复位功能 时间间隔1秒 动态显示

以51单片机为基体 用C语言设计一个计数器 要求显示数据位数8位(有8个数码管通过外部控制选择哪个数码管亮并计数) 有复位功能 计数时间间隔1秒 显示方式:动态显示 共阴数码管 计数脉冲可外部输入

最好有预置数功能 溢出报警功能
不对任何东西计数(是指不是计时 应为要通过不同的外部脉冲频率实现不同时间间隔的计数 一个脉冲一个计数 摁下开关 自动一直计数) 只是一个小实验 望各位大虾帮帮小弟 程序写完整一点 解释也多些一点

void dis_cnter(void) 显示计数器值子程序开始
{uchar i; 定义字符型局部变量i
P3_7=1;P3_6=1; 消隐有效,允许显示
for(i=0;i8;i++) 循环8次
{SBUF=SEG7[cnt];while(!TI);TI=0;} 根据8个单元的计数值查表发送显示
P3_7=0; 关闭消隐,正常显示
} 显示计数器值子程序结束

void cnter(void) 计数转换子程序开始
{uchar i; 定义字符型局部变量i
for(i=0;i7;i++) 循环8次
{if(cnt9){cnt=0;cnt[i+1]++;}}若计数器某位值大于9,则该位回0,
而高位被进位加1
------------------------------------
if(cnt[7]9){for(i=0;i8;i++)cnt=0;} 若计数器最高位值大于9,则计数器全清0
} 计数转换子程序结束

void pt_cnt(void) 输出控制子程序开始
{
if((cnt[0]==pre_cnt[0])&&(cnt[1]==pre_cnt[1])&&
(cnt[2]==pre_cnt[2])&&(cnt[3]==pre_cnt[3])&&
(cnt[4]==pre_cnt[4])&&(cnt[5]==pre_cnt[5])&&
(cnt[6]==pre_cnt[6])&&(cnt[7]==pre_cnt[7])) 若计数值等于预置值
out_flag=1; 输出标志置1
else out_flag=0; 否则输出标志置0
=================================================
if(out_flag)drv=0; 若输出标志为1,输出端(P3.4)置0,驱动光耦U2
else drv=1; 否则输出端(P3.4)置1
} 输出控制子程序结束

void main(void) 主程序开始
{ IE=0x84; 开放CPU中断,开放外中断1的中断
IT1=1; 置外中断1为边沿触发
while(1) 无限循环
{P3_6=0;P3_7=1; 禁止发送给显示器,消隐有效
SBUF=0x00;while(!TI);TI=0; 向IC2发送0x00,使IC2输出为全0
if((P3&0x24)!=0x24)keydown_flag=1; 检测P3.2、P3.5是否为高电平。
若不为高电平,说明有键按下,键被按下标志置1
else keydown_flag=0; 否则,键被按下标志置0
-------------------------------------------------------------------------------
SBUF=0xfe;while(!TI);TI=0; 向IC2发送0xfe
if(!P3_2)set_flag=!set_flag; 若P3.2为0,说明S9键按下,标志set_flag取反
==================================================
if(!set_flag){cnter();dis_cnter();pt_cnt();delay(100);}
若标志set_flag为0,调用计数、显示计数、输出控制的子程序
else {scan_key();dis_pre_cnter();delay(10);}
否则标志set_flag为1,调用扫描S1~S8键、显示预置值的子程序
=====================================================
if(keydown_flag)delay(300); 因有键按下,调用延时300mS子程序,
以免调整键值的速度过快
}
} 主程序结束

void extern_int1(void) interrupt 2 using 1 外中断1服务子程序
{
cnt[0]++; 计数器的最低位加1
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-12-04
设计一个计数器,--要求对什么计数?
时间间隔1秒 动态显示--1秒钟显示一位,8秒钟才能显示8位,能看清楚吗?
--------------
不对任何东西计数...--那么数字的来源是什么,是固定不变的?
溢出报警功能...--没有数字,怎么能溢出?
计数时间间隔1秒--好像是个时钟或者秒表,建议看看:
http://hi.baidu.com/%D7%F6%B6%F8%C2%DB%B5%C0/blog/item/425474d769c7622106088bcd.html
第2个回答  2010-12-04
利用单片机的外部中断加计数器,就可以简单的实现!
相似回答