下列代码为自行学习时的复盘总结,有需要可以参考,第一行会写大概功能。
持续更新中…
#include //功能:交通灯 190925
sbit LED=P1^0;
void delay(unsigned int i)
{
while(i--);
}
void main()
{
while(1)
{
P1=0xDE; //A green B red
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(20000);
P1=0xEE; // A yellow B red
delay(50000);
P1=0xF3; // A red B green
delay(50000);
delay(50000);
delay(11000);
P1=0xF5; // A red B yellow
delay(50000);
}
}
#include //功能:24秒倒计时响蜂鸣器 190924
sbit LED=P1^0 ; //灯
sbit Be=P2^0; //蜂鸣器
sbit QC=P3^2 ; //取消键,把线连到这个位置,按下后暂停
sbit KS=P3^3; //开始键,按下后开始
void delay (unsigned int i )
{ while(i--);
}
void main ()
{
unsigned int T_count=0;
unsigned char count;
LED=1;
Be=1;
QC=1;
KS=1;
TMOD=0x01;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
while(KS);
TR0=1;
count=48; //设置秒数,48为24s
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
T_count++;
if(T_count==48) //设置秒数,48为24s
{
T_count=0;
LED=~LED;
count--;
if(count==0)
{
while(QC)
{
Be=0;
delay(200);
Be=1;
delay(200);
}
Be=1;
while(KS);
count=10;
}
}
}
}
}
#include // 功能: 显示数字,按下一个按键变下一位数 191028
sbit AX=P3^2; // 按下按键
void delay1s(unsigned char i)
{
for (i=0;i<20;i++)
{
TH1=0x3c;
TL1=0xb0;
TR1=1;
while(!TF1);
TF1=0;
}
}
void main ()
{
unsigned char code disp[]={0xC0,0xF9,0xA4,0xB0,0x99,
0x92,0x82,0xF8,0x80,0x90};
unsigned char two;
TMOD=0x10;
P2=0x00;
while(1)
{
for(two=0;two<10;two++)
{
while(AX);
while(!AX);
delay1s(20);
P0=disp[two];
}
}
}
#include //用数组在数码管显示学号 191104
void delay (unsigned char i)
{
while(i--);
}
int wz[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void main()
{
while(1)
{
P0=wz[0];
P1=led[5];
delay(100);
P0=wz[1];
P1=led[9];
delay(100);
P0=wz[2];
P1=led[5];
delay(100);
P0=wz[3];
P1=led[0];
delay(100);
P0=wz[4];
P1=led[1];
delay(100);
P0=wz[5];
P1=led[0];
delay(100);
P0=wz[6];
P1=led[2];
delay(100);
P0=wz[7];
P1=led[1];
delay(100);
}
}
#include //时钟电路 可显示时间 由于晶振问题其实时间不是很准 191107
void delay1ms() //5ms的话,时间会一直显示在刷新
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
unsigned char i,h=18,m=36,s=20; //想要显示的时间在这里设置,时分秒
int wz[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void main()
{
TMOD=0x01;
while(1)
{
for(i=0;i<125;i++)
{
P0=wz[0];
P1=led[s%10];
delay1ms();
P0=wz[1];
P1=led[s/10];
delay1ms();
P0=wz[2];
P1=led[10]; //显示-
delay1ms();
P0=wz[3];
P1=led[m%10];
delay1ms();
P0=wz[4];
P1=led[m/10];
delay1ms();
P0=wz[5];
P1=led[10]; //显示-
delay1ms();
P0=wz[6];
P1=led[h%10];
delay1ms();
P0=wz[7];
P1=led[h/10];
delay1ms();
}
s++; //时间+
if(s==60)
{
s=0;
m++;
if(m==60)
{m=0;
h++;
if(h>=23)
{h=0;
}
}
}
}
}
#include //功能:用74HC138模块三位连接,显示时钟,类似上一个
void delay5ms()
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
unsigned char i,h=18,m=36,s=20;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void main()
{
TMOD=0x01;
while(1)
{
for(i=0;i<125;i++)
{
P0=wz[0];
P1=led[s%10];
delay5ms(); //显示秒
P0=wz[1];
P1=led[s/10];
delay5ms();
P0=wz[2];
P1=led[10]; //显示-
delay5ms();
P0=wz[3];
P1=led[m%10];
delay5ms();
P0=wz[4]; //显示分
P1=led[m/10];
delay5ms();
P0=wz[5];
P1=led[10]; //显示-
delay5ms();
P0=wz[6];
P1=led[h%10];
delay5ms(); //显示时
P0=wz[7];
P1=led[h/10];
delay5ms();
}
s++; //时间+
if(s==60)
{
s=0;
m++;
if(m==60)
{m=0;
h++;
if(h>=23)
{h=0;
}
}
}
}
}
#include //功能:利用8*8点阵模块实现图形交替显示 191111
void delayms(unsigned int i)
{
unsigned char k;
while(i--)
for(k=0;k<120;k++); //120次空操作
}
void main()
{
unsigned char code led[]={0x00,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0x00}; //显示z
unsigned char code s[]={0x00,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x00}; //显示另一边的z
unsigned char w,i,z;
while(1)
{
for(z=0;z<200;z++) //做200次后变另一个图形
{
w=0x01;
for(i=0;i<8;i++) //8位行列
{
P0=w; //行数据送到P0口;
P1=led[i]; //列数据送到P1口;
delayms(1);
w<<=1;
P0=0xff; //关显示
}
}
for(z=0;z<200;z++)
{
w=0x01;
for(i=0;i<8;i++)
{
P0=w;
P1=s[i];
delayms(1);
w<<=1;
P0=0xff;
}
}
}
}
今日份 学中断 更新
#include //功能:中断的利用;主程序是流水灯,按下K1之后中断,全亮3秒所有灯,然后继续变回流水灯
#include // 191113
sbit K1=P3^2;
void delay (unsigned char q)
{
unsigned int i;
while(q--)
{
for(i=0;i<120;i++);
}
}
void time50ms(unsigned char i) //定义0.05秒
{
unsigned int k;
for(k=0;k<i;k++)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
}
void main()
{
TMOD=0X01; //设置T0,定时,方式1
EX0=1; //外部中断0允许位
IT0=1; //下降沿触发
PX0=1;
EX1=1;
IT1=0;
EA=1;
P0=0XFE; //流水灯初值
while(1)
{
time50ms(10);
P0=_crol_(P0,1);
}
}
void int_0() interrupt 0
{
unsigned char i,j;
delay(10);
j=P0; //保护现场
for(i=0;i<3;i++) //全亮三秒
{
P0=0x00;
time50ms(20); //一秒
}
P0=j; //恢复
}
void int_1() interrupt 2 using 2
{
unsigned char i,j;
j=P0;
for(i=0;i<3;i++)
{
P0=0x00; //全亮
time50ms(10);
P0=0xff; //全灭
time50ms(10);
}
while(!K2);
P0=j;
}
又一个周末,今日进阶中断,和上一个类似,不过主程序代码不同
#include //功能:中断的利用;主程序是交通灯,按下K1之后中断,A口亮绿灯,按K2为全红灯
#include // 191118
sbit K1=P3^2;
sbit K2=P3^3;
void delay (unsigned char q)
{
unsigned int i;
while(q--)
{
for(i=0;i<120;i++);
}
}
void time50ms(unsigned char i) //定义0.05秒
{
unsigned int k;
for(k=0;k<i;k++)
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
}
void main()
{
TMOD=0X01; //设置T0,定时,方式1
EX0=1; //外部中断0允许位
IT0=1; //下降沿触发
PX0=1;
EX1=1;
IT1=0;
EA=1;
P0=0XFE; //流水灯初值
while(1)
{
P0=0xDE; //A green B red
delay(50000);
delay(50000);
delay(50000);
delay(50000);
delay(20000);
P0=0xEE; // A yellow B red
delay(50000);
P0=0xF3; // A red B green
delay(50000);
delay(50000);
delay(11000);
P0=0xF5; // A red B yellow
delay(50000);
}
}
void int_0() interrupt 0
{
unsigned char i,j;
delay(10);
j=P0;
for(i=0;i<4;i++)
{
P0=0xDF;
time50ms(20);
}
P0=j;
}
void int_1() interrupt 2
{
unsigned char i,j;
delay(10);
j=P0;
for(i=0;i<8;i++)
{
P0=0xf6;
time50ms(20);
}
P0=j;
}
又一个周末休息,继续冲。之前学了中断的功能,这次把这个功能利用在时钟里,并实现一些效果
#include //功能:时钟中断功能,可实现清零效果和暂停并恢复
void delay5ms() //191118 1125 1127
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
while(!TF0);
TF0=0;
}
sbit K1=P3^2;
sbit K2=P3^3;
bit zt=0;
unsigned char count,h=11,m=9,s=20;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
int led[11]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40};
void chushih()
{
TMOD=0x11;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
TR1=1;
while(!TF1);
TF1=0;
EA=1;
ET1=1;
EX0=1;
EX1=1;
}
void xianshi()
{
P0=wz[0];
P1=led[s%10];
delay5ms(); //显示秒
P0=wz[1];
P1=led[s/10];
delay5ms();
P0=wz[2];
P1=led[10]; //显示-
delay5ms();
P0=wz[3];
P1=led[m%10];
delay5ms();
P0=wz[4]; //显示分
P1=led[m/10];
delay5ms();
P0=wz[5];
P1=led[10]; //显示-
delay5ms();
P0=wz[6];
P1=led[h%10];
delay5ms(); //显示时
P0=wz[7];
P1=led[h/10];
delay5ms();
}
void shizhongz() interrupt 3 //时间变化
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if (count==20){
count=0;
s++; //时间+
if(s==60)
{
s=0;
m++;
if(m==60)
{m=0;
h++;
if(h>=23)
{h=0;
}
}
}
}
}
void qingl() interrupt 0 //清零,按下P3^2对应的键即可
{
s=0;
m=0;
h=0;
count=0;
}
void zant() interrupt 2 //暂停,按下P3^3对应的键即可,再按下可以恢复时间
{
zt=~zt;
if(zt==1) TR1=0;
else TR1=1;
}
void main() //主时钟程序
{
chushih();
while(1)
{
xianshi();
}
}
又过一个周末,上周末LPL全明星太快乐了,继续学习
#include //功能:LED显示矩阵键盘上的案件号0~F
void delayms(unsigned int i) //延时 191202 1204
{
unsigned char k;
while(i--)
for(k=0;k<120;k++);
}
char scan_key();
void main()
{
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
unsigned char i;
P1=0xff;
P0=0xff;
while(1)
{
i=scan_key();
if(i==-1)continue;
else
P1=led[i];
}
}
char scan_key()
{
char i,temp,m,n;
bit find=0;
P2=0xf0;
i=P0;
i&=0x0f;
if(i!=0x0f)
{
delayms(10);
i=P0;
i&=0x0f;
if(i!=0x0f)
{
for(i=0;i<4;i++)
{
P2=0xfe<<i;
temp=~P0;
temp=temp&0x0f;
if(temp!=0x00)
{
m=i;
find=1;
switch(temp)
{
case 0x01:n=0;break;
case 0x02:n=1;break;
case 0x04:n=2;break;
case 0x08:n=3;break;
default:break;
}
break;
}
}
}
}
if(find==0) return -1;
else return(n*4+m);
}
单片机结课,在时钟的基础上做了个课程设计
#include //功能:利用3位74HC138的三位连接做的时钟
//大概功能有,设置闹钟,闹钟到点会响5秒,整点蜂鸣 191209 1211
sbit bee=P2^7; // 蜂鸣器
sbit k2=P3^0; // 闹钟设置键
sbit k1=P3^1; //蜂鸣器清除键
sbit shih=P3^2;
sbit shim=P3^3;
char count,h=9,m=59,s=56;
sbit deng=P2^0;
char mm=0,hh=0,a=0,b=0;
int d=30;
int ms;
int wz[8]={0x07,0x06,0x05,0x04,0x03,0x02,0x01,0x00};
char num[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
void delay(int i) //延时
{
while(i--);
}
void int0_int() interrupt 0
{
if(a==0)
{
delay(10);
m=m+1; //实时时间 分 修改
if(m==60)
{m=0;
}}
if(a==1)
{
delay(10);
mm=mm+1; //闹钟时间 分 修改
if(mm==60)
{mm=0;
}}
}
void int1_int() interrupt 2
{
if(a==0){
delay(10);
h=h+1; //实时时间 小时 修改
if(h==24)
{h=0;
}}
if(a==1){
delay(10);
hh=hh+1; //闹钟时间 小时 修改
if(hh==24)
{hh=0;
}}
}
void timer_1() interrupt 3 //定时器中断 实时时间
{
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
count++;
if(count==20)
{count=0;
s=s+1;
if(s>=60)
{m=m+1;
s=0;
}
if(m==60)
{h=h+1;
m=0;
}
if(h==24)
{h=0;
}
}
}
void beep() //蜂鸣器鸣叫
{ bee=0;
delay(50);
bee=1;
delay(50);
}
void main()
{ TMOD=0x10; //初始化
ET1=1;
EX0=1;
EX1=1;
EA=1;
TR1=1;
IT0=1;
IT1=1;
while(1)
{
if((mm==m)&&(hh==h)&&(s<5)&&(b==0))//判断闹钟时间是否到?
{
beep(); //蜂鸣器鸣叫10s ,k1键按下后清除
}
if(k1==0) //判断K1是否按下,(K1蜂鸣器清除键,b为标志 )
{
b=1-b;
while(k1==0); //等待按键释放
}
if(k2==0) //判断K2是否按下 (K2闹钟设置键,a为标志)
{
a=a+1;
if(a==2){a=0;}
while(k2==0);
}
if((m==0)&&(s<1)&&(b==0)) //整点报时,响1秒
{
beep();
}
if(a==0) //显示实时时间
{
deng=0xff;
P0=num[s%10]; //段选接P0
P1=wz[0]; //位选接P1
delay(d);
P0=num[s/10];
P1=wz[1];
delay(d);
if(b==0)
{P0=0x40;}
else{P0=0xc0;}
P1=wz[2];
delay(d);
P0=num[m%10];
P1=wz[3];
delay(d);
P0=num[m/10];
P1=wz[4];
delay(d);
P0=0x40;
P1=wz[5];
delay(d);
P0=num[h%10];
P1=wz[6];
delay(d);
P0=num[h/10];
P1=wz[7];
delay(d);
}
if(a==1) //显示闹钟时间
{
deng=0x00;
P0=num[mm%10];
P1=wz[0];
delay(d);
P0=num[mm/10];
P1=wz[1];
delay(d);
if(b==0){P0=0x40;}
else{P0=0xc0;}
P1=wz[2];
delay(d);
P0=num[hh%10];
P1=wz[3];
delay(d);
P0=num[hh/10];
P1=wz[4];
delay(d);
P0=0x78;
P1=wz[5];
delay(d);
P0=0x79;
P1=wz[6];
delay(d);
P0=0x6d;
P1=wz[7];
delay(d);
}
}
}