共12页 第6页
图3 系统设计电路图
四、软件设计分析
程序流程图:
共12页 第7页
手动开关 程序开始 对定时器/计数器初始化始化 开中断并 启动定时器 定时器溢出中断 对定时器重新赋值 进行加一操作后重新计算时间 往P0口和P2口送显示时间 数码管显示 判断P3^4口是否有低电平信号 否 否 判断P3^7口是否有低电平信号 是 开始、暂停或者继续 是 计数置零 中断返回主函数
共12页 第8页
实验程序:
#include
unsigned char code table0[]={0x3f,0x06,0x5b,0x4f,0x66, 0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code table1[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90};
/*声明second10用于计数十分之一秒变化,second1用于记录秒的个*/ /*位,second2用于记录秒的十位*/
unsigned int second10,second1,second2; bit bdata flag;
/*以下是设置延时功能的函数*/
void delay() { unsigned char i,j; for(i=90;i>0;i--) for(j=200;j>0;j--); } }
/*以下是设置时间的函数*/ void setTime() { second10++;
if(second10==10) /*当十分之一秒计数到十后从零重新计时*/ {
second10=0; /*同时秒计时个位加一*/ second1++;
if(second1==10) /*当秒计数个位到十后从零重新计时*/ {
second1=0;
second2++; /*同时秒计时十位加一*/ if(second2==6) second2=0; } } }
/*以下是向LED管输数据并使之显示的函数*/
void dispact() {
共12页 第9页
P3=0xfe; P0=table1[second1]; delay(); P3=0xfd;
P0=table1[second2]; delay();
P2=table0[second10]; }
/*以下是设置时间函数和输数据函数被此函数调用实现,利用定时器中断*/ /*十分之一秒刷新一次,实现十分之一秒进一*/ Timer0 () interrupt 1 using 1 {
TH0 = (65535 - 50000)/256; TL0 = (65535 - 50000)%6; if(flag) setTime(); dispact(); }
void main(void) {
TMOD = 0x01;
TH0 = (65535 - 50000)/256; /*定时器赋初值*/ TL0 = (65535 - 50000)%6; flag = 0;
EA = 1; /*cpu开中断*/ TR0 = 1; /*利用定时器0*/ ET0 = 1; /*外部中断允许*/ do {
if(!sta_end) {
if(flag == 0) flag = 1;
else flag = 0; }
if(!reset) /*复位设置,全部清零*/ {
flag = 0;
second10 = 0; second1 = 0; second2 = 0;
共12页 第10页