📄 ds1805.lst
字号:
C51 COMPILER V7.50 DS1805 09/05/2007 09:35:03 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE DS1805
OBJECT MODULE PLACED IN ds1805.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1805.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************
2 工程:数字电位器.256级DS1805,的驱动程序
3 功能:使用数字电位器调整电阻让滤波器达到自动增益
4 此芯片为I2C芯片
5 日期:07.09.05
6 *********************************************************/
7 #include <ds89c4xx.h>
8 #include <intrins.h>
9 #include<keyscan.h>
10 #include<LCD12864.h>
11 #include<max262.h>
12 #define uchar unsigned char
13 #define uint unsigned int
14
15 sbit ds1805_dat=P3^7;
16 sbit ds1805_clk=P3^6;
17 sbit t0=P3^4;
18
19 bit ack;
20
21 uchar code0[]={"全国电子设计比赛"};
22 uchar code1[]={"题D:程控滤波设计"};
23 uchar code2[]={"输入频率:00000Hz"};
24 uchar code3[]={"步进频率:00000Hz"};
25
26 /***********************************************************
27 函数名称:display
28 函数功能:显示
29 备 注:加入延时,能够看清楚显示的过程
30 ***********************************************************/
31 void display()
32 {
33 1 uchar i;
34 1 send_command(0x80); //第一行显示
35 1 for (i=0;i<16;i++)
36 1 {
37 2 send_data(code0[i]);
38 2 }
39 1
40 1 send_command(0x90); //第二行显示
41 1 for (i=0; i<16; i++)
42 1 {
43 2 send_data(code1[i]);
44 2 }
45 1
46 1 send_command(0x88); //第三行显示
47 1 for (i=0; i<16; i++)
48 1 {
49 2 send_data(code2[i]);
50 2 }
51 1
52 1 send_command(0x98); //第四行显示
53 1 for(i=0;i<16;i++)
54 1 {
55 2 send_data(code3[i]);
C51 COMPILER V7.50 DS1805 09/05/2007 09:35:03 PAGE 2
56 2 }
57 1 }
58
59
60 /***************************************
61 延时
62 ***************************************/
63 void Sdelay(void)
64 {
65 1 uchar n;
66 1 for(n=4;n>0;n--);
67 1 }
68
69 /*************************************
70 函数:void start_ds1805()
71 功能:I2C开始起动
72 *************************************/
73 void start_ds1805()
74 {
75 1 ds1805_dat=1;
76 1 ds1805_clk=1; //启动总线
77 1 Sdelay();
78 1 ds1805_dat=0; // Tsu:start=4.7uS
79 1 Sdelay();
80 1 ds1805_clk=0; // Thd:start=4uS
81 1
82 1 }
83 /*******************************************************************
84 函数原型: void Stop_I2c();
85 功能: 结束I2C总线,即发送I2C结束条件.
86 ********************************************************************/
87 void stop_ds1805()
88 {
89 1 ds1805_dat=0; //释放总线
90 1 Sdelay();
91 1 ds1805_clk=1;
92 1 Sdelay();
93 1 ds1805_dat=1; // Tsu:stop=4uS
94 1
95 1 }
96 /*******************************************************************
97 字节数据传送函数
98 函数原型: void SendByte(uchar c);
99 功能:将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
100 此状态位进行操作.(不应答或非应答都使ack=0 假)
101 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
102 ********************************************************************/
103 void ds1805_send8bit(uchar ch)
104 {
105 1 uchar i;
106 1 for(i=0;i<8;i++)
107 1 {
108 2 ds1805_dat=(bit)(ch&0x80);
109 2 _nop_();
110 2 ch<<=1;
111 2 ds1805_clk=1;
112 2 _nop_();
113 2 ds1805_clk=0;
114 2 _nop_();
115 2 }
116 1 }
117
C51 COMPILER V7.50 DS1805 09/05/2007 09:35:03 PAGE 3
118 /***************************************************************
119 字节数据传送函数
120 函数: uchar ds1805_receive8bit();
121 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
122 发完后请用应答函数。
123 *****************************************************************/
124
125 uchar ds1805_receive8bit(void)
126 {
127 1 uchar a, b=0;
128 1 for(a=0;a<8;a++)
129 1 {
130 2 ds1805_clk = 1;
131 2 b=b<<1;
132 2 if (ds1805_dat==1)
133 2 b=b|0x01; //按位或
134 2 ds1805_clk = 0;
135 2 }
136 1 return(b);
137 1 }
138
139 /********************************************************************
140 应答子函数
141 原型: bit Ack_I2c(bit a);
142
143 功能:主控器进行应答信号,(可以是应答或非应答信号)
144 ********************************************************************/
145 bit ds1805_ack(void)
146 {
147 1 bit ack;
148 1 ds1805_dat = 1;
149 1 ds1805_clk = 1;
150 1 if(ds1805_dat==1) //如果SDA为高电平表示从器件无应答
151 1 ack = 1;
152 1 else
153 1 ack = 0; //如果SDA为低电平表示从器件有应答
154 1 ds1805_clk = 0;
155 1 return (ack); //返回应答标志
156 1 }
157 /*************************写入数据*********************/
158 void ds1805_write(uchar Address,uchar Data)
159 {
160 1 do
161 1 { // 启动总线
162 2 start_ds1805();
163 2 ds1805_send8bit(0x50); //主器件向从器件发送地址(R/W=0为写)
164 2 }
165 1 while(ds1805_ack()); //从器件若无应答一直循环
166 1
167 1 ds1805_send8bit(Address); //发送从器件内部存储的地址
168 1 ds1805_ack(); //主器件发送应答信号
169 1 ds1805_send8bit(Data); //主器件向从器件发送数据
170 1 ds1805_ack(); //主器件发送应答信号
171 1 stop_ds1805(); //释放总线
172 1 }
173 /*******************************
174 ds1805_read(地址,数据),读一个字节
175 ***********************************/
176 uchar ds1805_read(uchar Address)
177 {
178 1 uchar c;
179 1 do
C51 COMPILER V7.50 DS1805 09/05/2007 09:35:03 PAGE 4
180 1 {
181 2 start_ds1805(); // 启动总线
182 2 ds1805_send8bit(0x50);//主器件向从器件发送地址(R/W=0为写)
183 2 }
184 1 while(ds1805_ack()); //i2c_ack()=1,表示无确认,再次发送
185 1
186 1 ds1805_send8bit(Address); //发送从器件内部存储的地址
187 1 ds1805_ack(); //发送应答信号
188 1
189 1 do
190 1 {
191 2 start_ds1805(); // 再次启动总线
192 2 ds1805_send8bit(0x51);//主器件向从器件发送地址(R/W=1为读)
193 2 }
194 1 while(ds1805_ack()); //从器件若无应答一直循环
195 1 c=ds1805_receive8bit(); //从器件数据输出
196 1 ds1805_ack(); //发送应答信号
197 1 stop_ds1805(); //释放总线
198 1 return(c);
199 1 }
200 /***************中断函数***********************/
201 void time_0() interrupt 1
202 {
203 1 t0=~t0;
204 1 }
205 /*****************************************************
206 主函数
207 ******************************************************/
208 void main()
209 {
210 1 PMR=0x11; //4x(0x11)/2x(0x10) 内部CLK为晶振的n倍频
211 1 CKMOD=0x08; // 定时器0周期为内部CLK
212 1 EA=1;
213 1 ET0=1;
214 1 EX0=1;
215 1 IT0=1; //开INT0中断,设定负跳沿触发方式
216 1 TMOD=0x22; //设定T0 T1为16位方式
217 1 TH0=TL0=0xf4; //T0装初值(50ms)
218 1 TR0=1; //启动T0
219 1 lni_lcd(); //初始化lcd
220 1 while(1)
221 1 {
222 2 ds1805_send8bit(0xf0);
223 2 display();
224 2 }
225 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 941 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 88 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -