【单片机】代码说明合集

数据类型说明符

//数据类型说明符
typedef unsigned int WORD;
#define BYTE unsigned char
BYTE a1 = 0x12;
WORD a2 = 0x1234;

宏定义

//宏定义
#define CBYTE((unsigned char volatitle*) 0x50000L)
#define DBYTE((unsigned char volatitle*) 0x40000L)
#define BYTE unsigned char

指针

//指针
#define uchar unsigned char /*定义符号uchar为数据类型符unsigned char*/
#define uint unsigned int /*定义符号uint为数据类型符unsigned int*/
void func(void)
{
    uchar data var1;
    uchar pdata *dp1;       /*定义一个指向pdata区的指针dp1*/
    uint xdata *dp2;        /*定义一个指向xdata区的指针dp2*/
    uchar data *dp3;        /*定义一个指向data区的指针dp3*/

    dp1 = 0x30;             /*dp1指针赋值,指向pdata区30H单元*/
    dp2 = 0x1000;           /*dp2指针赋值,指向xdata区1000H单元*/
    *dp1 = 0xff;            /*将数据0xff送到片外RAM30H单元*/
    *dp1 = 0x1234;          /*将数据0x1234送到片外RAM1000H单元*/
    dp3 = &var1;            /*变量var1的地址送指针变量dp3*/
    *dp3 = 0x20;            /*通过指针dp3给变量var1赋值0x20*/
}

扩展关键字“at

//扩展关键字“_at_”
#define uchar unsigned char     /*定义符号uchar为数据类型符unsigned char*/
#define uint unsigned int       /*定义符号uint为数据类型符unsigned int*/
data uchar x1_at_0x40;          /*在data区中定义字节变量x1,它的地址为40H*/
xdata uint x2_at_0x2000;        /*在xdata区中定义字节变量x2,它的地址为2000H*/
void main(void)
{
    x1 = 0xff;
    x2 = 0x1234;
    while(1);
}

中断函数

//中断函数
interrupt m
m = 0; //外部中断0
m = 1; //定时/计数器中断T0
m = 2; //外部中断1
m = 3; //定时/计数器中断T1
m = 4; //串行口中断

使用寄存器组

//使用寄存器组
using m
n = 0; //第0组工作寄存器
n = 1; //第1组工作寄存器
n = 2; //第2组工作寄存器
n = 3; //第3组工作寄存器

计数器,中断方式

//计数器,中断方式
#include <absacc.h>
sbit P1_0=P1^0;     //定义P1.0口
void main()
{
    TMOD = 0x02;    //T0的M1置位1,开启工作方式2
    TH0 = 0x06;     //计算所得
    TL0 = 0x06;     //计算所得
    EA = 1;         //EA=1访问片内程序存储器
    ET0 = 1;        //ET0=1定时/计数器T0溢出中断允许控制位
    TR0 = 1;        //TR0=1定时/计数器T0启动位
    while(1);
}
//中断服务程序
void time0_int(void) interrupt 1
{
    P1_0 = !P1_0;
}

计数器,查询方式

//计数器,查询方式
#include <absacc.h>
sbit P1_0=P1^0;     //定义P1.0口
void main()
{
    TMOD = 0x02;    //T0的M1置位1,开启工作方式2
    TH0 = 0x06;     //计算所得
    TL0 = 0x06;     //计算所得
    TR0 = 1;        //TR0=1定时/计数器T0启动位
    for(;;)
    {
        if(TF0)     //定时/计数器T0的溢出标志位
        {
            TF0 = 0;//定时/计数器T0的溢出标志位置0
            P1_0 = !P1_0;
        }
    }
}

寄存器R2计数,中断处理

//寄存器R2计数,中断处理
#include <absacc.h>
sbit P1_1=P1^1;     //定义P1.1口
char i;
void main()
{
    TMOD = 0x01;    //T0的M0置位1,开启工作方式1
    TH0 = 0xD8;     //计算所得
    TL0 = 0xF0;     //计算所得
    EA = 1;         //EA=1访问片内程序存储器
    ET0 = 1;        //ET0=1定时/计数器T0溢出中断允许控制位
    i = 0 ;         //相当于寄存器R2
    TR0 = 1;        //TR0=1定时/计数器T0启动位
    while(1);
}
//中断服务程序
void time0_int(void) interrupt 1
{
    TH0 = 0xD8;     //计算所得
    TL0 = 0xF0;     //计算所得
    i ++;           //中断一次自加一次
    if(i == 50)     //要计数50次
    {
        P1_1 = !P1_1;
    }
}

T1计数器,T0/T1都是中断方式工作

//T1计数器,T0/T1都是中断方式工作
#include <absacc.h>
sbit P1_1=P1^1;     //定义P1.1口
sbit P3_5=P3^5;     //定义P3.5口
void main()
{
    //T1计数且工作方式2,T0定时且工作方式1
    TMOD = 0x61;    //0110 0001

    TH0 = 0xD8;     //计算所得
    TL0 = 0xF0;     //计算所得

    TH1 = 0xE7;     //计算所得
    TL1 = 0xE7;     //计算所得
    EA = 1;         //EA=1访问片内程序存储器
    ET0 = 1;        //ET0=1定时/计数器T0溢出中断允许控制位
    ET1 = 1;        //ET1=1定时/计数器T1溢出中断允许控制位
    TR0 = 1;        //TR0=1定时/计数器T0启动位
    TR1 = 1;        //TR1=1定时/计数器T1启动位
    while(1);
}
//T0中断服务程序
void time0_int(void) interrupt 1
{
    TH0 = 0xD8;     //计算所得
    TL0 = 0xF0;     //计算所得
    P3_5 = !P3_5;
}
//T1中断服务程序
void time1_int(void) interrupt 3
{
    P1_0 = !P1_0;
}

双机通讯,T1工作方式2且定时

//双机通讯,T1工作方式2且定时
#include <absacc.h>
void main()
{
    unsigned char i;
    SP = 0x60;      //堆栈指针
    SCON = 0x50;    //串行口寄存器SCON位的确定0101 0000
    TMOD = 0x20;    //方式寄存器TMOD位的确定0010 0000
    TH1 = 0xE6;     //计算所得
    TL1 = 0xE6;     //计算所得
    EA = 1;         //EA=1访问片内程序存储器
    ES = 1//串行口中断允许控制位
    TR1 = 1;        //TR1=1定时/计数器T1启动位
    while(1)        //发送模块
    {
        P1 = 0xFF;
        i = P1;
        SBUF = i;
        while(TI == 0);  //TI停止位开始发送时硬件置位
        TI = 0;
    }
}
//接收,4表示串行口中断
void funins(void) interrupt 4
{
    EA = 0;         //EA=0访问外部程序存储器
    RI = 0;         //当接收有效,由硬件置位
    P2 = SBUF;
    EA = 1;         //EA=1访问片内程序存储器
}

利用外部中断统计外部事件的次数

//利用外部中断统计外部事件的次数
#include <absacc.h>
#define uchar unsigned char
uchar a = 0x00;     //定义计数器,初值为0
void main()
{
    IE = 0x81;      //开总中断,开外部中断0中断
    IT0 = 1//设外部中断0位边沿触发方式,下降沿触发
    P2 = 0;         //P2口清零
    while(1);
}
//外部中断0中断函数
void int0(void) interrupt 0
{
    a += 1;         //计数器加1
    P2 = a;         //送P2口输出
}

数码管动态显示:60进制轮播

//数码管动态显示:60进制轮播
#include <reg51.h>
#include <absacc.h>

#define uchar unsigned char
#define com8255 XBYTE[0xff23] //宏定义口地址
#define pa8255 XBYTE[0xff20]
#define pb8255 XBYTE[0xff21]
//共阳
uchar code table[20] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 
						0x82, 0xF8, 0x80, 0x90, 0x88, 0x83, 
						0xC6, 0xA1, 0x86, 0x8E, 0xFF, 0x0C, 
						0x89, 0xDE};//0123456789
uchar code wei[] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x01};

void delay(unsigned int i)
{
	unsigned int j, k;
	for (k = 0; k < i; k++)
	{
		for (j = 0; j < 100; j++);
	}
}

void main(void)
{
	uchar m = 0;
	com8255 = 0x80; //控制口赋值
	pa8255 = 0x00;	//PA初始化
	pb8255 = 0x00;	//PB口初始化
	delay(2);

	while (1)
	{
		unsigned int j = 0;
		while (j < 150)
		{
			pb8255 = table[m % 10];
			pa8255 = ~wei[5];
			delay(2);
			pb8255 = table[m / 10];
			pa8255 = ~wei[4];
			delay(2);
			j++;
		}
		m++;
		if (m == 60)
		{
			m = 0;
		}
	}
}

数码管动态显示:定时器T1,20ms检查一次

