之前的帖子已经有在开发板上测试了一下,现在补充一个完整版,自己做了一个板,扩展了交流稳压输入模块,可实现的功能有上电初始化显示,四位同时抽奖,逐位抽奖,以及实时时钟,程序,原理图,制作出来的实物图如下:
电路原理图如下:
如有不足的地方可以再交流一下哈,相互学习学习
单片机源程序如下:
- #include <reg52.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <main.h>
- #define uchar unsigned char
- #define uint unsigned int
- unsigned char code table_disp[]={0x05,0xaf,0x46,0x86,0xac,0x94,0x14,0xa7,0x04,0x84};//段码表
- /* 0 1 2 3 4 5 6 7 8 9 */
- unsigned char code table_clock[]={0x01,0xab,0x42,0x82,0xa8,0x90,0x10,0xa3,0x00,0x80};//时钟段码表
- uchar t2; //1s计数
- uchar p;
- uchar msta; //散转变量
- uchar hour,minute,second;
- uchar q,w,e,r,y,u;
- /**************函数声明******************/
- void init();
- void keyscan();
- void disp(uchar x3,uchar x2,uchar x1,uchar x0,bit s,uchar x);
- //程序开始部分
- void main(){
- init();
- while(1)
- {
-
- while(!TF0);
- TH0=0xEC;
- TL0=0x78;
- TF0=0;
- t2++;
- keyscan();
- disp(q,w,e,r,y,u);
-
-
- if(t2==200)
- {
- t2=0;
- second++;
- if(second==60)
- {
- second=0;
- minute++;
- if(minute==60)
- {
- minute=0;
- hour++;
- if(hour==24)
- hour=0;
- }
- }
- }
-
- switch(msta)
- {
- case 0:
- {
- q=0;
- w=2;
- e=3;
- r=4;
- if(key1==1)
- { msta=1;
- led1=0;
- p=0;}
- break;}
- case 1:
- {
- if(p==0)
- {q=rand()%10;
- w=rand()%10;
- e=rand()%10;
- r=rand()%10;}
- if(key1==1)
- { key1=0;
- msta=2;
- led1=1;
- led2=0;
- p=0;}
- if(key2==1)
- p=1;
- if(key3==1)
- p=0;
-
- break;}
- case 2:
- {
- switch(p)
- {
- case 0:
- r=rand()%10;
- case 1:
- e=rand()%10;
- case 2:
- w=rand()%10;
- case 3:
- q=rand()%10;
- break;
- }
- if(key2==1)
- p++;
- if(key3==1)
- p=0;
- if(key1==1)
- { msta=3;
- led2=1;
- led3=0; }
- break;
- }
- case 3:
- {
- y=1;
- u=1;
- q=hour/10;
- w=hour%10;
- e=minute/10;
- r=minute%10;
- if(key2==1)
- { hour++;
- if(hour==24)
- hour=0;}
- if(key3==1)
- { minute++;
- if(minute==60)
- minute=0;}
- if(key1==1)
- { msta=0;
- y=u=0;
- led3=1; }
- break;
- }
- }
- }}
- /**************************
- 初始化函数定义
- **************************/
- void init(){
- led0=0;
- msta=0;
- hour=12;
- minute=30;
- TMOD=0x01; //选择定时器0,工作方式1
- TH0=0xEC; //5ms计数初值
- TL0=0x78;
- TR0=1;
- }
- /**************************
- 显示函数定义
- **************************/
- void disp(uchar x0,uchar x1,uchar x2,uchar x3,bit s,uchar x)
- {static uchar dsbit,cut300;bit s300;
- cs0=1;cs1=1;cs2=1;cs3=1; //关显示
-
- switch(dsbit)
- {
- case 0:
- {
- if(x==1)
- P0=table_clock[x0];
- else
- P0=table_disp[x0];
- cs0=0;
- dsbit=1;
- break;
- }
- case 1:
- {
- if(x==1)
- P0=table_clock[x1];
- else
- P0=table_disp[x1];
- cs1=0;
- dsbit=2;
- break;
- }
- case 2:
- {
- P0=table_disp[x2];
- cs2=0;
- dsbit=3;
- break;
- }
- case 3:
- {
- P0=table_disp[x3];
- cs3=0;
- dsbit=0;
- break;
- }
- }
- cut300++;
- if(cut300==100)
- { s300^=1;
- cut300=0;}
- if(s&&s300)
- { dot=1;
- }
-
- return;
- }
-
复制代码
以上程序51hei下载地址:
源程序.docx
(15.62 KB, 下载次数: 35)
|