旋转led程序

程序如下
/*********************************************************************************************
程序名:    POV CLOCK控制程序
编写人:    TOTOP 
编写时间:  2009年12月04日
硬件支持:  STC89C51RC2 外部时钟11.0592
接口说明:  单片机P0、P2侧并行排列16个贴片LED(自P2.0开始(-))
*********************************************************************************************
说明:
字幕的修改方法,从左到右 ,从上到下,纵向下高位。
*********************************************************************************************/
#include "stc.h"        //STC单片机头文件
sbit KEY= P4^3;        //霍尔传感器A04E
sbit DQ = P1^2;        //温度传感器定义
sbit clock_clk = P1^7; //ds1302_clk(时钟线)
sbit clock_dat = P1^6; //ds1302_dat(数据线)
sbit clock_Rst = P1^5; //ds1302_Rst(复位线)
unsigned char tem_h,tem_l,mon_h,mon_l,day_h,day_l,sflag,hou_h,hou_l,min_h,min_l,wee;
unsigned char mon,day,hou,min;
unsigned int tem;//温度值数组
void Delay (int num);
void Init_DS18B20(void);//初始化子程序
void WriteOneChar(unsigned char dat);
unsigned char ReadOneChar(void);//读一个字节
void ReadTemperature(void);//读取温度
//定义累加器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;               
//*************************************************/
/*************************************************
函数声明                 
*************************************************/
extern void Init_1302 (void);
extern void write_clock(unsigned char ord, unsigned char dd);
extern unsigned char clock_in(void);
extern unsigned char read_clock(unsigned char ord);
/*********************************************************************************************
字幕数组
*********************************************************************************************/
/*********************************************************************************************/
unsigned char code xq[] = {
//(取码:从上到下从左到右,纵向8位下高位)
//"日"
0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x7F,
0x82,0x20,0x82,0x20,0x82,0x20,0x82,0x20,
0x82,0x20,0x82,0x20,0x82,0x20,0xFF,0x7F,
0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
//"一"
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0x80,0x00,0x80,0x00,0x80,0x00,
0x80,0x00,0xC0,0x00,0x80,0x00,0x00,0x00,
//"二"
0x00,0x10,0x00,0x10,0x08,0x10,0x08,0x10,
0x08,0x10,0x08,0x10,0x08,0x10,0x08,0x10,
0x08,0x10,0x08,0x10,0x08,0x10,0x0C,0x10,
0x08,0x10,0x00,0x18,0x00,0x10,0x00,0x00,
//"三"
0x00,0x20,0x04,0x20,0x84,0x20,0x84,0x20,
0x84,0x20,0x84,0x20,0x84,0x20
,
0x84,0x20,
0x84,0x20,0x84,0x20,0x84,0x20,0xC4,0x20,
0x86,0x20,0x04,0x30,0x00,0x20,0x00,0x00,
//"四"
0x00,0x00,0xFC,0x7F,0x04,0x20,0x04,0x28,
0x04,0x24,0xFC,0x23,0x04,0x20,0x04,0x20,
0x04,0x20,0xFC,0x21,0x04,0x22,0x04,0x22,
0x04,0x22,0xFE,0x7F,0x04,0x00,0x00,0x00,
//"五"
0x00,0x40,0x04,0x40,0x84,0x40,0x84,0x40,
0x84,0x78,0x84,0x47,0xFC,0x40,0x84,0x40,
0x84,0x40,0x84,0x40,0x84,0x40,0xC4,0x7F,
0x86,0x40,0x84,0x60,0x00,0x40,0x00,0x00,
//"六"
0x20,0x00,0x20,0x40,0x20,0x20,0x20,0x18,
0x20,0x06,0x22,0x03,0x2C,0x00,0x38,0x00,
0x20,0x00,0x20,0x01,0x20,0x02,0x20,0x0C,
0x20,0x38,0x30,0x70,0x20,0x00,0x00,0x00,
};
/*********************************************************************************************/
unsigned char code sz[] = {       
//(从上到下从左到右,纵向8位下高位)
0x3E,0x51,0x49,0x45,0x3E,0x00, // -0-
0x00,0x42,0x7F,0x40,0x00,0x00, // -1-
0x62,0x51,0x49,0x49,0x46,0x00, // -2-
桥架接头0x21,0x41,0x49,0x4D,0x33,0x00, // -3-
0x18,0x14,0x12,0x7F,0x10,0x00, // -4-
0x27,0x45,0x45,0x45,0x39,0x00, // -5-
0x3C,0x4A,0x49,0x49,0x31,0x00, // -6-
0x01,0x71,0x09,0x05,0x03,0x00, // -7-
0x36,0x49,0x49,0x49,0x36,0x00, // -8-
0x46,0x49,0x49,0x29,0x1E,0x00, // -9-
0x00,0x36,0x36,0x00,0x00,0x00, // -:-
0x00,0x00,0x00,0x00,0x00,0x00, // - -
0x08,0x08,0x08,0x08,0x08,0x00, // ---
0x20,0x10,0x08,0x04,0x02,0x00, // -/-
0x00,0x00,0xFF,0x00,0x00,0x00, // -|-
0x33,0x4B,0x84,0x84,0x48,0x00, // -C-
};
/*********************************************************************************************
函数名:LED显示用延时函数
调 用:delay0();
参 数:无
返回值:无
结 果:占用CPU方式延时500微秒时间
备 注:晶振11.0592m
/*********************************************************************************************/
void delay0(void)  //误差 -0.46875us
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=227;a>0;a--);
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:CPU延时函数
调 用:delay1();
参 数:无
返回值:无
结 果:占用CPU方式延时4000微秒时间
备 注:晶振11.0592M
/*********************************************************************************************/
void delay1(void)  //误差 -0.000000000005us
{
unsigned char b,c;
for(c=127;c>0;c--)
for(b=13;b>0;b--);
}
/*********************************************************************************************/
/*********************************************************************************************
装载机称重系统函数名:关闭所有LED灯(操作硬件)
调 用:DISPLAY_OFF();
参 数:无
返回值:无
结 果:所有LED灯熄灭
备 注:
/*************************************
*********************************************************/
void DISPLAY_OFF (void){
delay0();//显示停留
软化器
P0 = 0xff;
P2 = 0xff;
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:单帧数据送入显示(操作硬件)
调 用:DISPLAY_PIN(?,?);
参 数:16位显示数据(下高位)(d:上面8位,e:下面8位)
返回值:无
结 果:点亮对应数据的LED灯
备 注:
/**********************************************************************************************/
void DISPLAY_PIN (unsigned char d,unsigned char e){ //第1列横向显示程序
P2=~d;
P0=~e;
DISPLAY_OFF();
}
/*********************************************************************************************
函数名:单帧数据送入显示(操作硬件)
调 用:DISPLAY_PIN(?,?);
参 数:16位显示数据(下高位)(d:上面8位,e:下面8位)
返回值:无
结 果:点亮对应数据的LED灯
备 注:
/**********************************************************************************************/
void DISPLAY_PIN0(unsigned char d){ //第1列横向显示程序
P2=~d;
}
/*********************************************************************************************
函数名:单帧数据送入显示(操作硬件)
调 用:DISPLAY_PIN(?,?);
参 数:16位显示数据(下高位)(d:上面8位,e:下面8位)
返回值:无
结 果:点亮对应数据的LED灯
备 注:
/**********************************************************************************************/
void DISPLAY_PIN1(unsigned char e){ //第1列横向显示程序
P0=~e;
}
/*********************************************************************************************
函数名:初始化程序
调 用:init();
参 数:无
返回值:无
结 果:IO接口全部置1
/**********************************************************************************************/
void init (void){
P1 = 0xff; //初始IO接口状态
P0 = 0xff;
P2 = 0xff;
P4 = 0xff;
}
/
**********************************************************************************************/
/*********************************************************************************************
函数名:显示函数风湿油
调 用:display(unsigned char tem_h,tem_l,moon_h,moon_l,day_h,day_l,sflag,hou_h,hou_l,min_h,min_l,wee);
参 数:温度十位、个位;月十位、个位;日十位、个位;温度正负;时十位、个位;分十位、个位;星期
返回值:无
结 果:显示温度日期时间
备 注:
/**********************************************************************************************/
void display(unsigned char tem_h,tem_l,mon_h,mon_l,day_h,day_l,sflag,hou_h,hou_l,min_h,min_l,w
ee){
//参数 温度十位、个位;月十位、个位;日十位、个位;温
度正负;时十位、个位;分十位、个位;星期。
unsigned char a,c;
if(KEY== 0){
delay1();
while(KEY== 0);
for(a=0;a<6;a++){
c=tem_h*6+a;          //温度十位。
DISPLAY_PIN0(sz[c]);                     
c=66+sflag*6+a;    //温度正负。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=tem_l*6+a;    //温度个位。
DISPLAY_PIN0(sz[c]);
c=90+a;      //“C”。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=a+84;      //“|”。
DISPLAY_PIN0(sz[c]);
c=a+84;      //“|”。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=mon_h*6+a;    //月 十位。
DISPLAY_PIN0(sz[c]);
c=hou_h*6+a;    //时 十位。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=mon_l*6+a;    //月 个位。
DISPLAY_PIN0(sz[c]);
c=hou_l*6+a;    //时 个位。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=78+a;      //“/”。
DISPLAY_PIN0(sz[c]);
c=60+a;      //“:”。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=day_h*6+a;    //日 十位。
DISPLAY_PIN0(sz[c]);
c=min_h*6+a;    //分 十位。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=day_l*6+a;    //日 个位。
DISPLAY_PIN0(sz[c]);
c=min_l*6+a;    //分 个位。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<6;a++){
c=a+84;      //“|”。
DISPLAY_PIN0(sz[c]);
c=a+84;      //“|”。
DISPLAY_PIN1(sz[c]);
DISPLAY_OFF();}
for(a=0;a<16;a++){
c=wee*32+2*a;    //星 期。
DISPLAY_PIN(xq[c],xq[c+1]);} 
}
}
/
*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
void main (void){
init();//初始端口程序
Init_1302();
while(1){
ReadTemperature(); //读取温度
tem_h=tem/10;      //温度十位
tem_l=tem%10;    //温度个位
wee= read_clock(0x8b);
mon= read_clock(0x89);
day= read_clock(0x87);
hou= read_clock(0x85);
min= read_clock(0x83);
mon_h=mon/16;
mon_l=mon%16;
day_h=day/16;
day_l=day%16;
hou_h=hou/16;
hou_l=hou%16;
min_h=min/16;
min_l=min%16;
display(tem_h,tem_l,mon_h,mon_l,day_h,day_l,sflag,hou_h,hou_l,min_h,min_l,wee);
}
}
/**********************************************************************************************/
/************************************************************************
函数功能: 18b20驱
入口参数: 
出口参数:
************************************************************************/
void Delay (int num)//延时函数
{
while(num--) ;
}
能量隔离/************初始化ds1820***********/
void Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1;    //DQ复位
Delay(5); //稍做延时
DQ = 0;    //单片机将DQ拉低
Delay(30); //精确延时 大于 480us
DQ = 1;    //拉高总线
Delay(5);
x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(5);
}
unsigned char ReadOneChar(void)//读一个字节
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(2);
}
return(dat);
}
void WriteOneChar(unsigned char dat)//写一个字节
{
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(2);
DQ = 1;
dat>>=1;
}
}
void ReadTemperature(void)//读取温度
{
unsigned char a=0;//低8位
unsigned char b=0;//高8位
unsigned int x;
float tt=0;
Init_DS18B20();    //初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
sflag=0; //温度零下标志 0:零上,1:零下
if((b&0xf8)!=0x00)
{
sflag=1; //零下标志位置1
a=~a; //低8位取反
b=~b; //高8位取反
tt=a+1; //低8位加1
a=tt;    //计算后重新存入数组
if(tt>255) b++; //如果低8位大于255,向高8位进1
}
x=((b&0x07)*256+a)*.625+0.5; //实际温度放大十倍后四舍五入
tem=x/10;
}
/************************************************************************
函数功能: 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写数据(底层协议)
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;
}
//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);
}
//************设置1302的初始时间*****************/
void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
if(read_clock(0xc1) != 0x88){
write_clock(0x8e,0x00);//允许写操作
write_clock(0x8c,0x09);//年
write_clock(0x8a,0x02);//星期
write_clock(0x88,0x12);//月
write_clock(0x86,0x08);//日
write_clock(0x84,0x22);//小时
write_clock(0x82,0x40);//分钟
2-氯-5-氯甲基噻唑write_clock(0x80,0x00);//秒
write_clock(0x90,0x05);//充电
write_clock(0xc0,0x88);//写入初始化标志RAM(第00个RAM位置)
write_clock(0x8e,0x80);//禁止写操作
}
}
/*************************************************************
升级说明:
091204  在POV_ZIMU程序基础上修改实现效果展示
091208  硬件改造成功,加装ds18b20 ds1302
091208 软件实现温度正常显示
091208  软件实现时间正常显示
*************************************************************/

本文发布于:2024-09-22 04:23:34,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/197518.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:显示   温度   数据   函数   操作   程序   时间
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议