//数码管动态显示:定时器T1,20ms检查一次
//分析:用定时器T1工作于方式1实现20ms周期性定时,20ms定时到调用显示函数一遍,定时器方式控制字为10H,系统时钟为12MHz,初值为:65536-20000
#include <reg51.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void delay(uint i)//定义延时函数
{
    for (uint j = 0; j < i; j++);
}
void display(void)//定义显示函数
{
    uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
                           0x66, 0x6D, 0x7D, 0x07,
                           0x7F, 0x6F, 0x77, 0x7C,
                           0x39, 0x5E, 0x79, 0x71};//共阴极0~F的字段码表
    uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; //ll位选码表
    uchar i, p, temp;
    for (i = 0; i < 8; i++)
    {
        temp = chocode[i];   //取当前的位选码
        P2 = temp;           //送出位选码
        p = disbuffer[i];    //取当前显示的字符
        temp = codevalue[p]; //查得显示字符的字段码
        P0 = temp;           //送出字段码
        delay(20);           //延时1ms
    }
}
void main(void)
{
    TH1 = (65536 - 20000) / 256;
    TL1 = (65536 - 20000) % 256;
    EA = 1;         //EA=1访问片内程序存储器
    ET1 = 1;        //ET1=1定时/计数器T1溢出中断允许控制位
    TR1 = 1;        //TR1=1定时/计数器T1启动位
    while (1);
}
void time1(void) interrupt 3 //定时/计数器T1中断
{
    TH1 = (65536 - 20000) / 256;
    TL1 = (65536 - 20000) % 256;
    display(); //设显示函数
}

独立式键盘

//独立式键盘
#include <reg51.h>
#define uchar unsigned char
//定义变量
sbit K0 = P1 ^ 0;
sbit K1 = P1 ^ 1;
sbit K2 = P1 ^ 2;
sbit K3 = P1 ^ 3;
sbit D0 = P2 ^ 0;
sbit D1 = P2 ^ 1;
sbit D2 = P2 ^ 2;
sbit D3 = P2 ^ 3;
//定义延时函数
void delay(uchar k)
{
    uchar i, j;
    for (i = 0; i < k; i++)
    {
        for (j = 0; j < 250; j++);
    }
}
void main()
{
    if (K0 == 0){delay(10);if (K0 == 0)D0 = 0;}//消除抖动
    if (K1 == 0){delay(10);if (K1 == 0)D1 = 0;}//消除抖动
    if (K2 == 0){delay(10);if (K2 == 0)D2 = 0;}//消除抖动
    if (K3 == 0){delay(10);if (K3 == 0)D3 = 0;}//消除抖动
}

矩阵式键盘

//矩阵式键盘
#include <reg51.h>
#include <absacc.h> //定义绝对地址访问
#define uchar unsigned char
#define uint unsigned int
void delay(uint);   //声明延时函数
void display(uint); //声明显示函数
uchar checkkey();
uchar keyscan(void);
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //定义显示缓冲区
void main(void)
{
    uchar key;
    while (1)
    {
        key = keyscan();
        if (key != 0xFF)
        {
            disbuffer[0] = disbuffer[1];
            disbuffer[1] = disbuffer[2];
            disbuffer[2] = disbuffer[3];
            disbuffer[3] = disbuffer[4];
            disbuffer[4] = disbuffer[5];
            disbuffer[5] = disbuffer[6];
            disbuffer[6] = disbuffer[7];
            disbuffer[7] = key;
        }
        display(); //设显示函数
    }
}
//延时函数
void delay(uint i)
{
    uint j;
    for (j = 0; j < i; j++)
        ;
}
//显示函数
void display(void)
{
    uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
                           0x66, 0x6D, 0x7D, 0x07,
                           0x7F, 0x6F, 0x77, 0x7C,
                           0x39, 0x5E, 0x79, 0x71};                      //共阴极0~F的字段码表
    uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}; //ll位选码表
    uchar i, p, temp;
    for (i = 0; i < 8; i++)
    {
        temp = chocode[i];   //取当前的位选码
        P2 = temp;           //送出位选码
        p = disbuffer[i];    //取当前显示的字符
        temp = codevalue[p]; //查得显示字符的字段码
        P0 = temp;           //送出字段码
        delay(20);           //延时1ms
    }
}
//检测有无键按下函数
uchar checkkey() //有则返回0,无则返回0xFF
{
    uchar i;
    P3 = 0xF0;
    i = P3;
    i = i | 0xF0;
    if (i == 0xFF)
    {
        return 0xFF;
    }
    else
    {
        return 0;
    }
}
//键盘扫描函数
uchar keyscan() //若有键按下则返回按键编码,若无键按下则返回0xFF
{
    uchar scancode;  //定义 列 扫描码变量
    uchar codevalue; //定义返回的编码变量
    uchar m;         //定义行首编码变量
    uchar k;         //定义行检测码
    uchar i, j;
    if (checkkey() == 0xFF)
        return 0xFF; //检测有无按键按下,无返回0xFF
    else
    {
        delay(20);
        if (checkkey() == 0xFF)
        {
            return 0xFF; //f防止抖动
        }
        else
        {
            scancode = 0xEF; //列扫描码,首行码赋初值
            for (i = 0; i < 4; i++)
            {
                k = 0x01;
                P3 = scancode; //送列扫描码
                m = 0x00;
                for (j = 0; j < 4 j++)
                {
                    if ((P3 & K) == 0) //检测当前行是否有按键按下
                    {
                        codevalue = m + i; //按下,求编码
                        while (checkkey() != 0xFF); //等待键位释放
                    }
                    else
                    {
                        k = k << 1 m = m + 4;
                    }
                }
                scancode = scancode << 1;
                scancode++;
            }
        }
        return codevalue;
    }
}

