[单片机类] 蓝桥杯比赛中常用的模块代码

[复制链接]
1646|14
 楼主 | 2018-1-29 17:03 | 显示全部楼层 |阅读模式
本帖最后由 一路向北lm 于 2018-1-29 17:05 编辑

1.AT24C02  iic


#include <stc15f2k60s2.h>
#include "intrins.h"

sbit scl = P2^0;
sbit sda = P2^1;
void Snop()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 11;
        while (--i);
}


void i2c_start(void)
{
    sda = 1;
    scl = 1;
    Snop();
    sda = 0;
    Snop();
    scl = 0;   
}


void i2c_stop(void)
{
    sda = 0;
    scl = 1;
    Snop();
    sda = 1;
    Snop();      
}

void i2c_sendbyte(unsigned char byt)
{
    unsigned char i;
//
        EA = 0;
    for(i=0; i<8; i++){
        scl = 0;
        Snop();
        if(byt & 0x80){
            sda = 1;
        }
        else{
            sda = 0;
        }
        Snop();
        scl = 1;
        byt <<= 1;
        Snop();
    }
        EA = 1;
//
    scl = 0;  
}

unsigned char i2c_waitack(void)
{
        unsigned char ackbit;
        
    scl = 1;
    Snop();
    ackbit = sda; //while(sda);  //wait ack
    scl = 0;
    Snop();
        
        return ackbit;
}


unsigned char i2c_receivebyte(void)
{
        unsigned char da;
        unsigned char i;
//
        EA = 0;        
        for(i=0;i<8;i++){   
                scl = 1;
                Snop();
                da <<= 1;
                if(sda)
                        da |= 0x01;
                scl = 0;
                Snop();
        }
        EA = 1;
//
        return da;   
}


void i2c_sendack(unsigned char ackbit)
{
    scl = 0;
    sda = ackbit;  //0:发送应答信号;1:发送非应答信号
    scl = 1;
    Snop();
    scl = 0;
    Snop();
}


void delay1ms(unsigned char t)
{
        unsigned char i;
        
        while(t--){
                for(i=0; i<112; i++);
        }
}

void iic_write(unsigned char add,unsigned char dat)
{
    i2c_start();
    i2c_sendbyte(0xa0);
    i2c_waitack();
    i2c_sendbyte(add);
    i2c_waitack();
    i2c_sendbyte(dat);
    i2c_waitack();
    i2c_stop();
        delay1ms(30);
}


unsigned char iic_read(unsigned char add)
{
        unsigned char da;

        i2c_start();
        i2c_sendbyte(0xa0);
        i2c_waitack();
        i2c_sendbyte(add);
        i2c_waitack();
        i2c_start();
        i2c_sendbyte(0xa1);
        i2c_waitack();
        da = i2c_receivebyte();
        i2c_sendack(1);
        i2c_stop();
        
        return da;
}

#ifndef _I2C_H_
#define _I2C_H_
void delay1ms(unsigned char t);
void iic_write(unsigned char add,unsigned char dat);
unsigned char iic_read(unsigned char add);
#endif



IIC AT24c02.rar

872 Bytes, 下载次数: 25

 楼主 | 2018-1-29 17:07 | 显示全部楼层
本帖最后由 一路向北lm 于 2018-1-29 18:45 编辑

IIC PCF8591 ADC


#include<stc15f2k60s2.h>
#include"smg.h"
#include"i2c.h"
#include"ct107d.h"
extern void ConfigUART(unsigned int baud);
bit adcflag=0;
extern unsigned int key_sta;
void init_pcf8591()
{
  iic_start();
  iic_writebyte(0x90);
  iic_waitack();
  iic_writebyte(0x01);
  iic_waitack();
  iic_stop();
  delay1ms(10);
}
void main()
{
        EA=1;
        buzz_off();
        motor_off();
        led_off();
        Time_0_1ms();
        init_pcf8591();
        ConfigUART(115200);
        EX0=1;
        IT0=1;
        while(1)
        {
                if(adcflag)
                {
                        adcflag=0;
                        key_sta=(int)(adc_pcf8591()*100)/255*5;
                }
        }        
}
void interruptTime0() interrupt 1
{
        unsigned char i;
        i++;
        if(i==80)
        {
                i=0;
                adcflag=1;
        }
        smg_8();
        smg_buff();
}
void interruptUART() interrupt 4
{
        if(RI)
        {
                RI=0;
                SBUF=key_sta;
        }
        if(TI)
        TI=0;
}
void interruptEX0() interrupt 0
{
        RI=1;
        
}

