这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » goodboy3021 MCU DIY进程帖

共53条 4/6 |‹ 1 2 3 4 5 6 跳转至
专家
2011-12-11 20:47:23     打赏
31楼
真是不错,得表扬一个!!!

专家
2011-12-12 07:23:29     打赏
32楼

谢谢斑竹支持!

DS18B20实验,数码管显示温度,保留一位小数,温度超过30蜂鸣器有报警噢:



简单程序:
#include<STC12C5A60S2.H> //头文件
#include <string.h>
#include "INTRINS.H"
sbit speaker   = P1^0;//扬声器
unsigned char  leddisplay[8] ={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsigned char  leddisplay1[10]={0x3F,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

typedef unsigned char BYTE;

sbit DQ = P1^3;                     //DS18B20的数据口位P1.3
BYTE TPH;                           //存放温度值的高字节
BYTE TPL;                           //存放温度值的低字节

void DelayXus(BYTE n);
void DS18B20_Reset();
void DS18B20_WriteByte(BYTE dat);
BYTE DS18B20_ReadByte();
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/

/**************************************
延时X微秒(STC12C5A60S2@12M)
不同的工作环境,需要调整此函数
此延时函数是使用1T的指令周期进行计算,与传统的12T的MCU不同
**************************************/
void DelayXus(BYTE n)
{
    while (n--)
    {
        _nop_();
        _nop_();
    }
}

/**************************************
复位DS18B20,并检测设备是否存在
**************************************/
void DS18B20_Reset()
{
    CY = 1;
    while (CY)
    {
        DQ = 0;                     //送出低电平复位信号
        DelayXus(240);              //延时至少480us
        DelayXus(240);
        DQ = 1;                     //释放数据线
        DelayXus(60);               //等待60us
        CY = DQ;                    //检测存在脉冲
        DelayXus(240);              //等待设备释放数据线
        DelayXus(180);
    }
}

/**************************************
从DS18B20读1字节数据
**************************************/
BYTE DS18B20_ReadByte()
{
    BYTE i;
    BYTE dat = 0;

    for (i=0; i<8; i++)             //8位计数器
    {
        dat >>= 1;
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        DQ = 1;                     //准备接收
        DelayXus(1);                //接收延时
        if (DQ) dat |= 0x80;        //读取数据
        DelayXus(60);               //等待时间片结束
    }

    return dat;
}

/**************************************
向DS18B20写1字节数据
**************************************/
void DS18B20_WriteByte(BYTE dat)
{
    char i;

    for (i=0; i<8; i++)             //8位计数器
    {
        DQ = 0;                     //开始时间片
        DelayXus(1);                //延时等待
        dat >>= 1;                  //送出数据
        DQ = CY;
        DelayXus(60);               //等待时间片结束
        DQ = 1;                     //恢复数据线
        DelayXus(1);                //恢复延时
    }
}
 
/******************************************************************************/

/******************************************************************************/
unsigned int ReadTemperature(void){//读取温度

 unsigned int t=0;
 float tt=0;
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0x44);        //开始转换命令
    while (!DQ);                    //等待转换完成
    DS18B20_Reset();                //设备复位
    DS18B20_WriteByte(0xCC);        //跳过ROM命令
    DS18B20_WriteByte(0xBE);        //读暂存存储器命令
    TPL = DS18B20_ReadByte();       //读温度低字节 
    TPH = DS18B20_ReadByte();       //读温度高字节 
 t=TPH;
 t<<=8;
 t=t|TPL;
 tt=t*0.0625;
 t= tt*10+0.5; //放大10倍输出并四舍五入
 return(t);
}
/*****************************************************************************/
/**********************************************************

蜂鸣器驱动子函数

**********************************************************/
void beep(void)
{
    speaker = 1;  
 DELAY_MS(20);
 speaker = 0;
 DELAY_MS(20);
}
/**********************************************************

LED驱动子函数

**********************************************************/
void led_display(void)
{
unsigned char i;
 for(i=0;i<3;i++)
 { 
 P0 = leddisplay[i];
 P2 = i;
 DELAY_MS(1); 
   }
}
/**********************************************************
/*---------------------------------------------------------------------------------------------------------*/
/* MAIN function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/   

int main (void)
{
   unsigned int i=0;
   unsigned char a,b,c;
   speaker=0;
    while(1)
 {
      i=ReadTemperature();//读温度并送显
  a=i/100;
  if(a>2){beep();}
  leddisplay[0]=leddisplay1[a];
  b=i/10-a*10;
  leddisplay[1]=leddisplay1[b]+ 0x80;;
  c=i-a*100-b*10;
  leddisplay[2]=leddisplay1[c];

  led_display();
 }
}


高工
2011-12-12 10:52:26     打赏
33楼

不错啊


专家
2011-12-15 16:47:46     打赏
34楼

     本实验是根据热敏电阻MFD-103AT随温度变化而其阻值的变化,通过PCF8591对其进行AD采集,送单片机进行运算处理,得出温度值。






简单原程序:
#include <STC12C5A60S2.H> //STC头文件
#include <MATH.H> //STC头文件
double AD_Value;
unsigned int Temp;
sbit speaker   = P1^0;//蜂鸣器
sbit SCL=P1^1;//时钟脉冲
sbit SDA=P1^2;//双向输入输出数据端
#define SCL_SET SCL=1
#define SCL_CLR SCL=0
#define SDA_SET SDA=1
#define SDA_CLR SDA=0
#define AddWr 0x90   //写数据地址 1001 0000
#define AddRd 0x91   //读数据地址 1001 0001
#define adCon 0x40   //AD控制字节 0100 0000

/*********************************************************************************************/
/*--  调入了一幅图像:C:\Documents and Settings\dz\桌面\logo.bmp  --*/
/*--  宽度x高度=128x22  --*/
unsigned char code logo[] =                
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xC7,0x81,0xE0,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF3,0x83,0xE0,0x7C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xF9,0x87,0xF0,0x7C,0x03,0x00,0x80,0x80,0x00,0x00,0x00,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFC,0x87,0xF0,0xFC,0x06,0x03,0x41,0xC0,0xC0,0x00,0xC0,
0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0x47,0xF0,0xFC,0x03,0xC0,0x40,0x41,0x40,0x22,0xE0,
0xFC,0x01,0xF0,0x00,0xF8,0x7E,0x07,0xF8,0xFC,0x07,0x00,0x81,0xE1,0x82,0xA3,0xC0,
0xFC,0x01,0xF0,0x00,0xF8,0x3F,0x0F,0xF8,0xF8,0x14,0x07,0xE2,0x40,0x27,0xF1,0x00,
0xFF,0xF9,0xF0,0x00,0xF8,0x3F,0x0F,0xF8,0xF8,0x12,0x80,0x82,0xC3,0x72,0xA3,0xE0,
0xFF,0xF9,0xFF,0xFF,0xF8,0x7F,0x0F,0xF8,0xF8,0x0B,0x80,0x82,0xC5,0x52,0x63,0x18,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFE,0x5F,0xFD,0xF8,0x07,0x02,0x84,0xE3,0x61,0xF5,0x80,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFE,0x5F,0x7D,0xF8,0x01,0x81,0x04,0x00,0x00,0x00,0x80,
0xFF,0xF9,0xFF,0xFF,0xFF,0xFC,0xDF,0x7D,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xFF,0xFF,0xFF,0xF9,0xFE,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xF0,0x00,0xFF,0xF3,0xFE,0x3F,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xFC,0x01,0xF0,0x00,0xFF,0xC3,0xFE,0x3F,0xF0,0x00,0xE1,0xE3,0x66,0x03,0x8D,0x80,
0xFC,0x01,0xF0,0x00,0xF8,0x03,0xFE,0x3F,0xE0,0x01,0xFB,0xF3,0xFF,0x07,0xEF,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x03,0xFC,0x1F,0xE0,0x03,0x03,0x33,0xBB,0x0C,0x0E,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFC,0x1F,0xE0,0x03,0x03,0x33,0x33,0x0C,0x0C,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x01,0xFC,0x1F,0xE0,0x1B,0x9B,0x33,0x33,0x6E,0x6C,0xC0,
0xFF,0xFF,0xFF,0xFF,0xF8,0x00,0x70,0x07,0x80,0x19,0xF1,0xE3,0x33,0x67,0xCC,0xC0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*****************************************************************************/
/****************************************************************************/
//LCD接口定义
sbit RS =  P2^4; //模式位,为0输入指令,为1输入数据
sbit RW =  P2^5; //读写位,为0读,为1写
sbit E  =  P2^6; //使能位
#define Lcd_Bus   P0 //数据总线
sbit PSB = P2^1; //H:8位或4位并口方式,L:串口方式
sbit NC  = P2^2; //空脚
sbit RES = P2^3; //复位端,低电平有效
/*****************************************************************************/

/*********************************************************************************************/
void DELAY_MS (unsigned int a){
 unsigned int i;
 while( a-- != 0){
  for(i = 0; i < 600; i++);
 }
}
/*********************************************************************************************/

/******************************************************************************/
//LCD驱动
/******************************************************************************/
void chk_busy(){//检查忙位
   RS=0;
   RW=1;
   E=1;
   Lcd_Bus=0xff;
   while((Lcd_Bus&0x80)==0x80);
   E=0;
}
/******************************************************************************/
void write_com(unsigned char cmdcode){   //写命令到LCD
 chk_busy();
 RS=0;
 RW=0;
 E=1;
 Lcd_Bus=cmdcode;
 E=0;
}
/******************************************************************************/
void write_data(unsigned char Dispdata){  //写数据到LCD
 chk_busy();
 RS=1;
 RW=0;
 E=1;
 Lcd_Bus=Dispdata;
 E=0;
}
/******************************************************************************/
void lcm_init(){          //初始化LCD屏)
   PSB = 1;               //H:8位或4位并口方式,L:串口方式
   NC  = 0;               //空脚
   RES = 1;               //复位端,低电平有效
   write_com(0x30);       //选择8bit数据流
   write_com(0x0c);       //开显示(无游标、不反白)
   write_com(0x01);       //清除显示,并且设定地址指针为00H
}
/*****************************************************************************/
void lcm_w_word(unsigned char *s){   //向LCM发送一个字符串,长度64字符之内。
 while(*s>0){      //
     write_data(*s);
     s++;
   }
}
/******************************************************************************/
void lcm_w_test(bit i,unsigned char word){//写指令或数据
 if(i == 0){
  write_com(word); //写指令或数据(0,指令)
 }else{
  write_data(word);//写指令或数据(1,数据)
 }
}
/******************************************************************************/
void lcm_clr(void){//清屏函数
 lcm_w_test(0,0x01);
}
/******************************************************************************/
 /******************************************************************************
//指定显示位置// (设置LCD显示的起始位置)
/******************************************************************************/
void LCD_set_xy(  unsigned char x, unsigned char y ){//X为行(1~4),Y为列(0~7)
 unsigned char address;
 switch(x){
  case 0: address = 0x80 + y; break;   
     case 1: address = 0x80 + y; break;
  case 2: address = 0x90 + y; break;
      case 3: address = 0x88 + y; break;
  case 4: address = 0x98 + y; break;
  default:address = 0x80 + y; break;
 }
    lcm_w_test(0, address);
}
/******************************************************************************
//图形方式12864显示字模(横向8位左高位取模)
/******************************************************************************/
void Disp_img(unsigned char  *img){
 unsigned char i,j;
 unsigned int k = 0;
 lcm_w_test(0,0x36); //图形方式
 for(i=0;i<32;i++){
  lcm_w_test(0,0x80+i);
  lcm_w_test(0,0x80);
     for(j=0;j<16;j++) {
   lcm_w_test(1,img[k++]);
  }
   }
  for(i=0;i<32;i++){
  lcm_w_test(0,0x80+i);
  lcm_w_test(0,0x88);
     for(j=0;j<16;j++) {
   lcm_w_test(1,img[k++]);
    }
 }
}

/**********************************************************/
//延时1US
void delay(unsigned int cnt)
{
 while(--cnt);
}
//延时1MS
void delayms(unsigned int time)
{
 unsigned int i;
 for(i=0; i<time; i++)
  delay(120);
}

void start()
{
 SDA_SET;
 delay(1);
 SCL_SET;
 delay(5);
 SDA_CLR;
}


void stop()
{
 SDA_CLR;
 delay(1);
 SCL_SET;
 delay(5);
 SDA_SET; 
}


void ack()
{
 SDA_CLR;
 SCL_SET;
 delay(1);
 SCL_CLR;
}

void noAck()
{
 SDA_SET;
 SCL_SET;
 delay(1);
 SCL_CLR;
}

void send(unsigned char Data)
{
 unsigned char i=0;
 unsigned char temp=0;

 temp=Data;
 for(i=0; i<8; i++)
 {
  SCL_CLR;
  delay(1);
  if(temp&0x80) SDA_SET;
  else SDA_CLR;
  delay(1);
  SCL_SET;
  delay(1);
  temp<<=1;
 }
   SCL_CLR;
}

unsigned char recive()
{
 unsigned char i=0;
 unsigned char temp=0;

 SDA_SET;  //必须设置
 for(i=0; i<8; i++)
 {
  SCL_CLR;//拉低允许数据改变
  delay(1);
  SCL_SET;//拉高保持数据,等待读走
  delay(2);
  if(SDA) temp|=0x01;
  else temp&=0xfe;
  if(i<7)   temp<<=1;//最低位发送完成不能移位,否则出错
 }
    SCL_CLR;
 return temp;
}

unsigned char read(unsigned char ch )
{
 unsigned char temp=0;
 start();
 send(AddWr);//确认芯片
 ack();
 send(adCon|ch);//确认通道
 ack();
 //读出数据,放进temp
 start();
 send(AddRd);
 ack();
 temp=recive();
 noAck();
 stop();
 return temp;
}

unsigned char DAC(unsigned char light)
{
 start();
 send(AddWr);
 ack();
 send(0x40);    //写入控制位,使能DAC输出
 ack();
 send(light);
 ack();
 stop();
}

/*****************************************************************************/
//---主程序---//
/*****************************************************************************/
main() {
 speaker=0;
 lcm_init();    //初始化液晶显示器
 Disp_img(logo);//显示图片测试内容
 DELAY_MS (10000);      
 lcm_clr();
 lcm_init();    //初始化液晶显示器
 LCD_set_xy(1,0); //写入字符的位置
 lcm_w_word("  NTC1测温实验  "); //写入字符内容
 LCD_set_xy(3,0);
 lcm_w_word("  温度:    ℃  ");
  while(1){   //主循环
  AD_Value=read(1);
  Temp = floor((1/(log(AD_Value/(255-AD_Value))/3380 + 1/298.15)- 273.15)*10);
  lcm_w_test(0,0x8c);  //秒值在LCM上的写入位置
  lcm_w_test(1,Temp/100+0x30);
   if(Temp/100>2){
    speaker = 1;  
    DELAY_MS(20);
    speaker = 0;
    DELAY_MS(20);
     } 
  lcm_w_test(1,Temp%100/10+0x30); 
  lcm_w_test(1,0x2e); 
  lcm_w_test(1,Temp%10+0x30); 
  DELAY_MS (300);   
 
      }
}


助工
2011-12-15 23:21:41     打赏
35楼
强悍!!!学习!

专家
2011-12-18 17:38:38     打赏
36楼

PS2键盘实验,参考了网上的程序,用1602显示键盘输入的字符:




程序代码:
#include <STC12C5A60S2.H> //STC头文件
#include <PS2.h>
//宏定义
typedef unsigned char  uchar;
typedef unsigned int  uint;
bit Flag;
sbit PS2_PIN=P3^0;  //#define PS2_PIN P3_0
sbit PS2_CLK=P3^2;  //#define PS2_CLK P3_2
typedef unsigned char      uint8;          // 无符号8位整型变量 //

/********************************************************************************************
// 引脚定义 //
/********************************************************************************************/
#define  LCM1602_DB0_DB7 P0       // 定义LCM1602的数据总线
sbit LCM1602_RS   = P2 ^ 4;     // 定义LCM1602的RS控制线
sbit LCM1602_RW   = P2 ^ 5;     // 定义LCM1602的RW控制线
sbit LCM1602_E    = P2 ^ 6;     // 定义LCM1602的E控制线
sbit LCM1602_Busy = P0 ^ 7;     // 定义LCM1602的测忙线(与LCM1602_DB0_DB7关联)
/********************************************************************************************
// 定义LCM1602指令集 //
/********************************************************************************************/
#define   CMD_clear  0x01             // 清除屏幕
#define   CMD_back  0x02             // DDRAM回零位
#define   CMD_dec1  0x04             // 读入后AC(指针)减1,向左写
#define   CMD_add1  0x06             // 读入后AC(指针)加1,向右写
#define   CMD_dis_gb1  0x0f             // 开显示_开光标_开光标闪烁
#define   CMD_dis_gb2  0x0e             // 开显示_开光标_关光标闪烁
#define   CMD_dis_gb3  0x0c             // 开显示_关光标_关光标闪烁
#define   CMD_OFF_dis  0x08             // 关显示_关光标_关光标闪烁
#define   CMD_set82  0x38             // 8位总线_2行显示
#define   CMD_set81  0x30             // 8位总线_1行显示(上边行)
#define   CMD_set42  0x28             // 4位总线_2行显示
#define   CMD_set41  0x20             // 4位总线_1行显示(上边行)
#define   lin_1   0x80             // 4位总线_1行显示(上边行)
#define   lin_2   0xc0             // 4位总线_1行显示(上边行)

volatile uchar counter;         //中断脉冲计数
volatile uchar key_value;       //键值
volatile uchar key_value_buf[1];//键值缓冲区
volatile uchar key;
volatile uchar i;
volatile uchar key_fact;

void delay(uint ms)
{
 uint i;
 for(;ms>0;ms--)
 for(i=500;i>0;i--);
}
/********************************************************************************************
// 读LCM忙程序 [底层协议] //
// LCM1602测忙,若LCM1602处于忙状态,本函数将等待至非忙状态 //
/********************************************************************************************/
void LCM1602_TestBusy(void){
    LCM1602_DB0_DB7 = 0xff;  //设备读状态
    LCM1602_RS = 0;
    LCM1602_RW = 1;
    LCM1602_E = 1;
    while(LCM1602_Busy);  //等待LCM不忙
    LCM1602_E = 0;    //
}
/********************************************************************************************
// 写指令程序 //
// 向LCM1602写命令 本函数需要1个指令集的入口参数 //
/********************************************************************************************/
void LCM1602_WriteCMD(uint8 LCM1602_command) {
   LCM1602_TestBusy();
   LCM1602_DB0_DB7 = LCM1602_command;
   LCM1602_RS = 0;
   LCM1602_RW = 0;
   LCM1602_E = 1;
   LCM1602_E = 0;
}
/********************************************************************************************
// 写数据程序 //
// 向LCM1602写数据 //
/********************************************************************************************/
void LCM1602_WriteData(uint8 LCM1602_data){
    LCM1602_TestBusy();
 LCM1602_DB0_DB7 = LCM1602_data;
   LCM1602_RS = 1;
   LCM1602_RW = 0;
   LCM1602_E = 1;
   LCM1602_E = 0;
}
/********************************************************************************************
// 打印字符串程序 //
// 向LCM发送一个字符串,长度48字符之内
// 第一行位置 0x00~0x17  第二行位置 0x40~0x57
// 应用举例:print(0x80,"goodboy3021");
/********************************************************************************************/
void print(uint8 a,uint8 *str){
 LCM1602_WriteCMD(a | 0x80);
 while(*str != '\0'){
  LCM1602_WriteData(*str++);
 }
 *str = 0;
}
/********************************************************************************************
// 打印单字符程序 //
// 第一行位置 0x00~0x17  第二行位置 0x40~0x57
// 向LCM发送一个字符,以十六进制(0x00)表示
// 应用举例:print(0xc0,0x30);
/********************************************************************************************/
void print2(uint8 a,uint8 t){
  LCM1602_WriteCMD(a | 0x80);
  LCM1602_WriteData(t);
}
/********************************************************************************************
// LCM1602初始化 //
/********************************************************************************************/
void LCM1602_Init(void){
   LCM1602_WriteCMD(CMD_set82); //* 显示模式设置:显示2行,每个字符为5*7个像素
   LCM1602_WriteCMD(CMD_clear); //  显示清屏
   LCM1602_WriteCMD(CMD_back);  //* 数据指针指向第1行第1个字符位置
   LCM1602_WriteCMD(CMD_add1);  //  显示光标移动设置:文字不动,光标右移
   LCM1602_WriteCMD(CMD_dis_gb1);  //  显示开及光标设置:显示开,光标开,闪烁开
}
/********************************************************************************************/


//PS2端口中断初始化
void PS2_Init(void)
{
 counter=0;   //中断脉冲计数
 key_value=0; //键值
 key=0;
 i=0;
 PS2_PIN = 1;//将数据线拉高
 PS2_CLK = 1;//时钟线拉高
 IT0 = 1;    //下降沿触发中断
 EX0 = 1;    //打开外部中断0
 EA = 1;     //打开全局中断
             //优先级采用默认方式,即最高优先级为复位中断 其次为外部中断0
}
uchar PS2_Value(void)
{
 switch(key_value)
 {
  case PS_0:key_fact=0x30;break;
  case PS_1:key_fact=0x31;break;
  case PS_2:key_fact=0x32;break;
  case PS_3:key_fact=0x33;break;
  case PS_4:key_fact=0x34;break;
  case PS_5:key_fact=0x35;break;
  case PS_6:key_fact=0x36;break;
  case PS_7:key_fact=0x37;break;
  case PS_8:key_fact=0x38;break;
  case PS_9:key_fact=0x39;break;
  case PS_a:key_fact=0x61;break;
  case PS_b:key_fact=0x62;break;
  case PS_c:key_fact=0x63;break;
  case PS_d:key_fact=0x64;break;
  case PS_e:key_fact=0x65;break;
  case PS_f:key_fact=0x66;break;
  case PS_g:key_fact=0x67;break;
  case PS_h:key_fact=0x68;break;
  case PS_i:key_fact=0x69;break;
  case PS_j:key_fact=0x6A;break;
  case PS_k:key_fact=0x6B;break;
  case PS_l:key_fact=0x6C;break;
  case PS_m:key_fact=0x6D;break;
  case PS_n:key_fact=0x6E;break;
  case PS_o:key_fact=0x6F;break;
  case PS_p:key_fact=0x70;break;
  case PS_q:key_fact=0x71;break;
  case PS_r:key_fact=0x72;break;
  case PS_s:key_fact=0x73;break;
  case PS_t:key_fact=0x74;break;
  case PS_u:key_fact=0x75;break;
  case PS_v:key_fact=0x76;break;
  case PS_w:key_fact=0x77;break;
  case PS_x:key_fact=0x78;break;
  case PS_y:key_fact=0x79;break;
  case PS_z:key_fact=0x7A;break;
  case PS_SPACE:key_fact=0x20;break;
  case PS_Q2:key_fact=0x2E;break;
  case PS_Q7:key_fact=0x2D;break;
        default:key_fact=0x20;Flag=0;break;  
   }
  
 return  key_fact;
}
int main()
{
    uchar i=0,j=0,k=63;
 PS2_Init();
 LCM1602_Init(); //LCM1602初始化
 Flag=0;
 while(1)
 {  
     
   if(Flag)
   { 
       i=PS2_Value(); 
    print2(j,i);
    if(j<15)
    {
     j=j+1;
    }
    else{
     j=k+1;
     k=k+1;
    }
    if(j>80)
    {
       LCM1602_WriteCMD(CMD_clear);
    j=0;
    k=63;
    }
    delay(250);
   }
  Flag=0;
  }

 return 0;
}
void INT0_ISR(void) interrupt 0 using 3

 if(counter>0 && counter<9) //接受1字节数据
 {
  key >>= 1;
  if(PS2_PIN) {key |= 0x80;}
 }
 counter++;
 if(counter==11) 
 {
  counter=0;
  key_value_buf[i]=key;
  key=0;
  i++;
  if(i==2) i=0;
  if(key_value_buf[1]==0xf0 || key_value_buf[0]==0xf0) 
  {
    key_value=(key_value_buf[1]==0xF0?key_value_buf[0]:key_value_buf[1]);
    Flag=1;
  }
 }


PS2.H
#ifndef _PS2_H
#define _PS2_H
//键码定义
//0到9键码
#define PS_0 0x45
#define PS_1 0x16
#define PS_2 0x1E
#define PS_3 0x26
#define PS_4 0x25
#define PS_5 0x2E
#define PS_6 0x36
#define PS_7 0x3D
#define PS_8 0x3E
#define PS_9 0x46
//a到z键码
#define PS_a 0x1C
#define PS_b 0x32
#define PS_c 0x21
#define PS_d 0x23
#define PS_e 0x24
#define PS_f 0x2B
#define PS_g 0x34

#define PS_h 0x33
#define PS_i 0x43
#define PS_j 0x3B
#define PS_k 0x42
#define PS_l 0x4B
#define PS_m 0x3A
#define PS_n 0x31

#define PS_o 0x44
#define PS_p 0x4D
#define PS_q 0x15
#define PS_r 0x2D
#define PS_s 0x1B
#define PS_t 0x2C

#define PS_u 0x3C
#define PS_v 0x2A
#define PS_w 0x1D
#define PS_x 0x22
#define PS_y 0x35
#define PS_z 0x1A
//F0到F2键码
#define PS_F1  0x05
#define PS_F2  0x06
#define PS_F3  0x04
#define PS_F4  0x0C
#define PS_F5  0x03
#define PS_F6  0x0B
#define PS_F7  0x83
#define PS_F8  0x0A
#define PS_F9  0x01
#define PS_F10 0x09
#define PS_F11 0x78
#define PS_F12 0x07
//部分特殊键键码
#define PS_Enter 0x5A  //回车键
#define PS_Shift 0x12  //Shift
#define PS_Ctrl  0x14  //Ctrl
#define PS_Back_S 0x66 //Back Space
#define PS_Esc   0x76  //Esc
#define PS_Tab   0x0D  //Tab
#define PS_Del   0x71  //DEl
//方向键键码
#define PS_UP     0x75  //向上键
#define PS_DOWN   0x72  //向下键
#define PS_LEFT   0x6B  //向左键
#define PS_RIGHT  0x74  //向右键
#define PS_SPACE  0x29  //空格键
//部分符号键键码
#define PS_Q1    0x41 //符号键,
#define PS_Q2    0x49 //符号键.
#define PS_Q3    0x4C //符号键;
#define PS_Q4    0x54 //符号键[
#define PS_Q5    0x5B //符号键]
#define PS_Q6    0x55 //符号键=
#define PS_Q7    0x4E //符号键-
#define PS_Q8    0x4A //符号键/
//小键盘键码
#define PS_L0    0x70 //小键盘0
#define PS_L1    0x69 //小键盘1
#define PS_L2    0x72 //小键盘2
#define PS_L3    0x7A //小键盘3
#define PS_L4    0x6B //小键盘4
#define PS_L5    0x73 //小键盘5
#define PS_L6    0x74 //小键盘6
#define PS_L7    0x6C //小键盘7
#define PS_L8    0x75 //小键盘8
#define PS_L9    0x7D //小键盘9
#define PS_L10   0x71 //小键盘.
#define PS_L11   0xA5 //小键盘Enter   E0A5
#define PS_L12   0x79 //小键盘+
#define PS_L13   0x7B //小键盘-
#define PS_L14   0x7C //小键盘*
#define PS_L15   0x4A //小键盘/    E04A
#define PS_L16   0x77 //小键盘Num Lock

//键盘函数声明
extern void PS2_Init();

extern unsigned char PS2_Value();


#endif


专家
2011-12-20 16:52:36     打赏
37楼

      MCU-DIY之步进电机实验,本实验是利用开发板上的UL2003来驱动步进电机的,步进电机是光驱中拆下来的2相6线步进式电机,工作电压为12V,实验用的是板上的5V电压,力矩变小。实验内容为利用板上的4x1独立按键中的S2、S3和S4来控制步进电机的正转、反转和停止:


简单驱动程序:
#include <STC12C5A60S2.H> //STC头文件
#define  PHASEPORT  P1  //引脚定义
sbit ZZ = P3 ^ 1;
sbit FZ = P3 ^ 2;
sbit TZ = P3 ^ 3;
unsigned char  FFW[8]={0xF1,0xF3,0xF2,0xF6,0xF4,0xFC,0xF8,0xF9};
unsigned char  REV[8]={0xF9,0xF8,0xFC,0xF4,0xF6,0xF2,0xF3,0xF1};
/*****************************************************************/

/*****************************************************************/
void DELAY_MS (unsigned int a){ // 1ms延时程序
 unsigned int i;
 while( --a != 0){
  for(i = 0; i < 600; i++);
 }         
}
/*****************************************************************/

/********************************************************/
/*
/*步进电机正转
/*
/********************************************************/
void  motor_ffw()
{
 unsigned char i;
 for (i=0; i<8; i++)      
 {
  PHASEPORT = FFW[i];   //取数据
  DELAY_MS(20);         //调节转速
 }
}
/********************************************************/
/*
/*步进电机反转
/*
/********************************************************/
void  motor_rev()
{
 unsigned char i;
 for (i=0; i<8; i++)      
 {
  PHASEPORT = REV[i];   //取数据
  DELAY_MS(20);         //调节转速
 }
}
/********************************************************/
/*                                                       
/*  主程序                                               
/*                                                       
*********************************************************/
main()
{    
 PHASEPORT=0xF0;
 while(1)
 {
   if(ZZ==0){
    DELAY_MS(250);
     while(FZ==1 && TZ==1)
     {
       motor_ffw();  //电机正转
     }
   }
   if(FZ==0){
    DELAY_MS(250);
     while(ZZ==1 && TZ==1)
     {
         motor_rev(); //电机反转
   }
   }
   if(TZ==0){
    DELAY_MS(250);
     while(ZZ==1 && FZ==1)
     {
         PHASEPORT=0xF0;
   }    }
  }
}

 


专家
2011-12-21 08:41:25     打赏
38楼
你太强悍了! 加油!

专家
2011-12-24 20:32:31     打赏
39楼

       MCU-DIY开发板数字时钟实验:此数字时钟同样使用了DIY开发板上的DS1302数字时钟芯片,并通过8位数码管来显示年、月、日、星期、小时、分钟、秒。通过板上的4x1键盘的S2、S3、S4对数字时钟的年/月/日、星期、时间切换显示。数字时钟时间校正是使用VB 编写的上位机程序,通过串口传送数据,一键对其进行时钟校正(也可扩展闹铃设定等),操作方便、时间准确。





程序代码:
#include <STC12C5A60S2.H> //STC头文件
#include <MATH.H>
sbit S2 = P3 ^ 1;
sbit S3 = P3 ^ 2;
sbit S4 = P3 ^ 3;
sbit speaker = P3 ^ 7;
static unsigned char data s_time[14];
static unsigned char data CN;
unsigned char  leddisplay[8] ={0x3F,0x3F,0x40,0x3F,0x3F,0x40,0x3F,0x3F};
unsigned char  leddisplay1[10]={0x3F,0x06,0x5B,0x4f,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位
//定义累加器A中的各位
sbit a0   = ACC ^ 0;
sbit a1   = ACC ^ 1;
sbit a2   = ACC ^ 2;
sbit a3   = ACC ^ 3;
sbit a4   = ACC ^ 4;
sbit a5   = ACC ^ 5;
sbit a6   = ACC ^ 6;
sbit a7   = ACC ^ 7;
/****************************************************************************/
/*****************************************************************************/
//定义DS1302时钟接口
sbit clock_clk = P3 ^ 6;//ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 5;//ds1302_Rst(复位线)
/*****************************************************************************/
//声明(当各函数的排列适当时可不用声明)
void led_ss(void);void led_mm(void);
void led_hh(void);void led_dd(void);
void led_mo(void);void led_yy(void);
void led_xq(void);
unsigned char clock_in(void);
void clock_out(unsigned char dd);
void Init_1302(void);
unsigned char read_clock(unsigned char ord);
void read_clockS(void);
void Set_time(void);
void write_clock(unsigned char ord, unsigned char dd);
void updata (void);
/*****************************************************************/
void DELAY_MS (unsigned int a){ // 1ms延时程序
   unsigned int i;
 while( --a != 0){
  for(i = 0; i < 600; i++);
 }         
}
/*****************************************************************/

/**********************************************************
*
*蜂鸣器驱动子函数
*
**********************************************************/
void beep(void)
{
  speaker = 1;  
  DELAY_MS(20);
  speaker = 0;
  DELAY_MS(20);
}
/**********************************************************
*
*LED驱动子函数
*
**********************************************************/
void led_display(void)
{
   unsigned char i;
  for(i=0;i<8;i++)
  { 
   P0 = leddisplay[i];
   P2 = i;
   DELAY_MS(2); 
  }
}
/**********************************************************/
/*********************************************************************************************
函数名:UART串口初始化函数
调  用:UART_init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为11.0592MHz,PC串口端设置 [ 19200,8,无,1,无 ]
/**********************************************************************************************/
void UART_init (void){
 EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
 ES = 1; //允许UART串口的中断

 TMOD = 0x20; //定时器T/C1工作方式2
 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
 TH1 = 0xFD;   //定时器初值高8位设置
 TL1 = 0xFD;    //定时器初值低8位设置
 PCON = 0x80;   //波特率倍频(屏蔽本句波特率为9600)
 TR1 = 1;    //定时器启动   
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:UART串口接收中断处理函数
调  用:[SBUF收到数据后中断处理]
参  数:无
返回值:无
结  果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)
备  注:过长的处理程序会影响后面数据的接收
/**********************************************************************************************/
void UART_R (void) interrupt 4  using 1{ //切换寄存器组到1
unsigned char UART_data; //定义串口接收数据变量

if (RI == 1){  //接收中断标志位为1时
 if(CN>13)
 {
  CN=0;
 }
 UART_data = SBUF; //接收数据 SBUF 为单片机的接收发送缓冲寄存器
 s_time[CN]=UART_data;
 CN=CN+1;
 RI = 0;   //令接收中断标志位为0(软件清零)

 SBUF = UART_data; 
 while(TI == 0); 
 TI = 0;  
 w=1;
   }

/**********************************************************************************************/

/*****************************************************************************/
//DS1302时钟芯片驱动程序
/*****************************************************************************/
//常用时钟数据读取
void read_clockS(void){
 ss = read_clock(0x81);//读取秒数据
 mm = read_clock(0x83);//读取分钟数据
 hh = read_clock(0x85);//小时
 dd = read_clock(0x87);//日
 mo = read_clock(0x89);//月
 xq = read_clock(0x8b);//星期
 yy = read_clock(0x8d);//年
}
/*****************************************************************************/
//调时程序
void Set_time(void){ //根据选择调整的相应项写入DS1302
  write_clock(0x8e,0x00);//允许写操作
  write_clock(0x8c,(s_time[1]%16*10+s_time[2]%16)/10*16+(s_time[1]%16*10+s_time[2]%16)%10);    //年 
  write_clock(0x8a,s_time[7]%16);                                                              //星期
  write_clock(0x88,(s_time[3]%16*10+s_time[4]%16)/10*16+(s_time[3]%16*10+s_time[4]%16)%10);    //月
  write_clock(0x86,(s_time[5]%16*10+s_time[6]%16)/10*16+(s_time[5]%16*10+s_time[6]%16)%10);    //日
  write_clock(0x84,(s_time[8]%16*10+s_time[9]%16)/10*16+(s_time[8]%16*10+s_time[9]%16)%10);    //小时
  write_clock(0x82,(s_time[10]%16*10+s_time[11]%16)/10*16+(s_time[10]%16*10+s_time[11]%16)%10);//分钟
  write_clock(0x80,(s_time[12]%16*10+s_time[13]%16)/10*16+(s_time[12]%16*10+s_time[13]%16)%10);//秒
  write_clock(0x8e,0x80);//禁止写操作
  
  updata ();
  beep();
  w=0;
}
/*****************************************************************************/
//设置1302的初始时间(自动初始化)
void Init_1302(void){//设置1302的初始时间(2007年1月1日00时00分00秒星期一)
 unsigned char f;
 if(read_clock(0xc1) != 0xaa){
  write_clock(0x8e,0x00);//允许写操作
  write_clock(0x8c,0x07);//年
  write_clock(0x8a,0x01);//星期
  write_clock(0x88,0x01);//月
  write_clock(0x86,0x01);//日
  write_clock(0x84,0x00);//小时
  write_clock(0x82,0x00);//分钟
  write_clock(0x80,0x00);//秒
  write_clock(0x90,0xa5);//充电 
  write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
  for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
   write_clock(0xc2+f,0x00);
  }
  write_clock(0x8e,0x80);//禁止写操作
 }
}
/*****************************************************************************/
//DS1302写数据(底层协议)
void write_clock(unsigned char ord, unsigned char dd){
 clock_clk=0;
 clock_Rst=0;
 clock_Rst=1;
 clock_out(ord);
 clock_out(dd);
 clock_Rst=0;
 clock_clk=1;
}
/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
 ACC=dd;
 clock_dat=a0; clock_clk=1; clock_clk=0;
 clock_dat=a1; clock_clk=1; clock_clk=0;
 clock_dat=a2; clock_clk=1; clock_clk=0;
 clock_dat=a3; clock_clk=1; clock_clk=0;
 clock_dat=a4; clock_clk=1; clock_clk=0;
 clock_dat=a5; clock_clk=1; clock_clk=0;
 clock_dat=a6; clock_clk=1; clock_clk=0;
 clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
 clock_dat=1;
 a0=clock_dat;
 clock_clk=1; clock_clk=0; a1=clock_dat;
 clock_clk=1; clock_clk=0; a2=clock_dat;
 clock_clk=1; clock_clk=0; a3=clock_dat;
 clock_clk=1; clock_clk=0; a4=clock_dat;
 clock_clk=1; clock_clk=0; a5=clock_dat;
 clock_clk=1; clock_clk=0; a6=clock_dat;
 clock_clk=1; clock_clk=0; a7=clock_dat;
 return(ACC);
}
/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
 unsigned char dd=0;
 clock_clk=0;
 clock_Rst=0;
 clock_Rst=1;
 clock_out(ord);
 dd=clock_in();
 clock_Rst=0;
 clock_clk=1;
 return(dd);
}
/*****************************************************************************/
//刷新数据
void updata (void){
  led_mm();//刷新 分
  led_hh();//刷新 小时
  led_dd();//刷新 日
  led_xq();//更新星期值 
  led_mo();//刷新 月
  led_yy();//刷新 年
}
/*****************************************************************************/
//向数码管中填写 年 数据
void led_yy(void){
  yy = read_clock(0x8d);
  leddisplay[0] = leddisplay1[2];  
  leddisplay[1] = leddisplay1[0]; 
  leddisplay[2] = leddisplay1[yy/16];  
  leddisplay[3] = leddisplay1[yy%16] | 0x80; 
}
/*****************************************************************************/
//向数码管中填写 月 数据
void led_mo(void){
  mo = read_clock(0x89);
   if(mo/16 != 0){leddisplay[4] = leddisplay1[mo/16];} //十位消隐
   else{leddisplay[4] = 0x00;}     
  leddisplay[5] = leddisplay1[mo%16]| 0x80; 

/*****************************************************************************/
//向数码管中填写 日 数据
void led_dd(void){
  dd = read_clock(0x87);
   if(dd/16 != 0){leddisplay[6] = leddisplay1[dd/16]; } //十位消隐
   else{leddisplay[6] = 0x00;} 
        leddisplay[7] = leddisplay1[dd%16]; 
    

/*****************************************************************************/
//星期处理
void led_xq(void){
 xq = read_clock(0x8b);
 leddisplay[0] = leddisplay1[xq%16]; 
 leddisplay[1] = 0x00; 
 leddisplay[2] = 0x00; 
 leddisplay[3] = 0x00; 
 leddisplay[4] = 0x00; 
 leddisplay[5] = 0x00; 
 leddisplay[6] = 0x00; 
 leddisplay[7] = 0x00; 

/*****************************************************************************/
//向数码管中填写 小时 数据
void led_hh(void){
  hh = read_clock(0x85);
  leddisplay[0] = leddisplay1[hh/16];   
  leddisplay[1] = leddisplay1[hh%16]; 
  leddisplay[2] = 0x40;      
}
/*****************************************************************************/
//向数码管中填写 分钟 数据
void led_mm(void){
  mm = read_clock(0x83);  
  leddisplay[3] = leddisplay1[mm/16];   
  leddisplay[4] = leddisplay1[mm%16]; 
  leddisplay[5] = 0x40;
}
/*****************************************************************************/
//向数码管中填写 秒 数据
void led_ss(void){
   if(read_clock(0x81) != ss){ //判断是否需要更新
  ss = read_clock(0x81); //更新数据
  leddisplay[6] = leddisplay1[ss/16];   
  leddisplay[7] = leddisplay1[ss%16]; 
  led_mm();//刷新 分
  led_hh();//刷新 小时
      } 
}
/********************************************************/
/*                                                       
/*  主程序                                               
/*                                                       
*********************************************************/
main()

 unsigned char i,j;
 yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新 
 Init_1302();
 UART_init ();
 speaker=0;
 while(1)
 {
 if (w == 0){     //正常走时
  led_ss();    //刷新 秒
  }
 if (w==1){
  Set_time();    //更新
  }

 if (S2 == 0){      
   led_dd();//刷新 日
   led_mo();//刷新 月
   led_yy();//刷新 年
   while(S4==1){
     led_display();
   }
   for(i=0;i<50;i++){led_display();}  //防抖
  }
 if (S3 == 0){     
   led_xq();//刷新 星期
   while(S4==1){
     led_display();
   }
   for(j=0;j<50;j++){led_display();}  //防抖
  }
    
   led_display();  
  }
}


上位机校正程序免费下载地址:http://share.eepw.com.cn/share/download/id/60517


专家
2011-12-25 22:32:53     打赏
40楼

很不错的啊,看好你的!!!


共53条 4/6 |‹ 1 2 3 4 5 6 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]