D/A转换

//D/A转换,设DAC0832的地址为OxFF80
#include <absacc.h>
#define uchar unsigned char
#define DAC0832 XBYTE[0xFF80]
void delay(void)
{
	uchar i;
	for (i = 0; i < 0xFF; i++);
}
void main()
{
	uchar i;
	uchar n = 1000;
	while (1)
	{
		while (n > 0)
		{
			for (i = 0; i < 0xFF; i++)	DAC0832 = i;//锯齿波
			n--;
		}
		n = 1000;
		while (n > 0)
		{
			for (i = 0; i < 0xFF; i++)	DAC0832 = i;//三角波上
			for (i = 0xFF; i > 0; i--)	DAC0832 = i;//三角波下
			n--;
		}
		n = 1000;
		while (n > 0)
		{
			DAC0832 = 0;//方波下
			delay();
			DAC0832 = 0xFF;//方波上
			delay();
			n--;
		}
		n = 1000;
	}
}

A/D转换

//A/D转换
#include <absacc.h>
#include <stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define AD XBYTE[0xFF80]
#define com8255 XBYTE[0xff23] //宏定义口地址
#define pa8255 XBYTE[0xff20]
#define pb8255 XBYTE[0xff21]
uchar code table[20] = {0xC0, 0xF9, 0xA4, 0xB0,
						0x99, 0x92, 0x82, 0xF8,
						0x80, 0x90, 0x88, 0x83,
						0xC6, 0xA1, 0x86, 0x8E,
						0xFF, 0x0C, 0x89, 0xDE};
uchar code wei[6] = {0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
uint i, temp, digit;
void delay(int x) 	//延时函数
{
	while (x--);
}
void show(uint num) //显示数字
{
	temp = num;
	digit = 0;
	if (temp == 0)
	{
		pb8255 = table[temp % 10];
		pa8255 = ~wei[5 - digit];
	}
	else
	{
		while (temp)
		{
			pb8255 = table[temp % 10];
			pa8255 = ~wei[5 - digit];
			temp /= 10;
			digit++;
			delay(1000);
		}
	}
}
void main()
{
	com8255 = 0xFF80; //控制口赋值
	pa8255 = 0xFF00;  //PA初始化
	pb8255 = 0xFF00;  //PB口初始化
	while (1)
	{
		AD = 0XFF80;
		show(AD);
		delay(100);
	}
}

数码管动态显示

//动态显示
void delay(uint x);                            //声明延时函数
void display(void);                            //声明显示函数
uchar disbuffer[8] = {0, 1, 2, 3, 4, 5, 6, 7}; //定义显示缓冲区
void main(void)
{
    while (1)  display(); //设显示函数
}
void delay(uint i) //延时函数
{
    uint j;
    for (j = 0; j < i; j++);
}
//显示函数
void display(void)
{
    uchar codevalue[16] = {0x3F, 0x06, 0x5B, 0x4F,
                           0x66, 0x6D, 0x7D, 0x07,
                           0x7F, 0x6F, 0x77, 0x7C,
                           0x39, 0x5E, 0x79, 0x71};//共阴极0~F的字段码表
    uchar chocode[8] = {0xFE, 0xFD, 0xFB, 0xF7, 
                        0xEF, 0xDF, 0xBF, 0x7F}; //ll位选码表
    uchar i, p, temp;
    for (i = 0; i < 8; i++)
    {
        temp = chocode[i];   //取当前的位选码
        P2 = temp;           //送出位选码
        p = disbuffer[i];    //取当前显示的字符
        temp = codevalue[p]; //查得显示字符的字段码
        P0 = temp;           //送出字段码
        delay(20);           //延时1ms
    }
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码两年半的练习生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值