一天的单片机电子实习挺有趣的,特别是老师拿出的机器狗,俄罗斯方块单片机,太强了。上午的电子实习主要是写流水灯,有七个样例只需要写出来五个就能拿到四分,下午是做电子表,实现基础功能拿到四分,在增加一些功能如闹钟,日历等可以加分。此外在写交通表也可以加分。
#1.流水灯
#include<stc8a.h> #include<intrins.h> #define uchar unsigned char #define uint 
unsigned int sbit k1 = P3 ^ 2; sbit k2 = P3 ^ 3; sbit k3 = P3 ^ 4; sbit k4 = P3 
^ 5; sbit led = P4 ^ 1; //流水灯开关,只有P4.0 = 0 流水灯才能工作 //延时子程序 void delay_t(uint t) 
{ uint a; uchar b; for(b=0;b<4;b++) for(a=0;a<t;a++); } // 1 void start_1() { 
uchar a, b; b = 0xfe; for(a=0;a<7;a++) { P0 = b; delay_t(50000); b = _crol_(b , 
1); } for(a=0;a<7;a++) { P0 = b; delay_t(50000); b = _cror_(b , 1); } } // 2 
void start_2() { uchar a, b; b = 0xfe; for(a=0;a<7;a++) { P0 = 0xe7 & b; delay_t
(500000); b = _crol_(b, 1); } for(a=0;a<7;a++) { P0 = 0xe7 & b; delay_t(500000);
 b= _cror_(b, 1); } } //3 void start_3() { uchar a, b, c; b = 0xfe; // 11111110 
c= 0x7f; // 01111111 for(a=0;a<4;a++) { P0 = b & c; delay_t(500000); b = _crol_(
b, 1); c = _cror_(c, 1); } for(a=0;a<3;a++) { P0 = b & c; delay_t(500000); b = 
_crol_(b, 1); c = _cror_(c, 1); } } //4 void start_4() { uchar a, b, c; b = 0x7f
;// 01111111 c = 0x7f;// 01111111 for(a=0;a<8;a++) { P0 = b; delay_t(500000); b 
= _cror_(b, 1);//10111111 c = b & c; //00111111 b = c; } b = 0x01; c = 0x01; for
(a=0;a<8;a++) { P0 = b; delay_t(500000); b = _crol_(b, 1); c = b | c; b = c; } }
//5 void start_5() { uchar a, b, c, d, e, t; b = 0xfe; c = b; d = 0xff; for(e=8;
e>0;e--) { for(t=0;t<e;t++) { P0 = b & d; delay_t(500000); b = _crol_(b, 1); } d
= P0; b = c; } } void main() { led =0; //点亮流水灯 while(1) { start_1(); start_2(); 
start_3(); start_4(); start_5(); } } 
#2.电子表
 想着增加一个闹钟的功能但做不出来,我增加了一个时间内置好的闹钟,按f5的时候可以关闭闹钟。
#include<STC8A.h> #define uchar unsigned char #define uint unsigned int 
//显示的数字数组,依次为0 1 2 3 4 5 6 7 8 9 - uchar table[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99
, 0x92, 0x82, 0xf8, 0x80, 0x90, 0xbf}; //显示数码管数组,依次选择1 2 3 4 5 6 7 8 uchar 
select[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; //按键定义 sbit k1 = P3
^ 2; //小时加 sbit k2 = P3 ^ 3; //小时减 sbit k3 = P3 ^ 4; //分钟加 sbit k4 = P3 ^ 5; 
//分钟减 sbit k5 = P4 ^ 0; sbit beep = P4 ^ 2; //蜂鸣器 //标志位定义 bit flag1, flag2, 
flag3, flag4, flag5; //时间变量定义 char hour, minute, second; //延时 void delay() { 
uint i= 100; while(i--); } //初始化 void init() { P0M1 = 0x00; P0M0 = 0xff; P1M1 = 
0x00; P1M0 = 0xff; P2M1 = 0x00; P2M0 = 0xff; //定时器T0初始化产生20毫秒 AUXR &= 0x7F; 
//定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0xC0; //设置定时初值 TH0 = 0x63; //设置定时初值 
TR0= 1; //定时器0开始计时 ET0 = 1; //允许定时器T0中断 EA = 1; //打开总中断 } //数码管显示子程序 void 
display() { P1 = select[0]; //选择第1个数码管 P0 = table[second%10]; //显示秒个数位 delay(); 
P1= select[1]; //选择第2个数码管 P0 = table[second/10]; //显示秒十位数 delay(); P1 = select[2
]; //选择第3个数码管 P0 = table[10]; //显示 ' - ' delay(); P1 = select[3]; //选择第1个数码管 P0 
= table[minute%10]; //显示分个位数 delay(); P1 = select[4]; //选择第2个数码管 P0 = table[
minute/10]; //显示分十位数 delay(); P1 = select[5]; //选择第3个数码管 P0 = table[10]; //显示 ' 
- ' delay(); P1 = select[6]; //选择第1个数码管 P0 = table[hour%10]; //显示时个位数 delay(); 
P1= select[7]; //选择第2个数码管 P0 = table[hour/10]; //显示时十位数 delay(); } //蜂鸣器 void 
Beep() { if(k5 == 1) { if(flag5 == 0) { flag5 = 1; beep = ~beep; } } if(k5 == 0)
{ flag5 = 0; } } void set_time() { // 0 down; 1 up // k1 hour + if(k1 == 0) { if
(flag1 == 0) { flag1 = 1; hour++; } } if(k1 == 1) { flag1 = 0; } // k2 hour - if
(k2 == 0) { if(flag2 == 0) { flag2 = 1; hour --; } } if(k2 == 1) { flag2 = 0; } 
// k3 minute + if(k3 == 0) { if(flag3 == 0) { flag3 = 1; minute++; } } if(k3 == 
1) { flag3 = 0; } // k4 minute - if(k4 == 0) { if(flag4 == 0) { flag4 = 1; 
minute--; } } if(k4 == 1) { flag4 = 0; } } void main() { init(); P2 = 0x00; 
//关闭交通灯 while(1) { display(); set_time(); } } void timer0()interrupt 1 { uchar 
t0; t0++; if(t0 == 60) { t0 = 0; second++; } if(second == 60) { second = 0; 
minute++; } if(minute == 60) { hour++; minute=0; } if(hour == 24) { hour=0; } if
(minute == 12 && hour == 12) { Beep(); } } 
#3.交通表
 一个朋友搞出来了。