ADC.rar

47.92 KB, 下载次数: 14

使用特权

评论回复
 楼主 | 2018-1-29 18:46 | 显示全部楼层
PCF8591  DAC
#include<stc15f2k60s2.h>
#include<intrins.h>
sbit sda=P2^1;
sbit scl=P2^0;
void Snop()
{
unsigned char i;

        _nop_();
        i = 11;
        while (--i);
}
void delay1ms(unsigned char t)
{
        unsigned char i;
          while(t--)
          {
            for(i=0;i<112;i++);
          }
}

void iic_start()
{
        sda=0;
        scl=1;
        sda=1;
        Snop();
        sda=0;
        Snop();
        scl=0;
                        
}
void iic_stop()
{
        sda=0;
        scl=0;
        scl=1;
        Snop();
        sda=1;
        scl=0;
}
void iic_ack()
{
        sda=1;
        Snop();
        scl=1;
        Snop();
        scl=0;
}
void iic_nack(bit ackbit)
{
        if(ackbit)
                sda=1;
        else
                sda=0;
        Snop();
        scl=1;
        Snop();
        scl=0;
        sda=1;
        Snop();        
}
void iic_writebyte(unsigned char da)
{
        unsigned char i;
        for(i=0;i<8;i++)
        {
               
                if(da&0x80)
                        sda=1;
                else
                        sda=0;
                Snop();
                scl=1;
                Snop();
                scl=0;
                da<<=1;

        }        
}
unsigned char iic_readbyte()
{
        unsigned char i,dat;
        for(i=0;i<8;i++)
        {
               
                dat<<=1;
                scl=1;
                Snop();
                dat|=sda;
                scl=0;
                Snop();
        }
        return dat;
}
void at24c02_write(unsigned char add,unsigned char dat)

{
        iic_start();
        iic_writebyte(0xa0);
        iic_ack();
        iic_writebyte(add);
        iic_ack();
        iic_writebyte(dat);
        iic_ack();
        iic_stop();
        delay1ms(30);
}
unsigned char at24c02_read(unsigned char add)
{
        unsigned char da;
        iic_start();
        iic_writebyte(0xa0);
        iic_ack();
        iic_writebyte(add);
        iic_ack();
        iic_start();
        iic_writebyte(0xa1);
        iic_ack();
        da=iic_readbyte();
        iic_nack(1);
        iic_stop();
        return da;
}
void dac_write()
{
        iic_start();
        iic_writebyte(0x90);
        iic_ack();
        iic_writebyte(0x40);
        iic_ack();               
}

#ifndef        _DAC_H_
#define _DAC_H_
unsigned char at24c02_read(unsigned char add);
void at24c02_write(unsigned char add,unsigned char dat);
void dac_write();
void iic_writebyte(unsigned char da);
void delay1ms(unsigned char t);
void iic_ack();
#endif


DAC.rar

50.07 KB, 下载次数: 22

使用特权

评论回复
 楼主 | 2018-1-29 18:52 | 显示全部楼层
本帖最后由 一路向北lm 于 2018-1-29 19:01 编辑

