单片机 c语言例题
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PC口地址(PC8155):FEFBH
#include “reg51.h”
#include “absacc.h”
#define COM8155 XBYTE[0xfef8]
#define PA8155 XBYTE[0xfef9]
void delay(void)/*延时1ms*/
{
TMOD=0X01
TH0=(65536-500)/256;
{
char x,i;
P1=0xff;
loop:x=P1;
x=x&0x0f;
if(x==0f)goto loop;
for(i=0;i<10;i++)/*延时10ms去抖动*/
{delay();}
x=P1;
x=x&0x0f;
if(x==0f)goto loop;
switch(x)
{
case 0x0E:PBYTE[0x20]= PBYTE[0x20]+1;break;/*20单元加1*/
char dis_dat[4];
void delay(void)/*延时1ms*/
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
void disp(char ch1)/*显示函数*/
{ static char ch=0x01;
#include “intrins.h”
sbit p10=P1^0;
void delay(void)
{
int a=5000;
while(a--)_nop_();
}
void int_srv(void)interrupt 0 using 1
{
delay();
if(INT0==0)
{P10=~P10;while(INT0==0);}
•void main()
•{unsigned int i,j,a;
•unsigned char *add0 ;
•add0=0x30;
•for(i=0;i<10;i++)
•{*(add0+i)=taຫໍສະໝຸດ Baidu[i];}
•for(i=0;i<10;i++)
•{for(j=i+1;j<10;j++)
•{if(*(add0+i)>*(add0+j))
•{a=*(add0+j);
•*(add0+j)=*(add0+i);
•*(add0+i)=a;}
•}
•}
•while(1) ;
•
•}
5:外部中断0引脚(P3.2)接一个开关,P1.0接一个发光二极管。开关闭合一次,发光二极管改变一次状态。
本例解决外部中断如何应用。
#include “reg51.h”
TL0=(65536-12500)%256;
ET0=1;
EA=1;
TR0=1;
while(1);
}
void T0_srv(void)interrupt 1 using 1
{
TH0=(65536-12500)/256;
TL0=(65536-12500)%256;
P10=~P10;
}
7.设晶振频率为6MHZ,要求在单片机的P2.7口上输出周期为1秒的连续方波信号,
#include “reg51.h”
#include “absacc.h”
void delay(void)/*延时1ms*/
{
TMOD=0X01
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
main()
for(i=0;i<500;i++)/*点亮0.5秒*/
{delay();}
disp_word= disp_word<<1;/*左移控制字,准备点亮下一位*/
if(disp_word==0)disp_word=0x01;
} whlie(1);
}
9:独立键盘,用C语言实现。
•如图所示,P1.0~P1.3分别接开关S1~S4。S1按下时使外部20H单元内容加1;S2按下时使外部20H单元内容减1;S3按下时使外部20H单元内容清零;S4按下时使外部20H单元内容全1。用C51编程实现该功能,要求有10ms去抖动功能。系统晶振12MHZ
•TL0=(65536-25000)%256;
•TR0=1;
•while(1);
•}
•void Time0(void) interrupt 1 using 0
•{
•Countor++;
•if(Countor==10)
•{ D1=~D1;
•Countor=0;
•}
•TH0=(65536-25000)/256;
•TL0=(65536-25000)%256;
•}
8:如图所示,单片机扩展可编程接口芯片8155,8155PA口控制8只发光二极管,形成走马灯,每位点亮的时间为0.5秒。单片机晶振为6 MHZ
8155的端口地址如下:
命令口地址(COM8155):FEF8H
PA口地址(PA8155):FEF9H
PB口地址(PB8155):FEFAH
•#define min XBYTE [0x1001]
•unsigned char tab[]={72,27,18,29,26,63,112,98,12,6};
•void main()
•{unsigned int i,add=0x40;
•for(i=0;i<10;i++)
•{XBYTE[add+i]=tab[i];
用定时器中断方式定时,请用C语言编程实现该功能。
•#include<reg51.h>
•sbit D1=P2^7;
•unsigned char Countor;
•void main(void)
•{
•EA=1;
•ET0=1;
•TMOD=0X01;
•TH0=(65536-25000)/256; //定时50ms
case 0x0D:PBYTE[0x20]= PBYTE[0x20]-1;break;/*20单元减1*/
case 0x0B:PBYTE[0x20]= 0x00;break;/*20单元清0*/
case 0x07:PBYTE[0x20]= 0xff;/*20单元置全1*/
}
goto loop;
}
•10.设晶振频率为6MHZ,一个共阳数码管的各段接P2口,公共端接VCC。希望在数码管上显示0~9计数,一秒钟数字加1,一秒时间用定时器0定时实现,请用C语言编程实现该功能。共阳数码管0~9的段码表为:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90。
}
void main()
{ P10=0;
IT0=1
EA=1;
EX0=1;while(1);
}
6:从P1.0输出方波信号,周期为50ms。设单片机的focs=6MHz。
本例解决定时器及其中断的应用。
#include “reg51.h”
void main()
{
TMOD=0x01;
TH0=(65536-12500)/256;
•}
•while(1);
•}
4.设有一组数据{12,34,76,54,23,87,14,62,19,6},被定义在内部数据存储器中,用C51编程,先将其拷贝到内部数据存储器30H开始单元中,然后将其从小到大排序。
•#include<reg51.h>
•#include<absacc.h>
•unsigned char tab[]={12,34,76,54,23,87,14,62,19,6};
•#include<reg51.h>
•#include<absacc.h>
•unsigned char tab[]={0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90};
•void main()
•{unsigned int i,add0=0x40;
•unsigned char addx=0;
•Countor=0;
•}
•}
11.动态共阴显示,用C语言实现。单片机晶振为6MHZ
#include “reg51.h”
#include “intrins.h”
char code dispdata[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
•}
•max=XBYTE[add];
•min=XBYTE[add];
•for(i=0;i<10;i++)
•{if(XBYTE[add+i]>max)
•{max=XBYTE[add+i];}
•if(XBYTE[add+i]<min)
•{min=XBYTE[add+i];}
•}
•while(1);
•}
•2.设有一组数据{0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90},被定义在内部数据存储器中,用C51编程,将其拷贝到外部数据存储器中,并求其累加和从P1口输出。
•for(i=0;i<10;i++)
•{XBYTE[add0+i]=tab[i];
•addx+= tab[i];
•}
•P1=addx;
•while(1) ;
•
•}
3.设有一组数据{0x6a,0x12,0x4d,0x51,0xc9},被定义在内部数据存储器中,用C51编程,分别将其转换成ASCII并存储到外部数据存储器0050H开始的单元中。
•unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
•void main()
•{ unsigned char i=0;
•unsigned char Countor;
•TMOD=0x01;
•TH0=(65536-25000)/256;
P1=ch;/*送位码
P2=dispdata[dis_dat[ch1]];
ch=ch<<1;
if(ch==0x10)ch=0x01;
}
main()
{ char ch1;
TMOD=0x01;
while(1)
{
for(ch1=0;ch1<4;ch1++)/*对四位LED扫描一遍*/
{disp(ch1);
•unsigned char Countor1; //设置全局变量,存储定时器T1中断次数
•unsigned char Countor2; //设置全局变量,存储定时器T1中断次数
•void main(void)
delay();
}
delay();
delay();
}
}
•12.设晶振频率为12MHZ,用定时器T1中断控制两个LED以不同周期闪烁,用C语言编程实现该功能。
•#include<reg51.h>
•sbit D1=P2^0; //将D1位定义为P2.0引脚
•sbit D2=P2^1; //将D2位定义为P2.1引脚
•1.设有一组数据{72,27,18,29,26,63,112,98,12,6},被定义在内部数据存储器中,用C51编程,将其拷贝到外部数据存储器中,并分别找出最大数与最小数存入外部数据存储器的max和min单元。
•#include<reg51.h>
•#include<absacc.h>
•#define max XBYTE [0x1000]
TL0=(65536-500)%256;
TR0=1;
while(~TF0);
TF0=0;
TR0=0;
}
main()
{
unsigned int i;
char disp_word=0x01;/*从第1位开始点亮*/
COM8155=0x01;/*初始化8155*/
do {
PA8155= disp_word;/*输出去点亮一位*/
•#include<reg51.h>
•#include<absacc.h>
•#define dy 0x50
•unsigned char a[]={0x6a,0x12,0x4d,0x51,0xc9};
•void main()
•{unsigned char i,j;
•for(j=0;j<5;j++)
•{
•TL0=(65536-25000)%256; //定时50ms,1s=20*50ms
•TR0=1;
•Countor=0;
•while(1)
•{Countor++;
•while(TF0==0);
•TF0=0;
•if(Countor==20)
•{ P2=Tab[i];
•i++;
•if(i>9) i=0;
•i=a[j]/16;
•if(i<10)
•{XBYTE[dy+2*j]=0x30+i;}
•else {XBYTE[dy+2*j]=0x37+i;}
•i=a[j]%16;
•if(i<10)
•{XBYTE[dy+2*j+1]=0x30+i;}
•else {XBYTE[dy+2*j+1]=0x37+i;}
#include “reg51.h”
#include “absacc.h”
#define COM8155 XBYTE[0xfef8]
#define PA8155 XBYTE[0xfef9]
void delay(void)/*延时1ms*/
{
TMOD=0X01
TH0=(65536-500)/256;
{
char x,i;
P1=0xff;
loop:x=P1;
x=x&0x0f;
if(x==0f)goto loop;
for(i=0;i<10;i++)/*延时10ms去抖动*/
{delay();}
x=P1;
x=x&0x0f;
if(x==0f)goto loop;
switch(x)
{
case 0x0E:PBYTE[0x20]= PBYTE[0x20]+1;break;/*20单元加1*/
char dis_dat[4];
void delay(void)/*延时1ms*/
{
TH0=(65536-500)/256;
TL0=(65536-500)%256;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
void disp(char ch1)/*显示函数*/
{ static char ch=0x01;
#include “intrins.h”
sbit p10=P1^0;
void delay(void)
{
int a=5000;
while(a--)_nop_();
}
void int_srv(void)interrupt 0 using 1
{
delay();
if(INT0==0)
{P10=~P10;while(INT0==0);}
•void main()
•{unsigned int i,j,a;
•unsigned char *add0 ;
•add0=0x30;
•for(i=0;i<10;i++)
•{*(add0+i)=taຫໍສະໝຸດ Baidu[i];}
•for(i=0;i<10;i++)
•{for(j=i+1;j<10;j++)
•{if(*(add0+i)>*(add0+j))
•{a=*(add0+j);
•*(add0+j)=*(add0+i);
•*(add0+i)=a;}
•}
•}
•while(1) ;
•
•}
5:外部中断0引脚(P3.2)接一个开关,P1.0接一个发光二极管。开关闭合一次,发光二极管改变一次状态。
本例解决外部中断如何应用。
#include “reg51.h”
TL0=(65536-12500)%256;
ET0=1;
EA=1;
TR0=1;
while(1);
}
void T0_srv(void)interrupt 1 using 1
{
TH0=(65536-12500)/256;
TL0=(65536-12500)%256;
P10=~P10;
}
7.设晶振频率为6MHZ,要求在单片机的P2.7口上输出周期为1秒的连续方波信号,
#include “reg51.h”
#include “absacc.h”
void delay(void)/*延时1ms*/
{
TMOD=0X01
TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
TR0=1;
while(!TF0);
TF0=0;
TR0=0;
}
main()
for(i=0;i<500;i++)/*点亮0.5秒*/
{delay();}
disp_word= disp_word<<1;/*左移控制字,准备点亮下一位*/
if(disp_word==0)disp_word=0x01;
} whlie(1);
}
9:独立键盘,用C语言实现。
•如图所示,P1.0~P1.3分别接开关S1~S4。S1按下时使外部20H单元内容加1;S2按下时使外部20H单元内容减1;S3按下时使外部20H单元内容清零;S4按下时使外部20H单元内容全1。用C51编程实现该功能,要求有10ms去抖动功能。系统晶振12MHZ
•TL0=(65536-25000)%256;
•TR0=1;
•while(1);
•}
•void Time0(void) interrupt 1 using 0
•{
•Countor++;
•if(Countor==10)
•{ D1=~D1;
•Countor=0;
•}
•TH0=(65536-25000)/256;
•TL0=(65536-25000)%256;
•}
8:如图所示,单片机扩展可编程接口芯片8155,8155PA口控制8只发光二极管,形成走马灯,每位点亮的时间为0.5秒。单片机晶振为6 MHZ
8155的端口地址如下:
命令口地址(COM8155):FEF8H
PA口地址(PA8155):FEF9H
PB口地址(PB8155):FEFAH
•#define min XBYTE [0x1001]
•unsigned char tab[]={72,27,18,29,26,63,112,98,12,6};
•void main()
•{unsigned int i,add=0x40;
•for(i=0;i<10;i++)
•{XBYTE[add+i]=tab[i];
用定时器中断方式定时,请用C语言编程实现该功能。
•#include<reg51.h>
•sbit D1=P2^7;
•unsigned char Countor;
•void main(void)
•{
•EA=1;
•ET0=1;
•TMOD=0X01;
•TH0=(65536-25000)/256; //定时50ms
case 0x0D:PBYTE[0x20]= PBYTE[0x20]-1;break;/*20单元减1*/
case 0x0B:PBYTE[0x20]= 0x00;break;/*20单元清0*/
case 0x07:PBYTE[0x20]= 0xff;/*20单元置全1*/
}
goto loop;
}
•10.设晶振频率为6MHZ,一个共阳数码管的各段接P2口,公共端接VCC。希望在数码管上显示0~9计数,一秒钟数字加1,一秒时间用定时器0定时实现,请用C语言编程实现该功能。共阳数码管0~9的段码表为:0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90。
}
void main()
{ P10=0;
IT0=1
EA=1;
EX0=1;while(1);
}
6:从P1.0输出方波信号,周期为50ms。设单片机的focs=6MHz。
本例解决定时器及其中断的应用。
#include “reg51.h”
void main()
{
TMOD=0x01;
TH0=(65536-12500)/256;
•}
•while(1);
•}
4.设有一组数据{12,34,76,54,23,87,14,62,19,6},被定义在内部数据存储器中,用C51编程,先将其拷贝到内部数据存储器30H开始单元中,然后将其从小到大排序。
•#include<reg51.h>
•#include<absacc.h>
•unsigned char tab[]={12,34,76,54,23,87,14,62,19,6};
•#include<reg51.h>
•#include<absacc.h>
•unsigned char tab[]={0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90};
•void main()
•{unsigned int i,add0=0x40;
•unsigned char addx=0;
•Countor=0;
•}
•}
11.动态共阴显示,用C语言实现。单片机晶振为6MHZ
#include “reg51.h”
#include “intrins.h”
char code dispdata[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
•}
•max=XBYTE[add];
•min=XBYTE[add];
•for(i=0;i<10;i++)
•{if(XBYTE[add+i]>max)
•{max=XBYTE[add+i];}
•if(XBYTE[add+i]<min)
•{min=XBYTE[add+i];}
•}
•while(1);
•}
•2.设有一组数据{0x21,0x34,0x91,0x01,0x65,0x87,0x98,0x31,0x63,0x90},被定义在内部数据存储器中,用C51编程,将其拷贝到外部数据存储器中,并求其累加和从P1口输出。
•for(i=0;i<10;i++)
•{XBYTE[add0+i]=tab[i];
•addx+= tab[i];
•}
•P1=addx;
•while(1) ;
•
•}
3.设有一组数据{0x6a,0x12,0x4d,0x51,0xc9},被定义在内部数据存储器中,用C51编程,分别将其转换成ASCII并存储到外部数据存储器0050H开始的单元中。
•unsigned char code Tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90} ;
•void main()
•{ unsigned char i=0;
•unsigned char Countor;
•TMOD=0x01;
•TH0=(65536-25000)/256;
P1=ch;/*送位码
P2=dispdata[dis_dat[ch1]];
ch=ch<<1;
if(ch==0x10)ch=0x01;
}
main()
{ char ch1;
TMOD=0x01;
while(1)
{
for(ch1=0;ch1<4;ch1++)/*对四位LED扫描一遍*/
{disp(ch1);
•unsigned char Countor1; //设置全局变量,存储定时器T1中断次数
•unsigned char Countor2; //设置全局变量,存储定时器T1中断次数
•void main(void)
delay();
}
delay();
delay();
}
}
•12.设晶振频率为12MHZ,用定时器T1中断控制两个LED以不同周期闪烁,用C语言编程实现该功能。
•#include<reg51.h>
•sbit D1=P2^0; //将D1位定义为P2.0引脚
•sbit D2=P2^1; //将D2位定义为P2.1引脚
•1.设有一组数据{72,27,18,29,26,63,112,98,12,6},被定义在内部数据存储器中,用C51编程,将其拷贝到外部数据存储器中,并分别找出最大数与最小数存入外部数据存储器的max和min单元。
•#include<reg51.h>
•#include<absacc.h>
•#define max XBYTE [0x1000]
TL0=(65536-500)%256;
TR0=1;
while(~TF0);
TF0=0;
TR0=0;
}
main()
{
unsigned int i;
char disp_word=0x01;/*从第1位开始点亮*/
COM8155=0x01;/*初始化8155*/
do {
PA8155= disp_word;/*输出去点亮一位*/
•#include<reg51.h>
•#include<absacc.h>
•#define dy 0x50
•unsigned char a[]={0x6a,0x12,0x4d,0x51,0xc9};
•void main()
•{unsigned char i,j;
•for(j=0;j<5;j++)
•{
•TL0=(65536-25000)%256; //定时50ms,1s=20*50ms
•TR0=1;
•Countor=0;
•while(1)
•{Countor++;
•while(TF0==0);
•TF0=0;
•if(Countor==20)
•{ P2=Tab[i];
•i++;
•if(i>9) i=0;
•i=a[j]/16;
•if(i<10)
•{XBYTE[dy+2*j]=0x30+i;}
•else {XBYTE[dy+2*j]=0x37+i;}
•i=a[j]%16;
•if(i<10)
•{XBYTE[dy+2*j+1]=0x30+i;}
•else {XBYTE[dy+2*j+1]=0x37+i;}