Ⅰ 51单片机的138编译器的输入脚只能是p2~2,3,4吗为什么改一下就不对
他的输入脚和你编程时的设置有关系,可以从P0~P3的任意引脚,当然除P0外其他要加上拉电阻。
你在程序里吧他的引脚定义按你外围实际接线改一下就可以了。
Ⅱ CC程序员实用大全怎么样
译者序 第一章 C语言入门 1 编程简介 2 创建ASCII码源文件 3 编译C程序 4 语法错误 5 典型的C程序结构 6 往程序里添加语句 7 在新的一行上显示输出结果 8 C语言区分大小写字母 9 逻辑错误BUG 10 程序开发过程 11 文件类型 12 进一步了解连接器 13 头文件 14 帮助编译器查找头文件 15 加速编译 16 注释程序 17 提高程序的可阅读性 18 注意编译器警告信息 19 控制编译器警告 20 用注释屏蔽警告 21 名字的重要性 22 分号的作用 23 变量 24 给变量赋值 25 变量类型 26 定义同一类型的多个变量 27 定义变量时加上注释 28 给变量赋初值 29 在定义时初始化多个变量 30 使用有意义的变量名 31 C关键字 32 整型变量 33 字符型变量 34 浮点型变量 35 双精度型变量 36 给浮点型变量赋值 37 类型标识符 38 无符号类型标识符 39 LONG长类型标识符 40 联合使用无符号和长类型标识符 41 使用大数值 42 寄存器类型标识符 43 短SHORT类型标识符 44 从类型申明中去掉INT 45 有符号类型示识符 46 多赋值运算符 47 把变量的值赋给另一种类型的变量 48 创建用户自己的类型 49 赋给十六进制或八进制值 50 溢出 51 精确度 52 赋值为引号或其他字符 53 PRINTF入门 54 使用PRINTF显示整型数值 55 打印八进制或十六进制整数 56 用PRINTF显示无符号整型数值 57 用PRINTF显示长整型数值 58 用PRINTF显示浮点型数值 59 用PRINTF显示字符型数值 60 用指数格式显示浮点数 61 显示浮点数 62 用PRINTF显示字符串 63 用PRINTF显示指针地址 64 在数值前添加正号和负号 65 用PRINTF格式化整数值 66 0填充整数输出 67 在八进制和十六进制数前显示前缀 68 用PRINTF格式化浮点数 69 格式化指数输出 70 左对齐PRINTF的输出 71 联合使用格式符 72 字符串的换行 73 显示NEAR和FAR字符 74 使用PRINTF的转义字符 75 判断PRINTF已显示的字符数目 76 使用PRINTF的返回值 77 使用ANSI设备驱动器 78 用ANSI驱动器清除屏幕显示 79 用ANSI驱动器显示屏幕颜色 80 用ANSI驱动器定位光标 81 在C中作基本的数学运算 82 模运算(取余运算) 83 运算符的优先级和结合性 84 强制操作符运算顺序 85 C的自增运算符 86 C的自减运算符 87 按位或运算 88 按位与运算 89 按位异或运算 90 “取反”运算 91 对变量的值进行运算 92 C的条件运算符 93 C的长度SIZEOF运算符 94 移位运算 95 位循环运算 96 条件运算符 97 循环控制 98 C如何表示真TRUE和假FALSE 99 用IF判断条件 100 简单语句和复杂语句 101 判断是否相等 102 关系判断 103 用逻辑与判断两个条件 104 用逻辑或判断两个条件 105 逻辑非运算 106 将条件结果赋值给变量 107 在复合语句中定义变量 108 使用缩进来提高程序的可读性 109 使用扩展CTRL+BREAK检查 110 判断浮点数 111 永远循环下去 112 赋值判断 113 IF-IF-ELSE语句 114 按规定次数执行语句 115 FOR语句的有些部分是可选择的 116 在FOR语句中赋值 117 控制FOR循环的增值 118 在FOR循环中使用字符型和浮点型数值 119 空循环 120 无穷循环 121 在FOR循环中使用逗号运算符 122 不要在FOR循环中改变控制变量的值 123 用WHILE循环重复执行一条或多条语句 124 WHILE循环的组成部分 125 使用DO重复执行一条或多条语句 126 C的CONTINUE语句 127 使用C的BREAK语句来结束循环 128 GOTO语句分支 129 判断多个条件 130 在SWITCH中使用BREAK 131 使用SWITCH语句的DEFAULT CASE 第二章 宏与常量 132 在程序中定义常量 133 宏与常量扩展 134 给常量和宏命名 135 使用-FILE-预处理器常量 136 使用-LINE-预处理器常量 137 改变预处理器的行计数 138 生成无条件预处理器错误 139 其他预处理器常量 140 记录预处理器的日期和时间 141 判断是否进行ANSIC编译 142 判断是C++还是C 143 取消宏或常量 144 比较宏与函数 145 编译器PRAGMAS 146 预定义值和宏 147 创建用户自己的头文件 148 使用#INCLUDE<FILENAME.H>或#INCLUDE“FILENAME.H” 149 判断符号是否被定义 150 进行IF-ELSE预处理 151 更强大的预处理器条件判断 152 实现IF-ELSE和ELSE-IF预处理 153 定义需要多行的宏和常量 154 创建自定义宏 155 在宏定义中不要放置分号 156 创建MIN和MAX宏 157 创建SQUARE CUBE宏 158 注意宏定义中的空格 159 如何使用括号 160 宏是没有类型的 第三章 字符串 161 C字符串的形象化 162 编译器是如何表示字符串的 163 C是如何存储字符串的 164 ‘A’是如何区别于‘A’的 165 在字符串常量内表示引号 166 判断字符串的长度 167 使用STRLEN函数 168 将一个字符串的字符复制到另一个字符串中 169 将一个串的内容追加到另一个串上 170 给字符串追加N个字符 171 把一个字符串转移到另一个字符串 172 不要越过字符串的界限 173 判断两个字符串是否相同 174 比较字符串时忽略大小写 175 将字符串转换成大写或小写 176 获取字符串中第一次出现的某个字符 177 返回索引到串的首次出现 178 搜索字符在字符串中的末次出现 179 返回指向字符中末次出现的索引 180 使用FAR字符串 181 为FAR字符串编写字符串函数 182 计算字符串的内容反转 183 将字符串的内容反转 184 将某特定字符赋给整个字符串 185 比较两个字符串 186 比较两个字符中的前N个字符 187 不考虑大小写比较字符串 188 将字符串转换成数字 189 复制字符串的内容 190 从给定字符序列中查找字符的首次出现 191 在字符串中查找子字符串 192 计算子字符串出现的次数 193 给子字符串获取索引 194 获取子字符串的最右端出现 195 不使用%2格式标识符显示字符串 196 从字符串中删除子字符串 197 用另一个子字符串代替子字符串 198 转换数值的ASCII码形式 199 判断字符是否为字母数字 200 字符是否为字母 201 判断字符是否包含ASCII值 202 判断字符是否为控制符 203 判断字符是否为数字 204 判断字符是否为图形字符 205 判断字符是大写还是小写 206 判断字符是否可打印 207 判断字符是否为标点符号 208 判断字符是否包含空白符 209 判断字符是否为十六进制值 210 将字符转换成大写形式 211 将字符转换成小写形式 212 使用ASCII字符 213 将输出格式写进字符串变量 214 从字符串中读输入 215 标志字符串以节省空间 216 初始化字符串 第四章 函数 217 函数 218 在函数中使用变量 219 把MAIN当作函数 220 参数简介 221 使用多参数 222 老式C程序中的参数申明 223 函数返回值 224 RETURN语句 225 函数原型 226 运行时程序库 227 形参和实参 228 解决名称冲突 229 返回类型为非INT型的函数 230 局部变量 231 函数如何使用堆栈 232 函数的开销 233 C如何存储局部变量 234 申明全局变量 235 避免使用全局变量 236 解决全局和局部变量的名称冲突 237 更好地定义全局变量的有效范围 238 传值调用 239 使用传值调用防止参数值变化 240 传址调用 241 获取地址 242 使用变量的地址 243 改变参数的值 244 只改变指定参数 245 使用堆栈进行传址调用 246 记住函数变量的值 247 C是如何初始化静态变量的 248 使用PASCAL调用顺序 249 PASCAL关键字的影响 250 混合编程示例 251 CDECL关键字 252 递归函数 253 递归阶乘函数 254 另一个递归的例子 255 进一步理解递归 256 直接递归与间接递归 257 判断是否要使用递归 258 为什么递归函数慢 259 如何消除递归 260 将字符串传递给函数 261 传递指定的数组元素 262 形式参数中的CONST 263 使用CONST不会阻止参数值的修改 264 无界字符串的申明 265 指针的使用与字符串的申明 266 C是如何使用堆栈处理字符串参数的 267 外部变量 268 应用外部变量 269 外部静态变量 270 VOLATILE关键字 271 调用结构和基指针 272 调用汇编语言函数 273 从汇编语言函数中返回值 274 没有返回值的函数 275 不使用参数的函数 276 AUTO关键字 277 范围 278 范围的分类 279 名称空间和标识符 280 标识符的可见性 281 DURATION 282 支持参数个数可变的函数 283 支持个数可变的参数 284 VA-START、VA-ARG和VA-END是如何工作的 285 创建支持多参数多类型的函数 第五章 键盘操作 286 从键盘读入字符 287 显示字符输出 288 缓冲输入 289 将键盘输入赋组合字符串 290 联合使用GETCHAR和PUTCHA 291 记住GETCHAR和PUTCHAR都是宏 292 使用直接I/O读入字符 293 不显示字符的直接键盘输入 294 知道何时使用‘\R’和‘\N’ 295 直接输出 296 将按键放回键盘缓存 297 使用CPPINTF快速格式化输出 298 快速格式化键盘输入 299 写字符串 300 使用直接I/O实现更快的字符串输出 301 从键盘读入字符串 302 以更快的速度从键盘输入字符串 303 以彩色显示输出 304 清除屏幕显示 305 删除当前行到行尾的内容 306 删除屏幕上的当前行 307 定位光标进行屏幕输出 308 判断行与列的位置 309 在屏幕上插入空行 310 将屏幕上的文本拷贝到缓冲区 311 将缓冲区中的文本拷贝到屏幕的指定位置 312 判断文本模式设置 313 控制屏幕颜色 314 指定背景色 315 使用TEXTCOLOR设置前景色 316 使用TEXTBACKGROUND设置背景色 317 控制文本的明暗度 318 决定当前文本模式 319 在屏幕上移动文本 320 定义文本窗口 第六章 数学 321 使用整型表达式的绝对值 322 使用ARCCOSINE反余弦 323 使用ARCSINE反正弦 324 使用ARCTANGENT反正切 325 求复数的绝对值 326 对浮点值进位舍入 327 使用角的余弦 328 使用角的双曲余弦 329 使用角的正弦 330 使用角的双曲正弦 331 使用角的正切 332 使用角的双曲正切 333 整数相除 334 使用指数 335 使用浮点型表达式的绝对值 336 使用浮点余数 337 使用浮点值的尾数和指数 338 计算X*2E的结果 339 计算自然对数 340 计算LOG10X的值 341 判断最大值与最小值 342 把浮点值分解成整数和小数部分 343 计算Xn的结果 344 计算1010的结果 345 生成随机数 346 将随机值映射到指定范围 347 给随机数生成器赋初值 348 计算数值的平方根 349 创建定制数学错误处理程序 第七章 文件、目录和磁盘 350 判断当前盘驱动器 351 选择当前驱动器 352 判断可用的盘空间 353 当心DBLSPACE 354 读入文件分配表FAT信息 355 磁盘ID 356 绝对扇区读写操作 357 进行BIOS磁盘I/O 358 测试软驱是否准备好 359 应用FOPEN打开文件 360 FILE结构 361 关闭一个打开的文件 362 每次读/写文件信息的一个字符 363 文件指针的位置指针 364 判断当前文件位置 365 文件流 366 文件翻译 367 CONFIG.SYS文件的FILES=条目 368 使用低级和高级文件I/O 369 文件句柄FILE HANDLES 370 进程文件表PROCESS FILE TABLE 371 进程文件表入口 372 系统文件表 373 显示系统文件表 374 从流指针中导出文件句柄 375 进行格式化文件输出 376 重命名文件 377 删除文件 378 判断程序如何访问文件 379 设置文件的访问模式 380 深入掌握文件属性 381 检测文件流错误 382 判断文件的长度 383 刷新I/O流 384 一次关闭所有被打开的文件 385 获取文件流的文件句柄 386 使用P-TMPDIR创建临时文件名 387 使用TMP或TEMP创建临时文件名 388 创建真正的临时文件 389 删除临时文件 390 为文件搜索命令路径 391 为文件搜索环境入口的子目录 392 打开TEMP目录中的文件 393 最小化文件I/O操作 394 在目录名中使用反斜杠 395 改变当前目录 396 创建目录 397 删除目录 398 删除目录树 399 建立完全路径名 400 分解目录路径 401 建立路径名 402 使用低级函数打开和关闭文件 403 创建文件 404 进行低级读写操作 405 判断文件是否结束 406 应用低级文件例行程序 407 为文件句柄翻译指定模式 408 打开LSEEK定位文件指针 409 打开多于20个的文件 410 使用DOS文件服务 411 获取文件的日期和时间标记 412 利用位域获取文件的日期与时间 413 设置文件的日期与时间标记 414 把文件日期和时间设置成当前日期和时间 415 每次读写一个字 416 改变文件的长度 417 控制文件打开操作的读写模式 418 将缓冲区赋给文件 419 分配文件缓冲区 420 利用MKTEMP创建唯一文件名 421 读写结构 422 从文件流中读取结构数据 423 复制文件句柄 424 强制文件句柄设置 425 把文件句柄和文件流联系起来 426 文件共享 427 打开文件进行共享访问 428 锁定文件内容 429 获取更精细的文件锁定控制 430 使用DOS目录 431 打开目录 432 读取目录入口 433 利用目录服务读C:\WINDOWS 434 反绕目录 435 递归读取磁盘文件 436 判断当前文件位置 437 打开共享文件流 438 在指定目录中创建唯一文件 439 创建新文件 440 利用DOS服务访问文件 441 强制二进制或文本文件打开 442 按行写文本 443 按行读文本 444 应用FGETS和FPUTS 445 强制二进制文件翻译 446 为什么TEXTCOPY不能拷贝二进制文件 447 判断文件结尾 448 舍弃字符 449 读取格式化的文件数据 450 根据当前位置定位文件指针 451 获取文件句柄信息 452 重新打开文件流 第八章 数组、指针和结构 453 数组 454 申明数组 455 形象表示数组 456 数组的内存需求 457 初始化数组 458 访问数组元素 459 通过循环访问数组元素 460 使用常量定义数组 461 把一个数组传送给函数 462 把数组看作函数 463 区分字符串数组 464 在堆栈中传送数组 465 判断数组能存放多少个元素 466 为大数组使用HUGE内存模式 467 权衡数组与动态存储的利弊 468 多维数组 469 行与列 470 访问二维数组的元素 471 给二维数组元素赋初值 472 判断多维数组占用的内存 473 通过循环显示二维数组 474 遍历三维数组 475 初始化多维数组 476 把二维数组传送给函数 477 把多维数组当作一维数组 478 C是如何存放多维数组的 479 按行存放与按列存放 480 以数组为成员的结构数组 481 联合 482 使用联合节省内存 483 使用REGS——一种典型的联合 484 应用REGS联合中 485 位字段结构 486 形象表示位字段结构 487 位字段结构的取值范围 488 在数组中查找指定的值 489 对分查找 490 应用对分查找法 491 对数组进行排序 492 冒泡排序法 493 应用冒泡排序法 494 选择排序法 495 应用选择排序法 496 SHELL希尔排序法 497 应用SHELL排序法 498 快速排序法 499 应用快速排序法 500 上述排序方法的遗留问题 501 对字符串数组排序 502 利用LFIND搜索字符串 503 利用LSEARCH搜索数值 504 利用BSEARCH搜索已排序数组 505 利用QSORT对数组排序 506 判断数组元素的个数 507 把指针理解为地址 508 判断变量的地址 509 C是如何把数组当成指针的 510 对数组应用取地址运算符 (&) 511 申明指针变量 512 间接访问指针 513 使用指针值 514 指针与函数参数的使用 515 指针运算 516 指针的增值与减值 517 联合应用指针引用与增值 518 利用指针遍历数组 519 利用返回值为指针的函数 520 创建返回值为指针的函数 521 指针数组 522 形象表示字符串数组 523 遍历字符串数组 524 把字符串数组当成指针 525 使用指向一个指向字符串的指针的指针 526 利用指针申明字符串常量 527 VOID类型指针 528 创建指向函数的指针 529 使用指向函数的指针 530 使用三级指针 531 结构 532 结构是变量申明的模板 533 结构标记是结构的名称 534 用不同的方式申明结构 535 结构成员 536 形象表示结构 537 应用结构 538 把结构传递给函数 539 在函数内部改变结构 540 (*point).member间接引用 541 使用pointer-->member格式 542 使用无标记结构 543 结构定义的范围 544 初始化结构 545 进行结构I/O 546 使用嵌套结构 547 包含数组的结构 548 创建结构数组 第九章 DOS和BIOS服务 549 DOS系统服务 550 BIOS服务 551 寄存器 552 标志寄存器 553 软件中断 554 利用BIOS访问指针 555 CONTROL+BREAK信息 556 可能的DOS副作用 557 暂时挂起程序 558 控制声音 559 获取国家专用的信息 560 磁盘传输地址 561 访问和控制磁盘传输区 562 BIOS键盘服务 563 获取BIOS设备列表 564 控制串行口I/O 565 利用BDOS访问DOS服务 566 获取扩展DOS错误信息 567 判断BIOS常规内存数量 568 创建远指针FAR PRINTER 569 把远端地址分解为段地址和偏移地址 570 判断自由核心内存 571 读段寄存器设置 572 内存的类型 573 常规内存 574 常规内存的分布 575 访问常规内存 576 为什么PC和DOS限制于1MB 577 从段和偏移量中产生地址 578 扩充内存 579 使用扩充内存 580 扩展内存 581 实模式和保护模式 582 访问扩展内存 583 高端内存区 584 堆栈 585 各种堆栈配置 586 判断程序的当前堆栈大小 587 使用-STKLEN控制堆栈空间 588 给内存区域赋值 589 拷贝内存区域 590 拷贝内存区域直到某指定字节 591 比较两个无符号字符数组 592 交换两个相邻字符串字节 593 分配动态内存 594 再谈类型转换 595 不再需要时释放内存 596 利用CALLOC函数分配内存 597 堆 598 解决64KB堆限制 599 从堆栈中分配内存 600 分配巨型数据 601 改变被分配内存区域的大小 602 BRK函数 603 检测堆 604 快速堆检测 605 填充自由堆空间 606 检测特定的堆入口 607 遍历堆入口 608 访问指定内存单元 609 向内存中置数 610 PC端口 第十章 内存管理 611 访问端口值 612 CMOS 613 内存模式 614 微型内存模式 615 小型内存模式 616 中型内存模式 617 压缩内存模式 618 大型内存模式 619 巨型内存模式 620 判断当前的内存模式 第十一章 日期和时间 621 获取当前日期与时间 622 将日期和时间从秒的形式转换成ASCII码 623 DAYLIGHT SAVINGS ADJUST MENT 624 延迟若干毫秒 625 判断程序的耗时 626 比较两个时间 627 获取数据串 628 获取时间串 629 读BIOS计时器 630 使用当地时间 631 使用格林威治平时 632 获取DOS系统时间 633 获取系统日期 634 设置DOS系统时间 635 设置DOS系统日期 636 把DOS日期转换为UNIX格式 637 利用TIMZONE计算时差 638 判断当前时区 639 利用TZSET设置时区区域 640 利用TZ环境入口 641 从用户程序中设置TZ环境入口 642 获取时区信息 643 以秒钟的形式设置自1/2/1970午夜以来的系统时间 644 把日期转换成自1/1/1970以来的秒数 645 判断日期的儒略历日期 646 创建格式化日期和时间串 647 PC时钟类型 第十二章 重定向I/O和进程命令行 648 等候按键 649 提醒用户输入密码 650 自己编写密码函数 651 输出重定向 652 输入重定向 653 联合使用INPUT和OUTPUT重定向 654 利用STDOUT和STDIN 655 管道运算符 656 GETCHAR和PUTCHAR 657 对重定向输入进行编号 658 确保信息出现在屏幕上 659 自定义MORE命令 660 显示重定向行的数目 661 显示得定向字符的个数 662 创建定时的MORE命令 663 防止I/O重定向 664 应用STDPRN文件句柄 665 把重定向输出分割到一个文件中 666 应用STDAUX文件句柄 667 在重定向输入人寻找子串的出现 668 显示重定义输入的头N行 669 命令行变元 670 显示命令行变元的个数 671 显示命令行 672 使用引号内的命令行变元 673 从命令行中显示文件内容 674 把ARGV当作指针 675 C是如何知道命令行的 676 环境 677 把ENV当作一个指针 678 对MAIN的参数使用VOID 679 使用命令行数字 680 出口状态值 681 为出口状态过程使用RETURN 682 判断是否把MAIN申明为VOID 683 在环境中搜索特定入口 684 DOS是如何对待环境的 685 应用ENVIRON全局变量 686 给当前环境添加入口 687 给DOS环境添加元素 688 退出当前程序 689 定义在程序结束时执行的函数 第十三章 编程工具 690 库 691 重复使用目标代码 692 编译C和OBJ文件时出现的问题 693 创建库文件 694 常用的库操作 695 列出库文件中的子例行程序 696 利用库减少编译时间 697 库管理程序的其他功能 698 连接器 699 连接器的功能 700 使用连接映像 701 使用连接器响应文件 702 使用MAKE命令简化应用程序的创建 703 生成一个简单的MAKE文件 704 通过MAKE使用多依赖性文件 705 说明用户的MAKE文件 706 MAKE和命令行 707 在MAKE文件中放置多个依赖性 708 显现的和隐含的MAKE法则 709 使用MAKE宏 710 预定义MAKE宏 711 用MAKE执行条件进程 712 验证一个MAKE宏 713 再次包含一个MAKE文件 714 使用MAKE的宏修饰符 715 因错误结束MAKE文件 716 关闭命令显示 717 使用文件BUILTINS.MAK 718 在MAKE中执行出口状态进程 719 同时激活和改变一个宏 720 为多个依赖文件执行一个MAKE命令 第十四章 高级C语言编程 721 判断是否有数学协处理器 722 理解CTYPEH,ISTYPE宏 723 控制直接的视像 724 检查系统和路径错误 725 显示预定义的错误信息 726 决定操作系统版本号 727 理解可移值性 728 执行一个非本地的GOTO 729 获得进程ID(PID) 730 激活一个内部的DOS命令 731 使用-PSP全局变量 732 在变量申明中使用CONST修饰符 733 使用枚举类型 734 放置一个枚举类型来使用 735 理解一个枚举值 736 分配一个特殊的值给枚举类型 737 保存和恢复寄存器 738 动态列表简介 739 申明一个链接的列表结构 740 建立一个链接的列表 741 一个简单的链表例子 742 理解链表转移 743 创建一个更有用的列表 744 增加一个列表入口 745 插入一个列表入口 746 显示一个存储的目录 747 从一个列表中删除一个元素 748 使用一个双向链表 749 创建一个简单的双向链表 750 理解NODE-->PREVIOUS-->NEXT 751 从一个双向链表中移走一个元素 752 在一个双向链表中插入一个元素 753 理解子进程 754 派生一个子进程 755 使用其他的SPAWNLXX函数 756 使用SPAWNVXX函数 757 执行一个子进程 758 使用其他的EXECLXX函数 759 使用EXECVXX函数 760 理解覆盖 761 理解中断 762 PC机的中断 763 使用中断关键字 764 判断一个中断向量 765 设置一个中断向量 766 使能与禁止中断 767 生成简单的中断处理器 768 链接一个二次中断 769 生成一个中断 770 捕获PC机时钟 771 理解致命错误 772 C语言中的致命错误处理器 773 一个更完全的致命错误处理器 774 恢复改变过的中断 775 生成一个Ctrl+Break处理器 776 在用户的致命错误处理器使用DOS服务 777 使用指令集选择改善性能 778 直接插入内部函数 779 使能和禁止内在函数 780 理解快速函数调用 781 -FASTCALL参数传递的法则 782 理解不变代码 783 理解冗载入禁止 784 理解代码紧缩 785 理解循环紧缩 786 理解循环引入和强度削减 787 消除普通的子表达式 788 标准C语言转换 789 理解C语言的4个基本类型 790 基本类型与派生类型 791 理解初始化值 792 理解连接 793 理解临时申明 794 申明和定义 795 理解左值LVALUE 796 理解右值RVALUE 797 使用段寄存器关键字 798 谨慎使用远指针 799 理解正常化的指针 800 数学协处理器语句 801 理解变量中的CDECL和PASCAL 802 防止循环包含 第十五章 C++入门 803 C++介绍 804 C++源文件的差异 805 从简单的C++程序开始 806 理解COUT I/O流 807 使用COUT输出值和变量 808 用COUT连接不同的数据类型 809 显示十六进制和八进制数值 810 重定向COUT 811 如果钟情PRINTF,使用PRINTF 812 输出 CERR 813 用CIN得到输入 814 CIN不要使用指针 815 理解CIN如何选择数据域 816 理解输入输出流如何获得变量类型 817 使用CLOG实现输出 818 CIN、OCUT、CERR和CLOG是类的实例 819 使用FLUSH操纵符快速输出 820 理解ISOTREAM.H头文件包含的内容 821 C++需要函数原型 822 C++增加的新关键字 823 C++支持匿名联合 824 分辨全局范围 825 提供缺省参数值 826 控制COUT的输出宽度 827 使用SETW设置COUT宽度 828 指定COUT的填充字符 829 左对齐和右对齐COUT的输出 830 控制COUT显示浮点数字的数目 831 以小数或科学记数格式显示数值 832 恢复COUT至默认值 833 设置输入输出基数 834 在需要的地方定义变量 835 在函数原型中放置默认参数值 836 使用按位运算符及COUT 837 理解迟缓或短路计算 838 在C++中使用CONST关键字 839 在C++中使用ENUM关键字 840 理解自由空间 841 用NEW分配内存 842 为多个数组分配内存 843 无自由空间的测试 844 关于堆空间 845 使用FAR指针和NEW运算符 846 释放内存至自由空间 847 理解C++中的引用 848 给函数传递引用 849 防止隐藏对象 850 用三种方法传递参数 851 使用引用的规则 852 函数可返回引用 853 使用INLINE关键字 854 使用C++的ASM关键字 855 用CIN读字符 856 用COUT写字符 857 简单过滤器程序 858 简单的TEE命令 859 简单的FIRST 860 更好的FIRST命令 861 文件结束测试 862 用ENDL产生新行 863 理解连接规范 864 理解重载 865 重载函数 866 重载函数的第二个例子 867 避免不明确的重载 868 使用CIN每次读一行 869 在循环中使用CIN.GETLINE 870 改变NEW运算符的缺省处理器 871 用SET-NEW-HANDLER函数设置NEW处理器 872 判断C++编译 873 理解C++中的结构 874 结构中定义函数成员 875 在结构内定义成员函数 876 在结构外定义成员函数 877 给成员函数传递参数 878 同一结构的多个变量 879 不同结构具有同名函数成员 880 同名成员不同函数 第十六章 对象 881 理解对象 882 理解面向对象编程 883 理解为什么使用对象 884 把程序分解成对象 885 理解对象和类 886 理解C++的类 887 理解封装 888 理解多态性 889 理解继承 890 类和结构的选择 891 创建简单类模型 892 实现简单类的程序 893 定义类构件 894 理解作用域分辨符 895 在申明中使用或省略类名 896 理解PUBLIC:标志 897 理解信息隐藏 898 理解PRIVATE:标志 899 理解PROTECTED:标志 900 使用公用和私数据 901 决定什么隐藏什么公开 902 公用方法常称为接口函数 903 在类外定义类函数 904 在类的内部和外部定义方法 905 理解对象实例 906 对象实例共享代码
Ⅲ pcm编译器系统实验过程中发现的问题
1. 点到点PCM多路电话通信原理
脉冲编码调制(PCM)技术与增量调制(ΔM)技术已经在数字通信系统中得到广泛应用。当信道噪声比较小时一般用PCM,否则一般用ΔM。目前速率在155MB以下的准同步数字系列(PDH)中,国际上存在A解和μ律两种PCM编译码标准系列,在155MB以上的同步数字系列(SDH)中,将这两个系列统一起来,在同一个等级上两个系列的码速率相同。而ΔM在国际上无统一标准,但它在通信环境比较恶劣时显示了巨大的优越性。
点到点PCM多路电话通信原理可用图9-1表示。对于基带通信系统,广义信道包括传输媒质、收滤波器、发滤波器等。对于频带系统,广义信道包括传输媒质、调制器、解调器、发滤波器、收滤波器等。
本实验模块可以传输两路话音信号。采用TP3057编译器,它包括了图9-1中的收、发低通滤波器及PCM编译码器。编码器输入信号可以是本实验模块内部产生的正弦信号,也可以是外部信号源的正弦信号或电话信号。本实验模块中不含电话机和混合电路,广义信道是理想的,即将复接器输出的PCM信号直接送给分接器。
2. PCM编译码模块原理
本模块的原理方框图图9-2所示,电原理图如图9-3所示(见附录),模块内部使用+5V和-5V电压,其中-5V电压由-12V电源经7905变换得到。
图9-2 PCM编译码原理方框图
该模块上有以下测试点和输入点:
• BS PCM基群时钟信号(位同步信号)测试点
• SL0 PCM基群第0个时隙同步信号
• SLA 信号A的抽样信号及时隙同步信号测试点
• SLB 信号B的抽样信号及时隙同步信号测试点
• SRB 信号B译码输出信号测试点
• STA 输入到编码器A的信号测试点
• SRA 信号A译码输出信号测试点
• STB 输入到编码器B的信号测试点
• PCM PCM基群信号测试点
• PCM-A 信号A编码结果测试点
• PCM-B 信号B编码结果测试点
• STA-IN 外部音频信号A输入点
• STB-IN 外部音频信号B输入点
本模块上有三个开关K5、K6和K8,K5、K6用来选择两个编码器的输入信号,开关手柄处于左边(STA-IN、STB-IN)时选择外部信号、处于右边(STA-S、STB-S)时选择模块内部音频正弦信号。K8用来选择SLB信号为时隙同步信号SL1、SL2、SL5、SL7中的某一个。
图9-2各单元与电路板上元器件之间的对应关系如下:
•晶振 U75:非门74LS04;CRY1:4096KHz晶体
•分频器1 U78:A:U78:D:触发器74LS74;U79:计数器74LS193
•分频器2 U80:计数器74LS193;U78:B:U78:D:触发器74LS74
•抽样信号产生器 U81:单稳74LS123;U76:移位寄存器74LS164
•PCM编译码器A U82:PCM编译码集成电路TP3057(CD22357)
•PCM编译码器B U83:PCM编译码集成电路TP3057(CD22357)
•帧同步信号产生器 U77:8位数据产生器74HC151;U86:A:与门7408
•正弦信号源A U87:运放UA741
•正弦信号源B U88:运放UA741
•复接器 U85:或门74LS32
晶振、分频器1、分频器2及抽样信号(时隙同步信号)产生器构成一个定时器,为两个PCM编译码器提供2.048MHz的时钟信号和8KHz的时隙同步信号。在实际通信系统中,译码器的时钟信号(即位同步信号)及时隙同步信号(即帧同步信号)应从接收到的数据流中提取,方法如实验五及实验六所述。此处将同步器产生的时钟信号及时隙同步信号直接送给译码器。
由于时钟频率为2.048MHz,抽样信号频率为8KHz,故PCM-A及PCM-B的码速率都是2.048MB,一帧中有32个时隙,其中1个时隙为PCM编码数据,另外31个时隙都是空时隙。
PCM信号码速率也是2.048MB,一帧中的32个时隙中有29个是空时隙,第0时隙为帧同步码(×1110010)时隙,第2时隙为信号A的时隙,第1(或第5、或第7 —由开关K8控制)时隙为信号B的时隙。
本实验产生的PCM信号类似于PCM基群信号,但第16个时隙没有信令信号,第0时隙中的信号与PCM基群的第0时隙的信号也不完全相同。
由于两个PCM编译码器用同一个时钟信号,因而可以对它们进行同步复接(即不需要进行码速调整)。又由于两个编码器输出数据处于不同时隙,故可对PCM-A和PCM-B进行线或。本模块中用或门74LS32对PCM-A、PCM-B及帧同步信号进行复接。在译码之前,不需要对PCM进行分接处理,译码器的时隙同步信号实际上起到了对信号分路的作用。
3. TP3057简介
本模块的核心器件是A律PCM编译码集成电路TP3057,它是CMOS工艺制造的专用大规模集成电路,片内带有输出输入话路滤波器,其引脚及内部框图如图9-4、图9-5所示。引脚功能如下:
图9-4 TP3057引脚图
(1) V一 接-5V电源。
(2) GND 接地。
(3) VFRO 接收部分滤波器模拟信号输出端。
(4) V+ 接+5V电源。
(5) FSR 接收部分帧同信号输入端,此信号为8KHz脉冲序列。
(6) DR 接收部分PCM码流输入端。
(7) BCLKR/CLKSEL 接收部分位时钟(同步)信号输入端,此信号将PCM码流在FSR上升沿后逐位移入DR端。位时钟可以为64KHz到2.048MHz的任意频率,或者输入逻辑“1”或“0”电平器以选择1.536MHz、1.544MHz或2.048MHz用作同步模式的主时钟,此时发时钟信号BCLKX同时作为发时钟和收时钟。
(8) MCLKR/PDN 接收部分主时钟信号输入端,此信号频率必须为1.536MHz、1.544MHz或2.048MHz。可以和MCLKX异步,但是同步工作时可达到最佳状态。当此端接低电平时,所有的内部定时信号都选择MCLKX信号,当此端接高电平时,器件处于省电状态。
(9) MCLKX 发送部分主时钟信号输入端,此信号频率必须为1.536MHz、1.544MHz或2.048MHz。可以和MCLKR异步,但是同步工作时可达到最佳状态。
(10) BCLKX 发送部分位时钟输入端,此信号将PCM码流在FSX信号上升沿后逐位移出DX端,频率可以为64KHz到2.04MHz的任意频率,但必须与MCLKX同步。
图9-5 TP3057内部方框图
(11) DX 发送部分PCM码流三态门输出端。
(12) FSX 发送部分帧同步信号输入端,此信号为8KHz脉冲序列。
(13) TSX 漏极开路输出端,在编码时隙输出低电平。
(14) GSX 发送部分增益调整信号输入端。
(15) VFXi- 发送部分放大器反向输入端。
(16) VFXi+ 发送部分放大器正向输入端。
TP3057由发送和接收两部分组成,其功能简述如下。
发送部分:
包括可调增益放大器、抗混淆滤波器、低通滤波器、高通滤波器、压缩A/D转换器。抗混淆滤波器对采样频率提供30dB以上的衰减从而避免了任何片外滤波器的加入。低通滤波器是5阶的、时钟频率为128MHz。高通滤波器是3阶的、时钟频率为32KHz。高通滤波器的输出信号送给阶梯波产生器(采样频率为8KHz)。阶梯波产生器、逐次逼近寄存器(S•A•R)、比较器以及符号比特提取单元等4个部分共同组成一个压缩式A/D转换器。S•A•R输出的并行码经并/串转换后成PCM信号。参考信号源提供各种精确的基准电压,允许编码输入电压最大幅度为5VP-P。
发帧同步信号FSX为采样信号。每个采样脉冲都使编码器进行两项工作:在8比特位同步信号BCLKX的作用下,将采样值进行8位编码并存入逐次逼近寄存器;将前一采样值的编码结果通过输出端DX输出。在8比特位同步信号以后,DX端处于高阻状态。
接收部分:
包括扩张D/A转换器和低通滤波器。低通滤波器符合AT&T D3/D4标准和CCITT建议。D/A转换器由串/并变换、D/A寄存器组成、D/A阶梯波形成等部分构成。在收帧同步脉冲FSR上升沿及其之后的8个位同步脉冲BCLKR作用下,8比特PCM数据进入接收数据寄存器(即D/A寄存器),D/A阶梯波单元对8比特PCM数据进行D/A变换并保持变换后的信号形成阶梯波信号。此信号被送到时钟频率为128KHz的开关电容低通滤波器,此低通滤波器对阶梯波进行平滑滤波并对孔径失真(sinx)/x进行补尝。
在通信工程中,主要用动态范围和频率特性来说明PCM编译码器的性能。
动态范围的定义是译码器输出信噪比大于25dB时允许编码器输入信号幅度的变化范围。PCM编译码器的动态范围应大于图9-6所示的CCITT建议框架(样板值)。
当编码器输入信号幅度超过其动态范围时,出现过载噪声,故编码输入信号幅度过大时量化信噪比急剧下降。TP3057编译码系统不过载输入信号的最大幅度为5VP-P。
由于采用对数压扩技术,PCM编译码系统可以改善小信号的量化信噪比,TP3057采用A律13折线对信号进行压扩。当信号处于某一段落时,量化噪声不变(因在此段落内对信号进行均匀量化),因此在同一段落内量化信噪比随信号幅度减小而下降。13折线压扩特性曲线将正负信号各分为8段,第1段信号最小,第8段信号最大。当信号处于第一、二段时,量化噪声不随信号幅度变化,因此当信号太小时,量化信噪比会小于25dB,这就是动态范围的下限。TP3057编译码系统动态范围内的输入信号最小幅度约为0.025Vp-p。
常用1KHz的正弦信号作为输入信号来测量PCM编译码器的动态范围。
图9-6 PCM编译码系统动态范围样板值
语音信号的抽样信号频率为8KHz,为了不发生频谱混叠,常将语音信号经截止频率为3.4KHz的低通滤波器处理后再进行A/D处理。语音信号的最低频率一般为300Hz。TP3057编码器的低通滤波器和高通滤波器决定了编译码系统的频率特性,当输入信号频率超过这两个滤波器的频率范围时,译码输出信号幅度迅速下降。这就是PCM编译码系统频率特性的含义。
四、实验步骤
1. 熟悉PCM编译码单元工作原理,开关K9接通8KHz(置为1000状态),开关K8置为SL1(或SL5、SL7),开关K5、K6分别置于STA-S、STB-S端,接通实验箱电源。
2. 用示波器观察STA、STB,调节电位器R19(对应STA)、R20(对应STB),使正弦信号STA、STB波形不失真(峰峰值小于5V)。
3. 用示波器观察PCM编码输出信号。
示波器CH1接SL0,(调整示波器扫描周期以显示至少两个SL0脉冲,从而可以观察完整的一帧信号)CH2分别接SLA、PCM-A、SLB、PCM-B以及PCM,观察编码后的数据所处时隙位置与时隙同步信号的关系以及PCM信号的帧结构(注意:本实验的帧结构中有29个时隙是空时隙,SL0、SLA及SLB的脉冲宽度等于一个时隙宽度)。
开关K8分别接通SL1、SL2、SL5、SL7,观察PCM基群帧结构的变化情况。
4. 用示波器观察PCM译码输出信号
示波器的CH1接STA,CH2接SRA,观察这两个信号波形是否相同(有相位差)。
5. 用示波器定性观察PCM编译码器的动态范围。
开关K5置于STA-IN端,将低失真低频信号发生器输出的1KHz正弦信号从STA-IN输入到TP3057(U82)编码器。示波器的CH1接STA(编码输入),CH2接SRA(译码输出)。将信号幅度分别调至大于5VP-P、等于5VP-P,观察过载和满载时的译码输出波形。再将信号幅度分别衰减10dB、20dB、30dB、40dB、45dB、50dB,观察译码输出波形(当衰减45dB以上时,译码输出信号波形上叠加有较明显的噪声)。
也可以用本模块上的正弦信号源来观察PCM编译码系统的过载噪声(只要将STA-S或STB-S信号幅度调至5VP-P以上即可),但必须用专门的信号源才能较方便地观察到动态范围。
Ⅳ 单片机····································
IRcvStr(AT24C02, 0 , &pDat[0], 8);
ISendStr(AT24C02, 0 , &pDat[0], 8);
等,好几个函数没有定义,没有声明,这些函数应该在function。h这个头文件里。
你有两个方法可以解决错误。
第一,重新编写24C04的驱动函数,替换IRcvStr(),和ISendStr()。等
第二,function。h这个文件,放在项目根目录下面,设置编译器的头文件路径。
Ⅳ c语言编程代码
两种方法我写在一起,可以独立拆开。
#include <stdio.h>
void finda1(char a[3][10]);
void finda2(char a[3][10]);
void show(char (*p)[10]);
int main()
{
char a[3][10]={{"gehajl"},{"788a987a7"},{"ccabbbabbb"}};
printf("原数组内容: ");
show(a);
printf(" 1、用数组指针的方法(函数finda1): ");
finda1(a);
printf("执行后: ");
show(a);
printf(" --------------------- ");
char b[3][10]={{"gehajl"},{"788a987a7"},{"ccabbbabbb"}};
printf("原数组内容: ");
show(a);
printf(" 2、用指针数组的方法(函数finda2): ");
finda2(b);
printf("执行后: ");
show(b);
return 0;
}
void finda1(char a[3][10])
{
int i,j;
char (*p)[10]=a;
for(i=0;i<3;i++)
for(j=0;j<10;j++)
if(p[i][j]=='a')
printf("发现:第%d行第%d个元素是‘a’,已替换 ",i+1,j+1),p[i][j]='1';
}
void finda2(char a[3][10])
{
int i,j;
char *p[3]={&a[0][0],&a[1][0],&a[2][0]};
for(i=0;i<3;i++)
for(j=0;j<10;j++)
if(p[i][j]=='a')
printf("发现:第%d行第%d个元素是‘a’,已替换 ",i+1,j+1),p[i][j]='1';
}
void show(char (*p)[10])
{
int i,j;
for(i=0;i<3;i++,printf(" "))
for(j=0;j<10;j++)
printf("%c ",p[i][j]);
}
Ⅵ 请问一下译码器138的工作原理是怎样的!!!尽量详细点!!谢谢
把所使用的每一种二进制代码状态都赋于特定的含义,表示一个特定的信号或对象,叫编码。如用四位二进制数的0000~1001这十种状太,分别表示0~9这十个十进制数码,称为8421编码。反过来把代码的特定含义翻译出来,称为译码。 计算机在处理各种文字符号或数码时,必须把这些信息进行二进制编码,在编码时所使用的第一种二进制代码状态都赋予了特定的含义,即表示一个确定的信号或者对象,实现这种功能的电路叫编码器,如用于键盘的BCD码,ASCII码编码器等。 单片机外围电路用译码器较多,所以在这节课我们主要与大家一起来学习下译码器的工作原理(购买了本站产品的朋友,在我们配套的多媒体教学光盘中有相关的教学内容,建议大家观看),把代码的含义‘翻译’成相应的输出信号,以表示其原意。其功能恰恰与编码器相反。 译码器可以将输入代码的状态翻译成相应的输出信号,以高、低电平的形式在各自的输出端口送出,以表示其意愿。译码器有多个输入端和多个输出端。假如输入的端个数为,每个输出端只能有两个状态,则输出端个数最多有2n个。常用译码器输入、输出端头数来称呼译码器,如3线-8线译码器,4线-10线译码器等。我们经常用到的74138就是一个三线-八线译码器,朋友们可以到我们网站的《芯片资料》频道下载74138的中文资料。 编码、译码的概念我们了解下,下面我们就来重点来讲一下三-八译码器的工作原理,这在我们51单片机的接口电路中也是经常用到的。 74138的工作原理如下图所示: 从上图可看出,74138有三个输入端:A0、A1、A2和八个输出端Q0~Q7。当输入端A0、A1、A2的编码为000时,译码器输出为Q0=0,而Q1~Q7=1。即Q0对应于A0、A1、A2为000状态,低电平有效。A0、A1、A2的另外7种组合见后面的真值表。 图中S1、S2、S3为使能控制端,起到控制译码器是否能进行译码的作用。只有S1为高电平,S2、S3均为低电平时,才能进行译码,否则不论输入羰输入为何值,每个输出端均为1。 下图是输入端A0、A1、A2为000,控制端S1=1、S1=0、S2=0的电平示意图(红色数字为端口电平),大家可按下图进行分析,也可以分析输出端另外七种组合时的输出情况。
采纳哦
Ⅶ 怎么用8279 将数据输出
基于单片机的仪表车床简易数控系统的实现
第2章 数控系统的设计要求
2.1概述
该数控系统是为了适应国内众多的普通机床改造而设计的主要考虑四个方面:
①经济性
既然是用于普通机床的数控化改造,因此,必须充分考虑系统的成本,这是保证达到系统设计目的的关键。这里的成本包括整个系统的成本,包括数控系统、伺服驱动系统及机械传动系统等,其核心在于数控系统的方案选择。
②方便性
数控系统的方便性,又叫“宜人性”,主要反映在系统的编辑部分。编辑(编程)部分是人和系统直接打交道的部分,即所谓的“人机界面”。人机界而应当对用户友好,也就是说编辑(编程)部分应当尽量给用户提供力便、快捷舒适的操作使用环境。系统需从以下几个途径来体现:
●汉化按键,方便各种层次的操作者使用。
●输入、检索、修改尽量一体化。即输入时可以检索、修改,检索时可以修改、输入,并且自动显示程序段号。
●快速检索,即能对程序进行上下翻页显示。
③实用性
经济则数控系统的设计不应追求功能的大而全,应以实用为原则。一般的机械加工只要能具有以下功能即可满足需要:
●直线、圆弧插补。插补速度要充分考虑被机床本身的内在素质,如刚性、抗震性、耐磨性等,不宜过高。
●速度衔接技术,即速度升/降速控制。速度衔接技术可以保证系统在加工过程中实现2段程序间的速度平滑连接,从而避免造成加工刀痕或平台,保证精度。
●动态坐标显示。
●加工程序的掉电保护能力。
●电动刀架控制。采用电动刀架,用软件进行控制,可以提高生产效率。
●细分技术。细分技术是当今经济型数控系统的一项重要技术。它可以有效解决步近电机的低频振荡问题,同时使机床脉冲当量细化,提高控制精度;另外,还可以提高低速加工时的出刀。
④可靠性
由于数控系统工作环境十分恶劣,必须有足够的可靠性才能保证系统稳定运行。
2.2数控系统的性能指标
按照广述设计要求及设想,数控系统的性能指标可归纳为:
●X,Z两轴联动,开环控制方式。
●ISO国际数控标准格式代码编程。
●快速定位。
●具有直线、圆弧插补能力。
●能与上价机串行通信、具有简单的联网能力。
●最大编程尺寸9999.99mm,z轴脉冲当量0.01mm,x轴脉冲当量0.005mm,最大进给速度为0.083m/s(5m/min)。
●预留螺纹加工功能的接口。
●具有连动、点动2种手动加工方式,以及自动连续加工方式。
第3章 总体方案的确定
3.1系统总体方案
本系统在研制过程中,紧紧围绕可靠性、方便性、低成本等设计要求。确定总体方案如下:
3.1.1基于单片机的系统结构
按照上述设计思想,本系统采用基于单片机的系统结构。这种方案结构简单,成本低。考虑到扩展性,主系统采用89S58单片机。AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89S51可为许多嵌入式控制应用系统提供高性价比的解决方案。
1.一个个8位的CPU
2、26个特殊功能寄存器(Special Function Register)
3、一个片内振荡器及时钟电路
4、全静态工作:0Hz-24KHz
5、32条可编程I/O线
6、2个16位可编程定时计数器
7、5个中断优先级2层中断嵌套中断
8、2个全双工串行通信口
9、电源控制模式:低功耗的闲置和掉电模式
10、8031 CPU与MCS-51 兼容
11、4个8位并行(Parallel)I/O口
12、三级程序存储器保密锁定
13、128B 内部RAM
14、内部硬件看门狗电路
15、4k Bytes Flash片内程序存储器(寿命:1000写/擦循环)
16、一个SPI串行接口,用于芯片的在系统编程
17、可寻址64KB的外部ROM和外部RAM的控制电路
这些我们称为单片机的资源(Souce),单片机的应用就是怎么充分合理地利用这些资源,来解决实际中的问题
3.1.2人机界面
(1)采用液晶显示界面
作为一个简易型数控系统,采用了12232汉字图形点阵液晶显示模块,带背光字符型液晶模块作为主显示界面,不采用数码管显示。这样做的目的有3个:
●液晶显示方式具有显示容量大、可以显示所有字符及自定义字符的能力。至于不能显示图形以实现加工曲线动态显示的缺陷,可以通过上仪机模拟仿真加工来弥补。
●液晶显示模块自身具有控制器,可以减轻主CPU的负担。
●使系统具有菜单驱动的基本素质。采用菜单驱功方式实现编辑模块的全屏幕编辑功能,达到友好的人机界面要求。
●可显示汉字和图形。
(2)采用双功能按键设计,简化键盘
系统设计中充分考虑功能的需要、操作方便的需要及系统复杂性的要求三者之间的关系确定系统的大多数按键为双功能键,使得整个系统界面简洁。
3.1.3采用开环控制方式
系统设计的目的决定了系统只能采用开环控制方式。在开环型位置控制系统中,只能采用步进电机作为伺服执行单元。这是由步进电机车身的特性决定的。关于步进电机的特性等详细内容参见本章后续有关章节。
开环控制系统的数控机床结构简单,成本较低,仅适用于加工精度要求不很高的中小型数控机床,特别是简易经济型数控机床。
这类系统比较简单,价格最便宜,可以用于小型车床、铣床、钻床和线切割机床。如下图是常见的两坐标简易数控系统的组成框图。系统软件固化在单片机的存储器中,加工程序可通过键盘或磁带机输入,经系统软件进行编辑处理后输出一个系列脉冲,再经光电隔离,功率放大后大驱动两台步进电机,分别控制机床两个方向的运动,完成位置、轨迹和速度的控制。根据需要,微机还可通过继电器电路,实现对诸如主轴起停、变速、各种辅助电机起停、刀架转位、工件爽紧松开等动作的自动控制,使整个加工过程自动进行。
图3-1开环步进电机与单片机连接电路
单片机控制步进电机拖动的开环系统具有价廉,技术成熟等优点,因而使用较多。但这种系统还存在拖动力矩偏小,过载能力差、速度偏低,精度不够高及其价格随力矩增加成指数卜升等缺点。为此,选用时要注意在适当的范围内发挥其优势。一般主要适用于拖动力矩小于15Nm的小型机床,如C616,C618,C620,C6140等普通车床。对于转矩要求大、功能要求多的机床(如铣床、镗床、钻床及镗铣床)和高精度机床(如坐标镗床)就难于使用,需要开发与其适应的其他经济型数控系统。
3.1.4功能精简,提高可靠性
设计具备简易型数控系统必需的基本功能
●直线、圆弧插补能力。
●端面、台阶的循环加工。
●点动、连动、自动3种运行方式。
●申行通信能力。
3.2系统功能模块及其分析
3.2.1系统功能模块与总体框架
(1)系统操作界面
按照上述
图3-2 系统的人机界面图
复位——系统在死机、工作出错等情况下的总清键,使系统回复设计的原始状态。
运行——自动运行用户的零件加工程序,包括程序的语法检查、数据处理、编译、插补运算及步进电机控制等。
暂停一—自动加工的暂停,是一个乒乓键,按一次,加工暂停,再按一次,继续加工。
换刀一—用于手工换刀,每按一次.电动刀架转一个工位,本系统中为90度。
手动——与“←、↑、→、↓”配合,以实现动作台的连动;在编辑程序时为光标移动键。数字1—9均为双功能键、用于程序输入、用“上下档”键进行切换。
G—一准备功能键,用于ISO加工程序输入。
M——辅助功能键,用于冷却泵的启/停、程序的结束等程序段的输入。
插入—一用于程序编辑过程中“插入修改”方式的切换。也是乒乓键,用块光标或下划线光标指示。
删除——在插入方式下,删除当前的字符;在修改方式下,删除当前光标位置字符。
上页一—程序上翻到上一程序段。相当PC机的PageUp键。
下页——程序下翻到下一程序段。与上页键一样是一个屏幕编辑键。相当PC机的PageDown键。
回车——确认键。
Esc——相当于PC机的Esc键。
(2)系统功能模块与总体框架
系统从总体上分为人机界面模块、伺服执行模块、电动刀架拧制模块、串行通信模块及基于AT89S51单片机的主控模块等5大模块,参见图3-2。各模块的功能分别是:
图3-3 系统模块与总体框架
①人机界面模块
该模块主要完成人机的对话与交流,物理上表现为显示器与键盘,核心功能是加工程序的编辑。由于采用全程菜单驱动形式.使该模块具有较好的友善性。
②伺服执行模块
该模块主要由脉冲分配器、伺服驱动及步进电机等组成,是一个执行单元,按照主机的指令完成工作台与刀具的相对运动,实现车削加工。其速度特性、矩频特性等直接影响加工的精度和速度。
③电动刀架控制模块
采用2继电器方式的4方电动刀架.用软件完成刀架的换刀动作,即刀架电机的正转拾刀→换刀→反转锁紧,是经济型数控系统必不可少的部分,可以提高加工效率,大大减少在加工过程中因手工换刀带来的误差。
④串行通信模块
该模块的功能是完成与上位机的串行通信,采用三线制方式,使系统具有基本的组网能力。
⑤主控模块
主要包括零片微处理器(也括监控程序)、加工程序存储单元及与其他模块的接口电路要完成程序编辑、加工程序处理、软件插补达贸、电动刀架饺制及行程限位保护等。
3.2.2系统软件框架
如图3-4展示了系统软件框图。系统上电后,执行初始化程序、键盘扫描程序。如有“计数显示”、“计数清零”、“点动”等功能键按下,执行其各自的工作子程序后返回初始化程序,并显示其相应的提示符。顺序控制程序也设计成子程序模块,它的主要功能是读入各行程开关及压力继电器的信号状态组合,经分析判断,输出一系列控制信号,完成对工件的自动加工。如按下“点动”键,则显示点动提示符,执行顺序控制程序,即返回初始化程序,如按下“连动”功能键,则首先置连动工作标记(此时,除“返回”键外,其余各键均用软件屏蔽),然后开中断,等待,刀具检测信号,收到中断请求信号后,执行中断服务程序。在中断服务控制中,先后执行顺序控制子程序,键盘扫描及显示子程序,并记录和显示数据。完成一次顺序控制或有“返回”键按下,则返回主程序。回到主程序后,仍判断是否有“返回”键按下,如有,则返回初始化程序。否则,重新等待中断。
采用模块化设计:
①点动,连动,换刀
该模块主要实现工作台在x,z两轴上正、反2个方向的点动、连动操作,以及手动控制换刀等,用于方便对刀、工作原点设置等。
②自动
该模块主要实现加工程序的处理(包括程序语法检查、程序编译、数据处理等)、插补运算步进电机的控制及自动换刀控制等。
③参数设置
该模块主要实现刀具补偿参数设置、间隙补偿参数设置等自动加工参数的设置。
④编辑模块
该模块主要实现零件加工程序的键盘编辑、输入。
⑤通信模块
该模块主要实现与上位机或其他智能设备的串行通信,可用于加工程序的传送等。
图3-4 系统软件原理框图
第4章 硬件系统设计
4.1主模块设计
4.1.1主模块中关键器件及其选型
(1)单片机
本系统采用PHILIPS公司的8位单片机AT89S51为控制核心。AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,全静态工作,RAM可扩展到64K字节,5个中断优先级,2层中断嵌套中断,32个外部双向输入/输出(I/O)口,2个16位可编程定时计数器。外接一片2764EPROM,作为监控程序的程序存储器和存放常用零件的加工程序。再选用一片6264RAM用于存放需要随机修改的零件程序、工作参数。采用译码法对扩展芯片进行寻址,采用74LS138译码器完成此功能。8279作为系统的输入输出口扩展,分别接键盘的输入、输出显示,8255接步进电机的环形分配器,分别并行控制X轴和Z轴的步进电机。另外,还要考虑机床与单片机之间的光电隔离,功率放大电路等.
图4-1单片机系统原理框图
(2)数据存储器的选用
系统采用单片机作为控制核心,最高速度为33MHz,我们用到22.1184MHz。速度高对外部电路特别是外部数据,程序存储器扩展电路要求很高。必须满足在CPU读数据或程序指令时,外部数据或程序指令已准备好了。所以必须进行芯片的时序校验。为了使系统工作可靠我们也进行存储器的校验。
首先,对存储器作一介绍。单片机存储器分为内部存储器和外部存储器,内部存储器又分为内部数据存储器和程序存储器,同样,外部存储器也分为程序和数据存储器。本系统采用AT89S51为核心单元,其本身带有128B的RAM和4KB的Flash内部程序存储器。对于数据存储器,内外两部分是独立编址的,用不同指令来访问不同的数据存储器,即,MOV访问片内,MOVC访问片外,外部可扩展到64K,由于在外部数据存储器和I/0是统一编址的,应给I/0留一定的空间,且本系统要求留有一定的扩展空间,所以本系统扩展采用的芯片是6264。Y62256是HUNDAI公司的一种高速低功耗32K的
CMOS的静态RAM,采用现代公司的高速CMOS工艺技术。HY62265具有数据保持模式,以确保在最低供电电压下2V数据有效。使用CMOS技术,电源电压在2.OV~5.5V之间,数据保持电流几乎没有影响。HY62256适合使用在低压和电池供电工作环境。M28256用于扩展程序存储器,是一种采用ST微电子公司拥有知识产权的多极性硅技术制造的。在3V或}V供电条件下具有快谏低功耗工作模式。电路已被设计成可提供与微控制器柔性接口特征。可使用软件或硬件进行数据循环测试或位功能锁定。可以使用标准的JEDEG运算法则进行软件数据保护。电路扩展如图4-2所示。
图4-2 存储器扩展
(3)总线驱动、数据、地址锁存及译码电路
由于单片机的数据线和低位地址线共用必须加地址锁存器进行低位地址锁存。使用74LS373作为地址锁存器,当应用系统规模过大,扩展所接芯片过多,超过总线的驱动能力时,系统将不能可靠工作,此时应加用总线驱动器来减少读数据的持续时间。整个系统可扩展的外部数据总共为64K,由于单片机外部数据存贮器和工/0是统一编址的,我们将低32K作为外部扩展的数据存储器,高译码电路采用两片74LS138,用了32K作为I/0使用或留给以后扩展用。由于外设使可编程器件,所以在使用138作译码时需要产生两种译码地址:一种是地址连续,一种是段地址连续。其中Ll,L5可作为系统再次扩展时用。译码地址输出在图4-3中已给出,Y0-Y7作为单地址芯片片选信号,Y8-Y15可作为可编程芯片片选信号,如8254可编程计数器。译码电路如图4-3.
图4-3译码电路
4.1.2主模块电原理图设计
本系统选用AT89S51CPU作为数控系统的中央处理机。主程序框图如图4-4。外接一片2764EPROM,作为监控程序的程序存储器和存放常用零件的加工程序。再选用一片6264RAM用于存放需要随机修改的零件程序、工作参数。采用译码法对扩展芯片进行寻址,采用74LS138译码器完成此功能。8279作为系统的输入输出口扩展,分别接键盘的输入、输出显示,8255接步进电机的环形分配器,分别并行控制X轴和Z轴的步进电机。另外,还要考虑机床与单片机之间的光电隔离,功率放大电路等。
8255A可编程并行I/O口扩展芯片可以直接与MCS系列单片机系统总线连接,它具有三个8位的并行I/O口,具有三种工作方式,通过编程能够方便地采用无条件传送、查询传送或中断传送方式完成CPU与外围设备之间的信息交换。
CPU对8279的控制是先读回8279的状态字,查看PIFORAM中有无字符 ,若有将根据字符个数读出所有字符,并进行相应处理;若无,则直接返回。CPU对8279的监视采用查询方式,对8279分配的数据口地址为8000H,状态口地址为8001H,CPU每隔10ms定时中断查询一次,所有显示采用查询段码表的方式实现,简化了程序设计过程,提高了程序质量。
图4-4主程序框图
4.2输入/输出模块设计
4.2.1 I/O模块电原理图设计
8279作为系统的输入输出口扩展,分别接键盘的输入、输出显示。8279是可编程接口芯片,通过编程使其实现相应的功能,编程的过程实际上就是CPU向8279发送控制指令的过程。在软件设计中,显示方式采用了8个字符显示,左入方式,编码扫描键盘,双键锁定。I/O模块电原理图如图4-5所示。
图4-5 I/O模块电原理图
图4-6 8279工作程序框图
4.2.2步进电机控制接口
X,Z两轴采用3相6拍步进电机,并口8255向控制端口写控制字,PUSLE来实现对步进电机的控制。8255接步进电机的环形分配器,通过3片4N25光电隔离,分别形成X、Z所需的3相控制信号,送往步进电机驱动电源,分别并行控制X轴和Z轴的步进电机。芯片YB013实现硬件环分任务,;达林顿光隔离管4N25实现计算机弱点部分和步进电机强电部分的隔离,既起功率放大作用,又充当无触点开关,实现对计算机的保护。单片机控制步进电机连接如图4-7所示。
图4-7 单片机控制步进电机
4.2.3刀具控制接口
(1)电动刀架及其工作原理
电动刀架的机械部分类似于蜗轮机构,实现刀具的抬升、旋转(交换刀具位置)及下降锁紧,这里着重讨论实现上述动作所必须的硬件条件和电路原理。
在图4-8中,继电器KA1,KA2实现电动刀架的动作切换控制,主要完成刀架电机的正、反转切换。在刀架旋转过程中,每个工位上的霍尔元件会依次切换为有效状态,系统根据T1,T2,T3及T4状态的变化,可以推断出目前的刀号,并判断是否为当前所选用刀具,一旦符合,则电机反向旋转,锁紧刀具。电动刀架各时序的切换反间隔是系统控制的关键,反向锁紧所用时间取决于电动刀架生产厂家的推荐指标,过长会引起电机发热甚至烧毁。为保证电动刀架安全运行,在电动刀架交流380V进线处加装快速熔断器和热继电器。
图4-8电动刀架的电原理图
(2)电动刀架与单片机的接口
电动刀架与系统的硬件接口主要是控制电机正、反转信号J1,J2及刀号反馈信号TI,T2,T3和T4。上述信号均光电隔离后与单片机系统接口。
电动刀架软件控制流程如图4-9所示,采用查询方式。
图4-9电动刀架控制流程
程序为:
#include <AT89S51.h>
#include <absacc.h>
#define N1 XBYTE[ ]
typedef unsigned char uchar
void adc0809(uchar idata *x);
void delay();
void main()
{
static uchar idata ad[4];
adc0809(ad);
}
void adc0809(uchar idata *x)
{
uchar i,*ad_adr;
uchar motor=1;
ad_adr=&N1;
for(i=0;i<4;i++)
{
If(*ad_adr=i)
{
delay1( );
KA1=1;
delay2( );
return();
}
else KA1=0
}
}
void delay1(motor==0)
{
uchar j;
for(j=0;j<20000;j++)
}
void delay2(void)
{
uchar j;
for(j=0;j<150000;j++)
}
4.2.4急停、暂停、行程限位接口电路
限位开关为常开状态;因此,X十,X一,Z十,Z一正常输人为低电平状态。因此如果行程开关被压合,向INT0发出中断信号,系统进行复位,步进电机的脉冲消失,也就无法继续前行,起到保护机床的目的。本系统采用三输入端与非门74HC10的输出端作为一个共用的中断信号接至单片机的INT0,用于实时处理紧急停车、暂停、限位报警功能。电路如图4-8所示:
4.3串行通信电路
本系统由两部分构成,上位机系统和下位机系统,由于上位机主要完成管理显示等工作,下位机完成控制功能,所以上位机和下位机的数据传输实时性要求不高,我们采用串口通信。使用RS232标准,MAX232进行电频的转换。串口RS232标准,它是美国电子工业协会(Electronic Instry Association)的推荐标准。本系统采用9针连接器,其定义见表4-1。本系统采用三线制TXD,RXD,GND连接,以使电路简单。
表4-1 连接器定义表
串口通讯电路主要由MAX 232电平转换电路构成。MAX232是MAXIM公司产品,一种电平转换芯片。可以将TTL转换成RS232,或RS232转换成TTL。满足单片机和普通计算机的通讯电平转换要求。电路如图4-10所示。
图4-10 通信接口电路
4.4人机界面模块设计
4.4.1单片机应用系统中常用显示方式及其比较
在单片机应用系统中,目前比较常用的显示介质有数码管(LED)、液晶显示(LCD)及CRT等,在家用电器中用的比较多的是真空荧光屏(VFD)。现就各自特点简述如下:
(1)数码管
数码管是一种主动发光器件。所谓主动发光.是指环境越暗越清晰。分为7段数码管和“米”字数码管2种。前者用于显示ARCⅡ码,显示信息量小;后者除了可显示ARCⅡ字符外,还可显示一些自定义的比较复杂的字符。数码管按驱动电流分,又可分为普通亮度、高亮、超高亮等。数码管由于其廉价而且扩展方便等特性,—直是单片机系统中用得最多、最广的一种显示器件。国内有不少型号的数控系统、尤其是早期的数控系统,广泛采用数码管作为显示界面。
(2)液晶显示
液晶显示器是一种被动发光器件。所谓被动发光,是指环境越亮越清晰,黑暗环境下必须加入背光才能清晰显示。分为字段型液晶显示器、字符型液晶显示器及图形点阵液晶显示器。字段型只能显示ASCII字符,字符型可以显示ASCII字符,显示效果比字段型好,而且可以显示少量的自定义字符;图形点阵液晶显示器是目前在单片机系统中比较流行的新型显示器件,可以显示所有字符及图形,由于其可以显示汉字的特性,被广泛用于国内智能设备中,国内的数控系统也开始广泛采用。
(3)CRT
CRT显示器分为单色和彩色2种,在数控系统中,尤其是高档数控系统中应用日益广泛。其特点是成本低、显示容量大;可以显示所合字符、图形及汉字;采用视频专用接口电路MC6847等与单片机接口,比较复杂,因而在—般的应用中比较少见。
(4)真空荧光屏
真空荧光屏简称VFD(vacuunm fluorescent display mole),是一种新型的显示器件。它由3个基本电极——阴极(灯丝)、阳极及栅做封装在一个真空的玻璃容器内构成。阴极是涂敷了金属氧化物的钨丝;栅极是极细的金属网;阳极为段或点阵型的导电电极,它上面的荧光物质可显示相应的字符或符号。栅极和阳极之间加有正电压,从阴极发射出来的电子被这个正电压加速,碰擅到阳极表面的荧光物质产生辐射,发出波长为505nm左右的谈绿色荧光。通过按制栅极和阳极之间的电压,就可以显示各种字符。VFD由于其以下特点而被广泛应用于家用电器、商场POS机以及新型的仪器仪表中。①亮度高,并且不存在视角问题,②工作温度范围宽、寿命长;②外围电路简单,只需十5v电源就可以工作,提供准8位数据总线接口;④功耗低。但这种显示器目前用在数控系统上还比较少。
4.4.2点阵液晶显示模块
(1)字符型液晶显示模块
本数控系统采用字符点阵液晶显示模块DM12232。该模块具有以下特点:
●能显示122列32行
●电源VDD3.3V~5V(内置升压电路,无需负压)
●与微处理器接8位或4位并行/ 3位串行
●多种软件功能:自定义字符、画面移动、光标显示、睡眠模式等功能
●配置LED背光
}
Ⅷ R语言的编辑器有哪些哪个比较好
有R自带的RGUI(R console),还有一个就是IDE开发工具Rstudio(可以免费下载),Rstudio适合开发,编写代码、结果输出、图形可视化可以在一个窗口中显示。