资源描述
1 第一题
#include <reg51.H>
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_7=P1^7;
unsigned char ID;
void delayms(unsigned char i)
{
unsigned char j;
for(i;i>0;i--)
for(j=1000;j>0;j--);
}
void main(void)
{ while(1)
{ if(P1_7==0)
{delayms(100);
if(P1_7==0)
{
ID++;
if(ID==4)
{
ID=0;
}
while(P1_7==0);
}
}
switch(ID)
{ case 0:
P1_0=~P1_0;
P1_1=1;P1_2=1;P1_3=1;
delayms(100);
break;
case 1:
P1_1=~P1_1;
P1_0=1;P1_2=1;P1_3=1;
delayms(100);
break;
case 2:
P1_2=~P1_2;
P1_0=1;P1_1=1;P1_3=1;
delayms(100);
break;
case 3:
P1_3=~P1_3;
P1_0=1;P1_1=1;P1_2=1;
delayms(100);
break;
}
}
}
2. 串行通信
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
uchar code Table[18]={1,3,7,0x0f,0x1F,0x3F,0x7F,0xff,0xFE,
0xFC,0xF8,0xF0,0xE0,0xC0,0x80,0,0xFF,00};
void Delay(unsigned int time);
void main()
{
unsigned int i,a;
TMOD=0x20;
TL1=0xF4;
TH1=0xF4;
TR1=1;
PCON=0x00;
SCON=0x50;
while(1)
{
for(i=0;i<18;i++)
{
SBUF=Table[i];
while(TI!=1); /*发送数据完成标志*/
TI=0; /*清除发送标志*/
while(RI!=1); /*接收到数据标志*/
RI=0; /*清除接收标志*/
a=SBUF;/*接收数据*/
P1=a;
Delay(200); /*彩灯状态保持一段时间*/
}
}
}
void Delay(unsigned int x)
{
uchar i;
while(x--)
{
for(i=0;i<125;i++)
{;}
}
}
3.五人表决器
#include <reg51.h>
sbit RST = P1^7;
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit K4 = P1^3;
sbit K5 = P1^4;
sbit led= P1^6;
unsigned char count;
void delay(unsigned k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<62;j++);
}
main()
{
while(1)
{
if(K1==0)
{
delay(40);
if(K1==0)
{ while(K1==0);
count++;P1=0xFF;}
}
else if(K2==0)
{
delay(40);
if(K2==0)
{ while(K2==0);
count++;P1=0xFF;}
}
else if(K3==0)
{
delay(40);
if(K3==0)
{while(K3==0);
count++;P1=0xFF;}
}
else if(K4==0)
{
delay(40);
if(K4==0)
{while(K4==0);
count++;P1=0xFF;}
}
else if(K5==0)
{
delay(40);
if(K5==0)
{while(K5==0);
count++;P1=0xFF;}
}
if(count>=3)
{led=~led;
delay(200);}
if(RST==0)
{delay(40);
if(RST==0)
{count=0;
P1=0xFF;}}
}
}
4.A/D转换 法一
#include <reg51.h>
#include <absacc.h>
#define CS273 XBYTE[0xCFA0]
#define IN7 XBYTE[0xCFAF]
void Delay(int U);
void Display();
unsigned char code table[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
unsigned BUF[2]={0,0};
unsigned char k,sn;
void main()
{unsigned char i;
IE=0x81;IT0=1;
while(1)
{ IN7=i;
sn=1;
while(sn);
Display();
}
}
void INT_0(void) interrupt 0
{k=IN7;sn=0;}
void Display()
{ unsigned char i,j;
BUF[0]=k/16;
BUF[1]=k%16;
while(j--)
{ CS273=table[BUF[0]];
P1=0xFE;
Delay(2);
CS273=table[BUF[1]];
P1=0xFD;
Delay(2);
}
}
void Delay(int U)
{
unsigned char i;
while(U--)
{
for(i=0;i<62;i++)
{;}
}
}
A/D 法二
/*
************************************************
*文件名:sy8.c
*版 本:V1.0_C
*功 能:AD0809通道0采集数据,并有四个数码管显示
*注 意:实验时,拔掉LED_JUMP跳帽
*创 建:吴文波
************************************************
*/
#include <reg51.h>
#include <absacc.h>
#define AD0809_0 XBYTE[0xCFA0]
#define CS273 XBYTE[0xCFA8]
/*分别控制4位数码管的位码*/
sbit P10=P1^0;
sbit P11=P1^1;
sbit P12=P1^2;
sbit P13=P1^3;
/*共阴极数码管显示数据:0-9 A-F 黑屏*/
table[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,
0x77,0x7C,0x39,0x5E,0x79,0x71,0x00};
unsigned char dispbuf[4];
unsigned char sn;
unsigned int idata BUF[8];
/*
************************************************
*函数名:INIT0_FUNC
*功 能:外部中断0服务函数,实现AD0809通道0数据采集
*输 入:无
*返 回:AD0809通道0数据
************************************************
*/
void INIT0_FUNC(void) interrupt 0
{
BUF[0]=AD0809_0;
sn=0;
}
/*
************************************************
*函数名:Delay
*功 能:Delay实现延时约1ms*temp(晶振6M)
* for循环执行一次需:(12*(1/6M))*8s
*输 入:延时时间 temp
*返 回:无
************************************************
*/
void Delay(unsigned char temp)
{
unsigned int j;
while(temp--)
{
for(j=0;j<62;j++){;}
}
}
/*
************************************************
*函数名:Display
*功 能:进行AD0809通道0数据的显示
*输 入:k--AD0809通道0、BUF[k]--AD0809通道0数据
*返 回:无
************************************************
*/
void Display(unsigned char k)
{
unsigned int t,j=10;
while(j--)
{
t=(double)BUF[k]/255*500; //???
dispbuf[0]=t%10;
dispbuf[1]=t/10%10;
dispbuf[2]=t/100%10;
dispbuf[3]=t/1000;
P10=0; /*第1位数码管位选通*/
P11=1;
P12=1;
P13=1;
CS273=table[dispbuf[0]]; /*第1位数码管段码*/
Delay(2);
P10=1;
P11=0; /*第2位数码管位选通*/
P12=1;
P13=1;
CS273=table[dispbuf[1]]; /*第2位数码管段码*/
Delay(2);
P10=1;
P11=1;
P12=0; /*第3位数码管位选通*/
P13=1;
CS273=table[dispbuf[2]]|0x80; /*第3位数码管段码*/
Delay(2);
P10=1;
P11=1;
P12=1;
P13=0; /*第4位数码管位选通*/
CS273=table[dispbuf[3]]; /*第4位数码管段码*/
Delay(2);
}
}
/*
************************************************
*函数名:INIT0Init
*功 能:外部中断0初始化
*输 入:无
*返 回:无
************************************************
*/
void INIT0Init()
{
IT0=1;
EX0=1;
EA=1;
}
/*
************************************************
*函数名:main主函数
*功 能:实现AD0809采集通道0数据并由4位数码管显示其值
*说 明:无
************************************************
*/
void main(void)
{
INIT0Init(); /*外部中断0初始化*/
while(1)
{
AD0809_0=0; /*启动通道0采集*/
sn=1;
while(sn);
Display(0); /*AD0809通道0数据显示*/
}
}
5. 抢答器(加数码管和LED灯)
#include <reg51.h>
#include <absacc.h>
#define cs273 XBYTE[0xCFA0]
sbit RST = P1^7;
sbit K1 = P1^0;
sbit K2 = P1^1;
sbit K3 = P1^2;
sbit P1_6=P1^6;
sbit led1=P1^3;
sbit led2=P1^4;
sbit led3=P1^5;
unsigned char code table[4]={0x06,0x5b,0x4f,0x3f};
void delay(unsigned k)
{
unsigned int i,j;
for(i=0;i<k;i++)
for(j=0;j<62;j++);
}
main()
{
while(1)
{
start:
P1_6=0;
if(K1==0)
{
delay(30);
if(K1==0)
{cs273=table[0];led1=0;led2=1;led3=1;while(1)if(RST==0){led1=1;led2=1;led3=1;cs273=table[3];goto start;}}
}
else if(K2==0)
{
delay(30);
if(K2==0)
{cs273=table[1];led1=1;led2=0;led3=1;while(1)if(RST==0){led1=1;led2=1;led3=1;cs273=table[3];goto start;}}
}
else if(K3==0)
{
delay(30);
if(K3==0)
{cs273=table[2];led1=1;led2=1;led3=0;while(1)if(RST==0){led1=1;led2=1;led3=1;cs273=table[3];goto start;}}
}
}
}
6. 跑马表
#include <reg51.h>
#include <absacc.h>
#define CS273 XBYTE[0xcfa0]
sbit SP1=P1^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char count,keycnt,second;
void delay(unsigned char i)
{ unsigned j;
for(i;i>0;i--)
for(j=62;j>0;j--);
}
void Timer0_INTI()
{
TMOD=0x01;
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
TR0=0;
ET0=1;
EA=1;
}
void Timer0() interrupt 1 using 0
{
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
count++;
if(count==100)
second++;
if(second==60)
second=0;
}
void main(void)
{
Timer0_INTI();
while(1)
{
CS273=table[second/10]; P1=0xFB;delay(1);
CS273=table[second%10]; P1=0xFD;delay(1);
if(SP1==0)
{
delay(5);
if(SP1==0)
{while(SP1==0);
keycnt++;
switch(keycnt)
{ case 1:
TR0=1;
break;
case 2:
TR0=0;
break;
case 3:
keycnt=0;
second=0;
break;
}
}
}
}
}
展开阅读全文