//DS18B20 温度传感器
#include<stc15f2k60s2.h>
#include<intrins.h>
sbit dq=P1^4;
void Delay500ms()                //@11.0592MHz
{
        unsigned char i, j, k;


        _nop_();
        _nop_();
        i = 22;
        j = 3;
        k = 227;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
void Delay500us()                //@11.0592MHz
{
        unsigned char i, j;


        _nop_();
        _nop_();
        i = 6;
        j = 93;
        do
        {
                while (--j);
        } while (--i);
}


void Delay120us()                //@11.0592MHz
{
        unsigned char i, j;


        _nop_();
        _nop_();
        _nop_();
        i = 2;
        j = 70;
        do
        {
                while (--j);
        } while (--i);
}
void Delay60us()                //@11.0592MHz
{
        unsigned char i, j;


        i = 1;
        j = 162;
        do
        {
                while (--j);
        } while (--i);
}
void Delay45us()                //@11.0592MHz
{
        unsigned char i;


        i = 122;
        while (--i);
}


void Delay15us()                //@11.0592MHz
{
        unsigned char i;


        i = 39;
        while (--i);
}




void Delay1us()                //@11.0592MHz
{
        _nop_();
        _nop_();
        _nop_();
}


bit int_ds18b20()
{
        bit ack;
        EA=0;
        dq=1;
        dq=0;
        Delay500us();
        dq=1;
        Delay120us();
        ack=dq;
        while(!dq);
        EA=1;
        return ack;
}
void write_ds18b20(unsigned char byte)
{
        unsigned char i;
        EA=0;
        for(i=0;i<8;i++)
        {
                dq=0;
                dq=byte&0x01;
                Delay60us();
                byte>>=1;
                dq=1;
                Delay1us();
        }
        EA=1;               
}
unsigned char read_ds18b20()
{
        unsigned char i,dat;
        EA=0;
        for(i=0;i<8;i++)
        {
                dq=0;
                dat>>=1;
                Delay1us();
                dq=1;
                Delay15us();
                if(dq)dat|=0x80;
                Delay45us();
        }
        EA=1;
        return dat;
}
void read_temp18b20(int *temp)
{
        unsigned char low,high;
        
        int_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0x44);
        Delay500ms();
        int_ds18b20();
        write_ds18b20(0xcc);
        write_ds18b20(0xbe);
        low=read_ds18b20();
        high=read_ds18b20();
        *temp=(int)(high<<8)+low;
}

ds18b20.rar

56.1 KB, 下载次数: 22

使用特权

评论回复
 楼主 | 2018-1-29 18:59 | 显示全部楼层
本帖最后由 一路向北lm 于 2018-1-29 19:00 编辑

LCD1602
#include <stc15f2k60s2.h>
#define LCD1602_DB P0
sbit LCD1602_RS = P2^0;
sbit LCD1602_RW = P2^1;
sbit LCD1602_E  = P1^2;
void LcdWaitReady()
{
    unsigned char sta;   
    LCD1602_DB = 0xFF;
    LCD1602_RS = 0;
    LCD1602_RW = 1;
    do {
        LCD1602_E = 1;
        sta = LCD1602_DB; //读取状态字
        LCD1602_E = 0;
    } while (sta & 0x80); //bit7等于1表示液晶正忙,重复检测直到其等于0为止
}
/* 向LCD1602液晶写入一字节命令,cmd-待写入命令值 */
void LcdWriteCmd(unsigned char cmd)
{
    LcdWaitReady();
    LCD1602_RS = 0;
    LCD1602_RW = 0;
    LCD1602_DB = cmd;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 向LCD1602液晶写入一字节数据,dat-待写入数据值 */
void LcdWriteDat(unsigned char dat)
{
    LcdWaitReady();
    LCD1602_RS = 1;
    LCD1602_RW = 0;
    LCD1602_DB = dat;
    LCD1602_E  = 1;
    LCD1602_E  = 0;
}
/* 设置显示RAM起始地址,亦即光标位置,(x,y)-对应屏幕上的字符坐标 */
void LcdSetCursor(unsigned char x, unsigned char y)
{
    unsigned char addr;
   
    if (y == 0)  //由输入的屏幕坐标计算显示RAM的地址
        addr = 0x00 + x;  //第一行字符地址从0x00起始
    else
        addr = 0x40 + x;  //第二行字符地址从0x40起始
    LcdWriteCmd(addr | 0x80);  //设置RAM地址
}
/* 在液晶上显示字符串,(x,y)-对应屏幕上的起始坐标,
   str-字符串指针,len-需显示的字符长度 */
void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str, unsigned char len)
{
    LcdSetCursor(x, y);   //设置起始地址
    while (len--)         //连续写入len个字符数据
    {
        LcdWriteDat(*str++);  //先取str指向的数据,然后str自加1
    }
}
/* 初始化1602液晶 */
void InitLcd1602()
{
    LcdWriteCmd(0x38);  //16*2显示,5*7点阵,8位数据接口
    LcdWriteCmd(0x0C);  //显示器开,光标关闭
    LcdWriteCmd(0x06);  //文字不动,地址自动+1
    LcdWriteCmd(0x01);  //清屏
}

