《单片机原理及应用》题库六
(程序分析)
程序2 电子秒表工作程序 void main() { TMOD=0x01;
//定时器T0工作在方式1 TH0=0xD8;
// T0装入时间常数
TL0=0xf0;
EA=1;
//允许 中断
ET0=1;
//允许 定时器T0中断
TR0=1;
//启动定时器T0
while(1)
//无条件循环
{
for(k=0;k
{
P0=b[k];
//送出数码管段码
P2=k;
//送出数码管位选码
delaym(3); //调用延时函数
} } } } time0_int(void) interrupt 1
//T0中断服务程序 {
TH0=0xD8;
TL0=0xF0;
i++;
if(i==100)
//到1秒
{
i=0;
second1++;
}
if(second1==10) //到10秒
{
second2++;
second1=0;
}
if(second2==10) //到100秒
{second3++;
second2=0;
second1=0;
}
b[2]=a[second3]; //转换为段码显示
b[1]=a[second2];
b[0]=a[second1];
} 程序3 电子时钟程序 void main() { TMOD=0x01;
//定时器T0工作在方式1 TH0=0xD8;
// T0延时长度延时10mS TL0=0xf0;
EA=1;
//允许中断
ET0=1;
//允许定时器T0中断 TR0=1; while(1) {
for(k=0;k
//显示时钟的分秒
{
P0=b[k];
P2=k;
delaym(3);
} } } time0_int(void) interrupt 1
//T0中断服务程序 {
TH0=0xD8;
TL0=0xF0;
i++;
if(i==100)
//到1秒
{
i=0;
second++;
}
if(second==60) //到1分钟
{second=0;
fen++;
}
w=fen/10;
x=fen%10;
y=second/10;
z=second%10;
b[4]=a[w];
//显示分十位段码
b[3]=a[x];
//显示分个位段码
b[2]=0xbf;
//数码管显示“-”
b[1]=a[y];
//显示秒十位段码
b[0]=a[z];
//显示秒个位段码
}
程序4
矩阵式按键扫描,读取按键的行列编码。 unsigned char Keycan(void) {
unsigned char rcode, ccode;
P1 = 0xF0;
// P1口对键盘输出 键盘扫描信号
if((P1&0xF0) != 0xF0)
{
delay(1);// 调用岩石函数函数实现软件去抖动
if((P1&0xF0) != 0xF0)
//如果不相等说明 有键按下
{ rcode = 0xFE;
// 逐行扫描初值
while((rcode&0x10) != 0)
{
P1 = rcode;
// 输出行扫描码
if((P1&0xF0) != 0xF0) //
{
ccode = (P1&0xF0)|0x0F; //取入列代码
//do{;}
while((P1&0xF0) != 0xF0); //等待键释放
return ((~rcode) + (~ccode)); // 返回
}
else
rcode = (rcode
}
}
return 0; // 无键按下,返回
} 程序6 从计算机键盘输入月份,通过计算机串口显示相应的日子。#include
//包含8952单片机头文件 #include
//包含计算机串口头文件 #define uint unsigned int void main() { uint month; uint day; SCON=0x50;
//串行口工作在方式1,允许接收。
TMOD=0x20; //定时器1工作在方式2
TCON=0x40; TH1=0xE8;
//装入波特率对应的时间常数
TL1=0xE8; TI=1; TR1=1;
}
printf(\"input month\\n\");//要求输入月份
scanf(\"%d\",&month); //读取键盘输入的月份数值。
switch(month) //查阅月份
{ case 1: case 3: case 5: case 7: case 8: case 10: case 12:day=31; //
1、
3、
5、
7、
8、
10、12上显示31日
break; case 4: case 6: case 9: case 11:day=30; //
4、
6、
9、11显示30日
break; case 2:day=28; //2月份显示28日
break; default:day=1; //都不是,日期1
} printf(\"month,has day\\n\",&month,&day); //在屏幕上显示对应月份的日期
}
程序8 数码显示程序 unsigned char b[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e,0xff}; 数码管段码,加1个全灭段码
unsigned char c[8]; //规定显示段码数组为8
void display()
{ unsigned char i;
for(i=0;i
{
P0=c[i]; //送出段码
P2=i; //送出位选码
delay(2);
} } 程序96 串口接收程序
#include
//16个
#define uchar unsigned char uchar idata buf[8]; main() { uchar i; SCON= 0x50;
//规定串口工作方式1,允许接收。
,
PCON=0;
//SMOD=0 TMOD= 0x20;
//定时器1 工作在定时方式2
TH1= 0xe6;
//12MHz 1200波特率 TL1= 0xe6; TR1= 1;
//启动钉子定时器1
while(1)
//不断接收数据 { for (i=0;i
{
while( RI==0)
//查询接收一帧数据完毕否
RI=0;
buf[i]=SBUF;
//从串口接收数据存入数组 buf[]
} } } 程序10 串口发送程序,发送89S51 #include #define uchar unsigned char #define uint unsigned int uchar idata trdata[]={\'8\',\'9\',\'S\',\'5\',\'1\',0x0d,0x0a,0x00}; main() { uchar i;
uint j; SCON= 0x40;
//规定串口工作在方式1,发送数据
PCON=0;
//SMOD=0 TMOD= 0x20;
//定时器1工作在方式2
TH1= 0xe6;
//12MHz 1200波特率 TL1= 0xe6; TR1= 1;
//启动定时器1
while(1)
//不断发送数据
{
i=0;
while(trdata[i]!=0x00)
//00结束 { SBUF=trdata[i];
//将数据送到串口发送器SBUF
while(TI==0);
TI=0;
i++;
}
for (j=0;j
} } //延时8μS×50000 =0.4秒