#include<STC8A.h> #define uchar unsigned char #define uint unsigned int uchar 
table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; uchar select[]
={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar redt,greent,time,sign; sbit k1
=P3^2; sbit k2=P3^3; sbit k3=P3^4; sbit k4=P3^5; sbit dxg=P2^0; sbit dxy=P2^1; 
sbit dxr=P2^2; sbit nbg=P2^3; sbit nby=P2^4; sbit nbr=P2^5; bit flag1,flag2,
flag3,flag4;/*以南北向红绿灯为基准调节时间,flag1红灯时间增加,flag2红灯时间增减少,flag3绿灯时间增加,flag4绿灯时间减少*/ 
void delay() { uint i=1000; while(i--); } void init() { P0M1=0x00; P0M0=0xff; 
P1M1=0x00; P1M0=0xff; P2M1=0x00; P2M0=0xff; AUXR&=0x7F; TMOD&=0xF0; TL0=0xC0; 
TH0=0x63; TR0=1; ET0=1; EA=1; } void light(char a) { if(a=='r') { if((redt-time)
>4) { nbr=1; nby=0; nbg=0; dxr=0; dxy=0; dxg=1; } if((redt-time)<=4) { nbr=1; 
nby=0; nbg=0; dxr=0; dxy=1; dxg=0; } } if(a=='g') { if((greent-time)>4) { nbr=0;
 nby=0; nbg=1; dxr=1; dxy=0; dxg=0; } if((greent-time)<=4) { nbr=0; nby=1; nbg=0
; dxr=1; dxy=0; dxg=0; } } } void display_red() { light('r'); P1=select[0]; P0=
table[(redt-time)%10]; delay(); P1=select[1]; P0=table[(redt-time)/10]; delay();
 P1=select[6]; P0=table[(redt-time)%10]; delay(); P1=select[7]; P0=table[(redt-
time)/10]; delay(); } void display_green() { light('g'); P1=select[0]; P0=table[
(greent-time)%10]; delay(); P1=select[1]; P0=table[(greent-time)/10]; delay(); 
P1=select[6]; P0=table[(greent-time)%10]; delay(); P1=select[7]; P0=table[(
greent-time)/10]; delay(); } void set_time() { if(k1==0) { if(flag1==0) { flag1=
1; redt++; } } if(k1==1) { flag1=0; } if(k2==0) { if(flag2==0) { flag2=1; redt--
; } } if(k2==1) { flag2=0; } if(k3==0) { if(flag3==0) { flag3=1; greent++; } } 
if(k3==1) { flag3=0; } if(k4==0) { if(flag4==0) { flag4=1; greent--; } } if(k4==
1) { flag4=0; } } void main() { init(); P1=0x00; redt=30; greent=30; while(1) { 
if(sign==0) { display_red(); } if(sign==1) { display_green(); } set_time(); } } 
void timer0()interrupt 1 { uchar t0; t0++; if(t0==50) { t0=0; time++; } if(sign
==1) { if(greent==time) { time=0; sign=0; } } if(sign==0) { if(redt==time) { 
time=0; sign=1; } } } 
单片机是真的很有意思,可惜这样的电子实习只有八个课时。