lcd.rar

47.38 KB, 下载次数: 20

使用特权

评论回复
 楼主 | 2018-1-29 19:18 | 显示全部楼层
串口
#include<stc15f2k60s2.h>
#include"i2c.h"
extern unsigned char iic_n,iic_add;
extern bit flag_read;
void ConfigUART(unsigned int baud)
{
        SCON=0x50;
        AUXR|=0x10;
        T2L=(65536-(11059200/4/12)/baud);
        T2H=(65536-(11059200/12/4)/baud)>>8;
        ES=1;
}
void uart_writeByte(unsigned char dat)
{
        SBUF=dat;
        while(!TI);
        TI=0;       
}
void uart_write(unsigned char dat)//转化字符形式发送
{
        unsigned char j;
        unsigned char dat3[4];


                dat3[0]=dat/100%10;
                dat3[1]=dat/10%10;
                dat3[2]=dat%10;
                dat3[3]=',';




        for(j=0;j<4;j++)
        {
                switch(dat3[j])
                {
                        case 0:uart_writeByte('0');break;
                        case 1:uart_writeByte('1');break;
                        case 2:uart_writeByte('2');break;
                        case 3:uart_writeByte('3');break;
                        case 4:uart_writeByte('4');break;
                        case 5:uart_writeByte('5');break;
                        case 6:uart_writeByte('6');break;
                        case 7:uart_writeByte('7');break;
                        case 8:uart_writeByte('8');break;
                        case 9:uart_writeByte('9');break;
                        case ',':uart_writeByte(',');break;
                        default:break;
                }
        }          
}
void uart_read(unsigned char da)
{
        unsigned char dat3[3];
        static unsigned char i,k,dat,add;
        static bit tempread,tempwirte;
        switch(da)
        {
                case '0':dat3=0;i++;break;
                case '1':dat3=1;i++;break;
                case '2':dat3=2;i++;break;
                case '3':dat3=3;i++;break;
                case '4':dat3=4;i++;break;
                case '5':dat3=5;i++;break;
                case '6':dat3=6;i++;break;
                case '7':dat3=7;i++;break;
                case '8':dat3=8;i++;break;
                case '9':dat3=9;i++;break;
                case '-':tempread=1;break;
                case '+':tempwirte=1;break;
                default:break;
        }
        if(i==3&&tempwirte==1)
        {
               
                dat=dat3[0]*100+dat3[1]*10+dat3[2];
                if(k==0)
                add=dat;
                k=2;
                if(k==2)
                iic_write(add,dat);
                add++;
                tempwirte=0;
                i=0;
        }
        if(i==3&&tempread==1)
         {
                 dat=dat3[0]*100+dat3[1]*10+dat3[2];
               
                if(k==2)
                iic_add=dat;
                k=0;
                if(k==0)
                {
                  iic_n=dat;
                }




                flag_read=tempread;
                tempread=0;
                i=0;


         }

}




UART.rar

56.15 KB, 下载次数: 21

使用特权

评论回复
| 2018-1-30 17:19 | 显示全部楼层
要是记代码怕是要死哦,,,,看顺序写就好啦
多打几次,,就能熟练

使用特权

评论回复

评论

一路向北lm 2018-1-30 19:11 回复TA
的确 
| 2018-2-1 12:02 | 显示全部楼层
这个对于参赛者来说太有用了。

使用特权

评论回复
| 2018-10-19 15:20 | 显示全部楼层
良心版主

使用特权

评论回复
| 2018-10-31 13:29 | 显示全部楼层
我去,大神啊,再此多谢楼主

使用特权

评论回复
 楼主 | 2018-10-31 20:31 | 显示全部楼层
碧奥兰蒂 发表于 2018-10-31 13:29
我去,大神啊,再此多谢楼主

不客气的,继续努力

使用特权

评论回复
 楼主 | 2018-10-31 20:31 | 显示全部楼层

应该的

使用特权

评论回复
| 2018-11-3 09:29 | 显示全部楼层
给尽职的版主点赞。

使用特权

评论回复
| 2019-3-19 10:26 | 显示全部楼层
参加比赛的时候不是会给参考代码吗?

使用特权

评论回复
扫描二维码,随时随地手机跟帖
*滑动验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