搜索
bottom↓
回复: 61
打印 上一主题 下一主题

嵌入式系统与单片机课程(实验讲义,实践操作测试复

[复制链接]

出0入0汤圆

跳转到指定楼层
1
发表于 2008-9-26 10:21:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 machao 于 2012-11-8 21:43 编辑

点击此处下载 ourdev_430450.doc(文件大小:41K) (原文件名:实验一.doc) 

点击此处下载 ourdev_457731.doc(文件大小:38K) (原文件名:[实验二]数码管动态扫描显示及外部中断的使用.doc) 

点击此处下载 ourdev_486225.doc(文件大小:36K) (原文件名:[实验三]定时器的应用.doc) 

点击此处下载 ourdev_508215.doc(文件大小:30K) (原文件名:[实验四]按键与键盘接口的应用.doc) 

点击此处下载 ourdev_523436.doc(文件大小:28K) (原文件名:[实验五]模数转换ADC的使用.doc) 

点击此处下载 ourdev_529417.doc(文件大小:26K) (原文件名:实践操作测试复习纲要.doc) 

点击此处下载 ourdev_541597.doc(文件大小:38K) (原文件名:单片机与嵌入式系统期末笔试复习纲要.doc) 

====================================================================================================================

1。下面一段程序用于测试C口,如果发现PC2、PC3、PC4、PC5所控制的LED不闪烁,95%是JTAG的溶丝位没有禁止掉!

#include <mega16.h>;        //包括器件配置定义的头文件,不能缺少
#include <delay.h>;            //包括延时函数定义的头文件,使用延时函数时不能缺少
void main(void)
{
      //定义PortC口的工作方式
    PORTC=0xFF;           //PC口输出"1",8个LED不亮
    DDRC=0xFF;             //定义PC口的第0位为输出方式

    //主循环
    while(1)
     {
         delay_ms(500);        //调用CVAVR提供的毫秒延时函数,延时1s
         PORTC=~PORTC;    //PC口输出取反
    };
}

2。今天已经发现有同学配置系统时钟熔丝位为:ext.clock,这是错误的,课上已经强调了多次,真不知道说什么好。
这样造成芯片“死锁”,现象,用并行下载线或USB下载线连接不上芯片。

解救方法:既然配置成了使用ext.clock,那就给个ext.clock:用连线将板上K区上128K方波输出连到AVR的X1(13脚)上,然后就可以重新读取和配置AVR的溶丝位了(注意:使用USBASP-ISP时,需要将ISP速度设置到最低<64K)。将熔丝位设置成使用内部RC振荡,或ext.CRYSTAL。

3。各位同学,手头都有英语4、6级证书,可不能把那个DD当摆设呀!拜托当出现某个提示时,或选择某个选项,还有软件本身的HELP等,都请认认真真读读,结合学的知识,把它搞清楚,到底是什么意思。

4。国庆加点班吧,就是你将来不从事这方面的工作,从这个课程中你也会得到很多的收获。毕竟分数不能养活你的。要有点真实的东西吧。看看今天发生的一些情况:

A/有3个同学说并口线不工作,结果是打印连接延长线的一头根本没插在电脑的接口上。(这个应该自己可以检查的吧)
B/有N个同学不知道使用USBASP-ISP需要先安装驱动程序,或不知道驱动程序在那里。课上已经讲过,所有本课程需要的软件在D盘AVR目录下,里面就有一个.INF文件。知道.inf文件通常是什么文件吗,试试总可以吧?
c/有同学不知道 A |=0x80; 是什么意思。

以上应该都与AVR本身无关的,但可以看出,或是对你们的“动手实践”的能力,基础知识到底如何,计算机应用能力等综合素质真实的反映。

5。个别参加过XX竞赛的同学,或动手能力相对好的同学,不要怕我讲你讲的难听,响鼓是需要重锤敲的。要明白这个道理,我是好心。不要对你们目前所掌握的那点DD就沾沾自喜,实际你们没有经过严格的基础训练。踏踏实实,一步一个脚印,真正把基础打扎实和牢固了,这样就才有真正的发展潜力和空间。那点空中楼搁,虚浮的技术是成不了大器的。你们上一届的一个师兄弟,刚从北京发短信给我,他今天参加了北大面试,排名第二,已经被北大录取为研究生了。该同学暑假后转在我的指导下,做一个PSOC的小玩意,我一直照样“熊”他。

==================================================================================================
2011.10 课堂设计操作练习题以及参考代码


(原文件名:未标题-1 拷贝.jpg)


1.使用8个LED数码管构成一个流水灯,其中只有一段不亮,每隔0.5S顺时(或逆时针)移动。
2.采用软delay、中断+外部时钟、定时器都可以
3.交手画的硬件连接草图
4.说明如何设计0.5S移动的
5.软件(整个目录)在x:\2xx_2xx\建立新的工程,完成后将整个目录拷贝出

/*********************************************
Chip type           : ATmega16
Program type        : Application
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*********************************************/
                                                                        
#include <mega16.h>

unsigned char led_7[8]={0x39,0x09,0x09,0x09,0x09,0x09,0x09,0x0f}; //封闭图像的8段码表
unsigned char blk_7[20][2] = {
        {0,0x38},{1,0x08},{2,0x08},{3,0x08},{4,0x08},{5,0x08},{6,0x08},{7,0x0e},{7,0x0d},{7,0x0b},
        {7,0x07},{6,0x01},{5,0x01},{4,0x01},{3,0x01},{2,0x01},{1,0x01},{0,0x31},{0,0x29},{0,0x19}};
        
//unsigned char blk_7[20]={0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfe,0xfd,0xfb,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xf7,0xef,0xdf};

unsigned char time_counter;          // 中断次数计数单元            
unsigned char posit,i;

void display(void)                   // 8位LED数码管动态扫描函数
{
    PORTC = 0xff;

    if (posit == blk_7[0])
        PORTA = blk_7[1];
    else
        PORTA = led_7[posit];
           
    PORTC = ~(1<<posit);
    if (++posit >= 8 ) posit = 0;
}

// Timer 0 比较匹配中断服务,2s执行一次
interrupt [TIM0_COMP] void timer0_comp_isr(void)                     
{
    display();                                  // 调用LED扫描显示
    if (++time_counter >= 125)
    {
        time_counter = 0;
        if(++i >= 20) i=0;
    }
}

void main(void)
{
    PORTA=0x00;                    // 显示控制I/O端口初始化
    DDRA=0xFF;
    PORTC=0xff;
    DDRC=0xff;
    // T/C0 初始化
    TCCR0=0x0B;                // 内部时钟,64分频(4M/64=62.5KHz),CTC模式
    TCNT0=0x00;
    OCR0=0x7c;                // OCR0 = 0x7c(124),(124+1)/62.5=2ms
    TIMSK=0x02;                // 允许T/C0比较匹配中断

    #asm("sei")                // 开放全局中断
    while (1)
    {
    }
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

2
发表于 2009-1-2 00:31:34 | 只看该作者
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于试验3广告牌的

flash&nbsp;unsigned&nbsp;char&nbsp;char_7[8][5]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//采用二进制定义,可以方便的调整LED的字符点阵&nbsp;&nbsp;

{{0b00000000,0b00011100,0b00111110,0b00001000,0b01111100},&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//也看的比较清楚&nbsp;&nbsp;

&nbsp;{0b00010000,0b00100010,0b00100010,0b00011000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00110000,0b00000010,0b00111110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b01111111,0b00000100,0b00100010,0b00001000,0b01111100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b11111111,0b00001000,0b00111110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b01111111,0b00010000,0b00100010,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00110000,0b00100010,0b00100110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00010000,0b00111110,0b01000010,0b00111110,0b01111100}};

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt;=7;i++)&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k1=&nbsp;number/8;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k2=&nbsp;number%8;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_buff&nbsp;=&nbsp;display_buff&nbsp;&lt;&lt;&nbsp;1;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(char_7[i,k1]&nbsp;&&nbsp;(0x80>>k2))&nbsp;&nbsp;display_buff&nbsp;+=&nbsp;1;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++number>=&nbsp;bit_number)&nbsp;number&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}



display_buff,刚开始display(&nbsp;)是没有显示的。当number=0时,K1=0;K2=0;i=0-3时,display_buf是空的;当i=4,char_7[k1]&nbsp;&&nbsp;(0x80>>k2[i,k1]&nbsp;&&nbsp;(0x80>>k2为真,这时display_buff=0x01;i=5,display_buff左移一位,等于0x20。。。。。。

好像并不能把第一列的第一个bit读出来??????????????????、、

出0入0汤圆

3
发表于 2008-12-17 08:54:29 | 只看该作者
帖子这么好,我竟然没来凑热闹

真是罪过啊

出0入0汤圆

4
 楼主| 发表于 2008-12-16 20:15:16 | 只看该作者
真的碰上我上你的课,你就开始骂我了。

出0入0汤圆

5
发表于 2008-12-14 16:35:30 | 只看该作者
羡慕马老师的学生呀,我做梦都想遇上这样一位老师,哎~~~!!!

出0入0汤圆

6
发表于 2008-12-13 16:52:09 | 只看该作者
mark

出0入0汤圆

7
 楼主| 发表于 2008-12-13 16:37:35 | 只看该作者
单片机与嵌入式系统期末笔试复习纲要已经发在LZ位

出0入0汤圆

8
 楼主| 发表于 2008-12-5 01:08:44 | 只看该作者
实践操作测试复习纲要发在LZ位。&nbsp;

出0入0汤圆

9
发表于 2008-12-4 16:59:59 | 只看该作者
马老师:请你转告你那个保送北大的学生,欢迎他到北大未名bbs的elecdiy版来,这是一个讨论各种电子制作的版面

出0入0汤圆

10
发表于 2008-12-1 00:19:06 | 只看该作者
支持马老师,可惜离华东师大有点远,不然要去旁听学习。

出0入0汤圆

11
发表于 2008-11-30 23:56:57 | 只看该作者
可能马老师还没明白我的意思。



如果学校抓得严,那就抓严些。如果有可能,就放学生一些生路。

也许这个学生没有学习技术的天份,正如我所说的那个过个幸福生活的同学。它并不是靠技术吃饭的,至少不是做开发的。

如果马老师因为你令这样的学生不能毕业的话,我想对他来说也许连工作都找不到。



这里我在声明一下对学生的处理方法

1.对于整天游戏,不思学习的。坚决打击。也就是本质上不想学的。

2.对于努力学习理论好,但没有动手能力的,放行。也就是睁只眼闭只眼。

3.对于努力学习但理论动手都不行的,只能忍痛割爱了。



在现有的素质教育下,想有很好的动手能力是很难的。严格要求固然好,但在社会主义的初级阶段,应变一下吧。

本贴被 gliet_su 编辑过,最后修改时间:2008-12-01,00:05:34.

出0入0汤圆

12
发表于 2008-11-6 03:57:12 | 只看该作者
看到马老师的课程讲义和讲解,想起在校时得感觉。马老师上课真的很认真~~~



题外话,很感兴趣,不知马老师的课,每次实验预计学生要花多少时间准备,上课实验时间多少,实验报告花多少时间完成。

平时实验成绩是否算入总分(百分比)?



本贴被 testcode 编辑过,最后修改时间:2008-11-06,04:08:04.

出0入0汤圆

13
 楼主| 发表于 2008-11-6 02:39:15 | 只看该作者
本帖最后由 machao 于 2012-11-8 21:29 编辑

k1=number/8;
k2=number%8;

注意这两句的区别!比如当number=2时,K1、K2为多少?number=9时,K1、K2又为多少?

出0入0汤圆

14
发表于 2008-11-6 00:44:28 | 只看该作者
#include&nbsp;&lt;mega16.h>&nbsp;&nbsp;&nbsp;

#include&nbsp;&lt;delay.h>&nbsp;&nbsp;&nbsp;



#define&nbsp;move_speed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;改变此值就可以调整左移的速度&nbsp;&nbsp;

#define&nbsp;bit_number&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5*8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;n个字符,就只要定义成n*8,把下面的点阵定义扩大就可以了,程序不需要再动了。&nbsp;&nbsp;



flash&nbsp;unsigned&nbsp;char&nbsp;char_7[8][5]=&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//采用二进制定义,可以方便的调整LED的字符点阵&nbsp;&nbsp;

{{0b00000000,0b00011100,0b00111110,0b00001000,0b01111100},&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//也看的比较清楚&nbsp;&nbsp;

&nbsp;{0b00010000,0b00100010,0b00100010,0b00011000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00110000,0b00000010,0b00111110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b01111111,0b00000100,0b00100010,0b00001000,0b01111100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b11111111,0b00001000,0b00111110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b01111111,0b00010000,0b00100010,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00110000,0b00100010,0b00100110,0b00001000,0b01000100},&nbsp;&nbsp;&nbsp;

&nbsp;{0b00010000,0b00111110,0b01000010,0b00111110,0b01111100}};&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

char&nbsp;display_buff[8];&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

void&nbsp;display()&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;显示扫描子程序,就单一的做显示扫描,把display_buff[]的点阵送出。至于是什么,就不要管了。&nbsp;&nbsp;

{&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;i;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt;=7;i++)&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTA&nbsp;=&nbsp;display_buff;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC&nbsp;=&nbsp;~(1&lt;&lt;i);&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(2);&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTC&nbsp;=&nbsp;0xFF;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}&nbsp;&nbsp;&nbsp;



void&nbsp;main(void)&nbsp;&nbsp;&nbsp;

{&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;char&nbsp;gap,i,k1,k2,number=0;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTA=0x00;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;DDRA=0xFF;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTC=0xFF;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;DDRC=0xFF;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;(1)&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display();&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++gap>=&nbsp;move_speed)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;以下这段是关键,自己分析吧,看做了什么,有何技巧。&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gap&nbsp;=&nbsp;0;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt;=7;i++)&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k1=&nbsp;number/8;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k2=&nbsp;number%8;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_buff&nbsp;=&nbsp;display_buff&nbsp;&lt;&lt;&nbsp;1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//display_buff的内容左移一位

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(char_7[k1]&nbsp;&&nbsp;(0x80>>k2))&nbsp;&nbsp;display_buff&nbsp;+=&nbsp;1;&nbsp;&nbsp;//char[k1]的第(7-k2)位为1,&nbsp;display_buff&nbsp;+=&nbsp;1

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;

//以下我分析的这段代码

//number:&nbsp;0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//k1,k2:&nbsp;0,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0,0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....&nbsp;//&nbsp;《=======&nbsp;&nbsp;??!!错误

//i&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display_buff

//===========================

//0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0011&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0011&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0111&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0011&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0001&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....

//7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0b0000&nbsp;0000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;....





&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++number>=&nbsp;bit_number)&nbsp;number&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}&nbsp;&nbsp;





================================================================================

请马老师回答下你的这段代码是这个意思吗?这样理解对吗?

本贴被 machao 编辑过,最后修改时间:2008-11-06,02:39:47.

出0入0汤圆

15
 楼主| 发表于 2008-11-2 12:42:47 | 只看该作者
本帖最后由 machao 于 2012-11-8 23:27 编辑

贴上实验二中的2个参考代码

在实验板上设计一个采用外部中断方式的6位数码管(分、秒、1%秒各占2位)显示的简易秒表系统。可以先使用CVAVR中的程序生成向导功能进行配置,然后在它生成的程序框架基础上完成定时器中断部分程序。该系统程序设计可参考demo_7_2.c,在这个基础上修改代码,最终设计出一个完整的秒表系统。

提示:使用Mega16两个外部中断源INT0和INT1。将其中一个外部中断源与板上500Hz的标准频率相连,另外的一个外部中断源与一个按键相连。500Hz的标准频率被作为秒表系统的计时基准。按键的起到了“开始/停止/清零”作用。上电后,数码管显示全零,第一次按键,表示秒表计时开始,数码管显示的数值按1%秒速率计时。第二次按键计时停止,数码管显示最终的计时时间。第三次按键对数码管清零。以上功能可反复执行。

/*********************************************
Chip type: ATmega16
Program type: Application
Clock frequency: 4.000000MHz
Memory model: Small
External SRAM: 0
Data Stack size: 256
*********************************************/
#include <mega16.h>

flash unsigned char led_7[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash unsigned char position[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};

unsigned char time[3];                                  //时、分、秒计数单元
unsigned char dis_buff[6];                             //显示缓冲区,存放要显示的6个字符的段码值

unsigned char time_counter;                         //中断次数计数单元
unsigned char posit;
unsigned char key_state=0;

bit pre_pind3,int1_off,time_10ms_ok,time_20ms_ok;

void display(void)                                     //6位LED数码管动态扫描函数
{
    PORTA = led_7[dis_buff[posit]];
    if (posit==2 || posit==4) PORTA |= 0x80;
    PORTC = position[posit];
    if (++posit>=6) posit = 0;
}

//External Interrupt 0 service routine 2ms 一次
interrupt [EXT_INT0] void ext_int0_isr(void)
{
    display();          //调用LED扫描显示
   if (++time_counter>=5)
    {
        time_counter = 0;
        time_10ms_ok = 1;
    }
}

//External Interrupt 1 service routine 外部按键中断
interrupt [EXT_INT1] void ext_int1_isr(void)
{
    GICR = 0x7F;        //关INT1中断,是做消抖处理
   int1_off = 1;
    pre_pind3 = 0;
    if (++key_state>=3) key_state = 0;
}

void time_to_disbuffer(void)           //时钟时间送显示缓冲区函数
{
    unsigned char i, j=0;

    for (i=0; i <= 2; i++)
    {
        dis_buff[j++] = time%10;
        dis_buff[j++] = time/10;
     }
}

void main(void)
{
    PORTA=0x00;        //显示控制I/O端口初始化
   DDRA=0xFF;
    PORTC=0x3F;
    DDRC=0x3F;
    PORTD = 0xFF;        //PD2,PD3输入,上拉有效
   
   time[2] = 0; time[1] = 0; time[0] = 0;             //设时间初值00:00:00;
    posit = 0;
    time_to_disbuffer();

    GICR|=0xC0;                                 //INT1,INT0中断允许
   MCUCR=0x0A;                              //INT1,INT0下降沿触发
   #asm("sei");                                 //全局中断允许

    while (1)
      {
          if (key_state == 0)
          {
               time[0] = 0;
               time[1]=0;
              time[2]=0;
               time_to_disbuffer();
          }

        if (time_10ms_ok)                             //10ms到
      {
               time_10ms_ok=0;
               time_20ms_ok=~time_20ms_ok;
               if (time_20ms_ok && int1_off)                                   //这段是间隔20ms检测按键是否释放
          {                                                                           //确认释放后开INT1中断,可以接收下次的按键
              if (PIND.3 && pre_pind3)                                          //这样就防止了一次按键过程中按键抖动对INT1的影响,构成消抖功能
              {
                             GIFR |= 0x80;
                             GICR |= 0x80;
                             int1_off = 0;
                      }
                     pre_pind3 = PIND.3;
               }

              if (key_state == 1)
              {
                     if (++time[0] >= 100)                                          //以下时间调整
              {
                            time[0] = 0;
                            if (++time[1]>=60)
                            {
                                    time[1] = 0;
                                    if (++time[2]>=60) time[2] = 0;
                            }
                      }
                      time_to_disbuffer();                                             //新调整好的时间送显示缓冲区
           }
           }
      }
}

==============================================================================================
3.(有能力同学完成)参考书中例6.7,和demo_6_7.c,设计一个8X8点阵LED广告,能够水平移动显示“<- 2月1日”。要求显示连续不闪烁,移动平稳,字符亮度均匀.

硬件连接:
PA0-JE1.8,PA1-JE1.7,...,PA7-JE1.1
PC0-JE2.1,PC1-JE2.2.........
系统时钟1M

#include <mega16.h>
#include <delay.h>

#define move_speed  8                     //改变此值就可以调整左移的速度
#define bit_number    5*8                 //n个字符,就只要定义成n*8,把下面的点阵定义扩大就可以了,程序不需要再动了
flash unsigned char char_7[8][5]=       //采用二进制定义,可以方便的调整LED的字符点阵
{{0b00000000,0b00011100,0b00111110,0b00001000,0b01111100},           //也看的比较清楚
{0b00010000,0b00100010,0b00100010,0b00011000,0b01000100},
{0b00110000,0b00000010,0b00111110,0b00001000,0b01000100},
{0b01111111,0b00000100,0b00100010,0b00001000,0b01111100},
{0b11111111,0b00001000,0b00111110,0b00001000,0b01000100},
{0b01111111,0b00010000,0b00100010,0b00001000,0b01000100},
{0b00110000,0b00100010,0b00100110,0b00001000,0b01000100},
{0b00010000,0b00111110,0b01000010,0b00111110,0b01111100}};

char display_buff[8];

void display()                                     //显示扫描子程序,就单一的做显示扫描,把display_buff[]的点阵送出。至于是什么,就不要管了。
{
    for (k=0; k<=7; k++)
    {
        PORTA = display_buff[k];
        PORTC = ~(1 << k);
        delay_ms(2);
        PORTC = 0xFF;
    }
}

void main(void)
{
    char gap,k0,k1,k2,number=0;
   
    PORTA=0x00;
    DDRA=0xFF;
    PORTC=0xFF;
    DDRC=0xFF;

    while (1)
    {
        display();
        if (++gap >= move_speed)                                //以下这段是关键,自己分析吧,看做了什么,有何技巧。
        {
              gap = 0;
              for (k0=0; k0<=7; k0++)
              {
                   k1 = number / 8;
                   k2 = number % 8;
                   display_buff[k0] = display_buff[k0] << 1;
                   if (char_7[k0,k1] & (0x80>>k2)) display_buff[k0] += 1;
              }
             if (++number >= bit_number) number = 0;
        }
    }
}

本段程序,执行代码大小为233字,如果要左移显示10个字符,只要将define中的bit_number定义成10*8,然后重新定义flash unsigned char char_7[8][10]和点阵(这个省不掉的,是必须做的)就可以了,执行程序的本身不需要做改动了。代码长度的增加,就仅仅为点阵定义本身增加的数量。

出0入0汤圆

16
发表于 2008-10-16 17:43:49 | 只看该作者
我觉得马老师教学生真的是浪费了,应该来教教我们的部分大学老师。。。

出0入0汤圆

17
 楼主| 发表于 2008-10-16 17:15:44 | 只看该作者
实验二的要求已经在LZ位了。

出0入0汤圆

18
发表于 2008-9-28 01:03:00 | 只看该作者
呵呵&nbsp;有3个同学说并口线不工作,结果是打印连接延长线的一头根本没插在电脑的接口上......有一个还是我帮她插上的......&nbsp;&nbsp;好好学AVR了......好好动手了

出0入0汤圆

19
发表于 2008-9-27 21:14:15 | 只看该作者
有这样的老师&nbsp;&nbsp;学生应该好好学

出0入0汤圆

20
发表于 2008-9-27 21:00:22 | 只看该作者
呵呵,马老师好幽默。“熊”他!!

出0入0汤圆

21
发表于 2008-11-30 15:09:36 | 只看该作者
初学AVR,马老师的设计一个8X8点阵LED广告,能够水平移动显示“&lt;-&nbsp;2月1日”。要求显示连续不闪烁,移动平稳,字符亮度均匀的程序终于看懂了,直接改了改马老师的程序(稍做改动),变成水平右移显示了&nbsp;,只需将

display_buff&nbsp;=&nbsp;display_buff&nbsp;&lt;&lt;&nbsp;1;&nbsp;&nbsp;

if&nbsp;(char_7[i,k1]&nbsp;&&nbsp;(0x80>>k2))&nbsp;&nbsp;display_buff&nbsp;+=&nbsp;1;&nbsp;&nbsp;两句换为下面两句即可,由于点阵字符的代码没改所以箭头是倒着的.



display_buff&nbsp;=&nbsp;display_buff>>1;&nbsp;&nbsp;

if&nbsp;(char_7[i,k1]&nbsp;&&nbsp;(0x01&lt;&lt;k2))&nbsp;&nbsp;display_buff|=0x80;

出0入0汤圆

22
发表于 2008-11-27 09:33:42 | 只看该作者
thanks

出0入0汤圆

23
发表于 2008-11-27 09:26:19 | 只看该作者
水平移动的广告

#include&nbsp;&lt;mega16.h>&nbsp;

#include&lt;delay.h>

&nbsp;

&nbsp;

&nbsp;char&nbsp;char_HELLO[24]={0x9f,0x98,0x98,0xff,0x98,0x98,0x98,0x9f,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//HE

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xff,0x88,0x88,0x88,0x88,0x88,0x88,0x88,&nbsp;//LL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x64,0x90,0x94,0x94,0x94,0x94,0x90,0x64};&nbsp;//O!

char&nbsp;temp[24];





&nbsp;

void&nbsp;display(&nbsp;)&nbsp;

{&nbsp;

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;i,j;

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;a,b,c,d,e=0;

&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp;for&nbsp;(a=0;a&lt;24;a++)&nbsp;

&nbsp;&nbsp;&nbsp;temp[a]=char_HELLO[a];



&nbsp;&nbsp;&nbsp;&nbsp;for(d=0;d&lt;24;d++)

&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;for(b=0;b&lt;20;b++)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;for(c=0;c&lt;8;c++)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;temp[c]=temp[c]&lt;&lt;1;

&nbsp;&nbsp;&nbsp;&nbsp;PORTA&nbsp;=&nbsp;temp[d+c];&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTC&nbsp;=&nbsp;~(1&lt;&lt;c);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;delay_ms(2);&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;PORTC&nbsp;=&nbsp;0xFF;

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

}&nbsp;

void&nbsp;main()

{&nbsp;&nbsp;

&nbsp;&nbsp;PORTA=0x00;&nbsp;

&nbsp;&nbsp;DDRA=0xFF;&nbsp;

&nbsp;&nbsp;PORTC=0xFF;&nbsp;

&nbsp;&nbsp;DDRC=0xFF;&nbsp;

&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;while&nbsp;(1)&nbsp;

&nbsp;{&nbsp;

&nbsp;&nbsp;&nbsp;&nbsp;display(&nbsp;);&nbsp;

&nbsp;}&nbsp;

}&nbsp;

&nbsp;

出0入0汤圆

24
发表于 2008-11-25 15:53:21 | 只看该作者
//&nbsp;External&nbsp;Interrupt&nbsp;1&nbsp;service&nbsp;routine&nbsp;外部按键中断

interrupt&nbsp;[EXT_INT1]&nbsp;void&nbsp;ext_int1_isr(void)

{

&nbsp;&nbsp;&nbsp;&nbsp;GICR&nbsp;&=&nbsp;0x7F;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;关INT1中断,是做消抖处理

&nbsp;&nbsp;&nbsp;&nbsp;int1_off&nbsp;=&nbsp;1;

&nbsp;&nbsp;&nbsp;&nbsp;pre_pind3&nbsp;=&nbsp;0;

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++key_state>=3)&nbsp;key_state&nbsp;=&nbsp;0;

}&nbsp;







马老师&nbsp;按键中断中关闭中断能起到消抖的处理吗?

出0入0汤圆

25
发表于 2008-11-23 22:53:27 | 只看该作者
呵呵。

本贴被 zhenke 编辑过,最后修改时间:2008-11-24,23:01:25.

出0入0汤圆

26
 楼主| 发表于 2008-11-22 21:10:14 | 只看该作者
不知道&nbsp;A&nbsp;|=&nbsp;0x80,很正常,哪怕是学过C语言程序设计,不知道也正常。



不正常的是,当不知道时,并不去打开书去找找,了解一下是什么意思,这就不正常了。&nbsp;



&nbsp;

出0入0汤圆

27
发表于 2008-11-22 20:08:59 | 只看该作者
“c/有同学不知道&nbsp;A&nbsp;|=&nbsp;0x80&nbsp;是什么意思。&nbsp;”



这么难,不知道很正常。

不知道0x的大有人在。

出0入0汤圆

28
 楼主| 发表于 2008-11-22 15:06:51 | 只看该作者
实验四的要求已经在LZ位了。



实验三,基本练习2的参考代码见楼上&nbsp;



本贴被 machao 编辑过,最后修改时间:2008-11-22,16:53:07.

出0入0汤圆

29
 楼主| 发表于 2008-11-6 17:11:12 | 只看该作者
实验三的要求已经在LZ位了。



===========================================================

实验三,基本练习2的参考代码





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

Chip&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;ATmega16

Program&nbsp;type&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Application

Clock&nbsp;frequency&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;4.000000&nbsp;MHz

Memory&nbsp;model&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;Small

External&nbsp;SRAM&nbsp;size&nbsp;&nbsp;:&nbsp;0

Data&nbsp;Stack&nbsp;size&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:&nbsp;256

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



#include&nbsp;&lt;mega16.h>



#define&nbsp;row&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

#define&nbsp;speed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;25*8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//移动速度调节

&nbsp;

flash&nbsp;unsigned&nbsp;char&nbsp;char_7[row]={0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00};



bit&nbsp;time_1ms_ok;

unsigned&nbsp;char&nbsp;dis_buff[8];



//&nbsp;Timer&nbsp;0&nbsp;output&nbsp;compare&nbsp;interrupt&nbsp;service&nbsp;routine

interrupt&nbsp;[TIM0_COMP]&nbsp;void&nbsp;timer0_comp_isr(void)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;1ms&nbsp;中断一次

{

&nbsp;&nbsp;time_1ms_ok&nbsp;=&nbsp;1;

}



void&nbsp;display(void)

{

&nbsp;&nbsp;static&nbsp;unsigned&nbsp;char&nbsp;i;

&nbsp;&nbsp;PORTC&nbsp;=&nbsp;0xFF;

&nbsp;&nbsp;PORTA&nbsp;=&nbsp;dis_buff;

&nbsp;&nbsp;PORTC&nbsp;=&nbsp;~(1&lt;&lt;i);

&nbsp;&nbsp;if&nbsp;(++i>=&nbsp;8&nbsp;)&nbsp;i&nbsp;=&nbsp;0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}



void&nbsp;main(void)

{

&nbsp;&nbsp;unsigned&nbsp;char&nbsp;move_speed,i,j;

&nbsp;&nbsp;PORTA=0x00;

&nbsp;&nbsp;DDRA=0xFF;

&nbsp;&nbsp;PORTC=0xFF;

&nbsp;&nbsp;DDRC=0xFF;&nbsp;&nbsp;



&nbsp;&nbsp;//&nbsp;Timer/Counter&nbsp;0&nbsp;initialization

&nbsp;&nbsp;//&nbsp;Clock&nbsp;source:&nbsp;System&nbsp;Clock,Clock&nbsp;value:&nbsp;62.500&nbsp;kHz

&nbsp;&nbsp;//&nbsp;Mode:&nbsp;CTC&nbsp;top=OCR0,&nbsp;OC0&nbsp;output:&nbsp;Disconnected

&nbsp;&nbsp;TCCR0=0x0B;

&nbsp;&nbsp;TCNT0=0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;OCR0=0x3D;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;//&nbsp;Timer(s)/Counter(s)&nbsp;Interrupt(s)&nbsp;initialization

&nbsp;&nbsp;TIMSK=0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//允许T/C0&nbsp;CTC中断&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;



&nbsp;&nbsp;//&nbsp;Global&nbsp;enable&nbsp;interrupts

&nbsp;&nbsp;#asm("sei")&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;开全局中断

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;for&nbsp;(i=0;i&lt;=8;i++)&nbsp;{dis_buff&nbsp;=&nbsp;char_7;}

&nbsp;&nbsp;j&nbsp;=&nbsp;8;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;while&nbsp;(1)

&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(time_1ms_ok)

&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;time_1ms_ok&nbsp;=&nbsp;0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;display();

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++move_speed>=&nbsp;speed)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;move_speed&nbsp;=&nbsp;0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;(i=0;i&lt;=6;i++)

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis_buff&nbsp;=&nbsp;dis_buff[i+1];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(++j>=&nbsp;row)&nbsp;j&nbsp;=&nbsp;0;

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dis_buff[7]&nbsp;=&nbsp;char_7[j];

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;&nbsp;&nbsp;}

&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

}



本贴被 machao 编辑过,最后修改时间:2008-11-22,16:56:49.

出0入0汤圆

30
 楼主| 发表于 2008-11-6 11:54:38 | 只看该作者
光多写程序还不行,关键是有一定的理论基础。如果是写了一大堆“烂”程序,收获也不大,到反而可能走向另一面,封住了脚步,阻止了自己的进步。



最好是学习些《数据结构》的课程,因为软件上有种说法:程序&nbsp;=&nbsp;算法&nbsp;+&nbsp;结构。有了一定的数据结构的基础,你编写程序时,就会有思路和想法,看别人的程序就容易读懂,能够清楚的分辩出好还是不好。这里的“好”不是仅指能实现功能。

出0入0汤圆

31
发表于 2008-11-6 11:34:07 | 只看该作者
我也写过这个练习的代码,不过没有马老师的好,效率也不高,亮度也不均匀,还会会闪烁,根本没有想到这样来处理。

看来还要多写写程序,多做些马老师书上的练习。

谢谢马老师!!

出0入0汤圆

32
 楼主| 发表于 2008-11-6 11:03:29 | 只看该作者
那下面的2句就可以知道做什么了。

出0入0汤圆

33
发表于 2008-11-6 09:22:51 | 只看该作者
k1=&nbsp;number/8;&nbsp;&nbsp;&nbsp;&nbsp;

k2=&nbsp;number%8;&nbsp;



注意这两句的区别!比如当number&nbsp;=&nbsp;2时,K1、K2为多少?number&nbsp;=&nbsp;9时,K1、K2又为多少?&nbsp;

=====================================================================================

比如当number&nbsp;=&nbsp;2时,K1=0,K2=2

number&nbsp;=&nbsp;9时,K1=1,K2=1

发帖的时候上面注释忘记改了。

出0入0汤圆

34
 楼主| 发表于 2008-11-6 04:51:06 | 只看该作者
实际上,学生如果前面2年认真学习的话(不是那种应试型的“认真”学习),完成基本的实验不需要化很多时间的。可惜的是....



实验板和工具都是发给学生带回家去的,随便你如何“玩”。



附加的题是给有兴趣、有一定能力和想多学的学生准备的。不是必做。



至于成绩肯定记入总分,占到60%以上,还有40%是学生最后自己设计和实现的小系统。主要是要学生动手,要做。



得到85分以上比较难,要的确有一定的能力,自己完成的。很多人是“参考”别人的,一看就看出来的。这些人根本也不会化时间,因为现在的学生至少有1/3是不喜欢电子专业。

出0入0汤圆

35
发表于 2008-10-18 10:28:19 | 只看该作者
错人当中的一个,顶它个fuc!

^_^

出0入0汤圆

36
 楼主| 发表于 2008-11-30 20:33:48 | 只看该作者
楼上不会就是我所在的学校吧?!我也是本系的四大名补之一。



另外,楼上学校控制不及格的比例是多少,能透露吗?



“如果马老师所在的学校没那么严格的话,就睁只眼闭只眼了。不要和学生过不去,不要和现有教育过不去。”



你现在还喝SANLU的牛奶吗?喝吧,不要和。。。。过不去。



我现在就是制造含SANJUQINGAN产品的一员。学校的产品是学生,学生达不到要求就是不合格的产品。现在已经是“睁只眼闭只眼”了,而且就是那只睁的眼也已经闭上一半了。就是实在不愿意把最后半只眼也闭上,才这样的。



大家都非常痛恨社会上造假酒、假奶粉、假食品的,因为害了不少人。可是学校里造的假合格学生,会害了几代人,害了整个社会。



人人痛恨做假,人人又在自己做假,多么可怕的现象!

出0入0汤圆

37
发表于 2008-11-30 20:01:33 | 只看该作者
回machao老师



可能马老师真的是要满足所有人了。

也许各个学校不同吧。

我所在学校要求就很严格,不过就是不给过,当然要控制一定的比例。

一次不过的,重修,重修的可以出题轻些,再不过的就没法了,修到过为止。

记得《微机原理》就有50%不过,教这门课的老师被称为四大名补。



如果马老师所在的学校没那么严格的话,就睁只眼闭只眼了。不要和学生过不去,不要和现有教育过不去,

问心无愧就行了。

出0入0汤圆

38
发表于 2008-11-30 17:39:34 | 只看该作者
凡有的还要加给他,叫他有余。没有的,连他所有的也要夺过来。

这是马太福音的话。个人支持马老师。

想我上学的时候,四个人在实验室泡了一个暑假,整个学校都找不出一个老师可以指导我们,当然不是我们水平高,是老师。。。

我们师弟现在热情都很高,但指导只能靠师兄,还好现在他们能够独立解决一些问题了。

如果能有一个马老师一样的老师指导我们,呵呵,会幸福得天天打滚。

出0入0汤圆

39
 楼主| 发表于 2008-11-30 17:29:45 | 只看该作者
to&nbsp;26楼:



我非常认可和同意你的说法,况且我自己也是这个观点,也同学生讲过。



目前我的难处是:

1。我上的课只是AVR,只能按你掌握和使用AVR的程度给出本门专业技术的分数。而不是学生的整体素质的成绩(这个我也评价不了)。

2。如果认真按最基本的要求给出本门课程的分数,那么至少有1/3的学生是不及格的。

3。我个人的观点是“精英教育”,也就是你说的“只要把那些想学的,好学的教好,让他们的能力再上一个台阶”。可是在现行的教育体制下做不到。

4。作为学校的一个专业,对本专业的学生要掌握的知识和能力是有一定标准的。如果你达不到这个基本的标准怎么办?

5。还有更充分的例子就是微软的前总裁“老毕”,大学都没毕业。我总不能让那些不想学的学生都退学吧?

6。况且我在课上要求学生基本掌握的东西并不高,都是最基本的(你从实验要求可以看出),离社会对本专业人才的要求差的远了。

7。我教AVR,要求学生看外语的资料。将来就是不做AVR应用设计的工作,外语的锻炼总是有用的吧。你知道有多少学生会看吗?



你说该怎么办?

出0入0汤圆

40
发表于 2008-11-30 16:19:38 | 只看该作者
想到一个笑话:你不能满足所有的人,因为不是所有的人都是人。

所以马老师不必过于责全求备,你不可能要求每个学生都学好单片机,也不可能要求他们都把C学得滚瓜烂熟。

只要把那些想学的,好学的教好,让他们的能力再上一个台阶就可以了。



每个人的能力都不同,有的理论方面强,但动手不行。

有的动手不错,但理论不行。有的这两个方面都不行,但人际关系就很NB。

出来工作了,就是社会的大学。社会大学是不以你的知识水平论高低的,它需要的是一个人的整体素质。

有个同学,至今三极管的三个脚仍分不清,但英语就NB,现在做电子外贸。已经过个幸福的小日子了。

所以人不可以以一而论之。



大学之大就是在于它能融入很多不同东西,所以作为大学教师,海纳百川吧。

出0入0汤圆

41
发表于 2009-7-25 09:52:36 | 只看该作者
我怎么就没遇到过那么好的老师啊……

出0入0汤圆

42
发表于 2009-7-26 09:20:45 | 只看该作者
熊。。

出0入0汤圆

43
发表于 2009-10-16 11:40:42 | 只看该作者
那个水平移动的广告,字库是自己写的吗,还是有统一的标准啊......?

出0入0汤圆

44
 楼主| 发表于 2009-10-16 17:02:38 | 只看该作者
8*8字库(字型)只能自己定义,只要大家认得,而且比较舒服。

8*8能显示的汉字还只能是比较简单的,但它的基本思想同16*16的。

实际应用中需要16*16点阵显示汉字,此时的汉字字型可以从电脑中字库获得,可以为黑体、宋体.....等等。

网上有很多免费的从电脑字库提取字型的软件,只要作用是从电脑字库文件中得到1(n)个汉字的字型,转换成二进制或十六进制的数据,这样就可以直接贴到自己的代码中。

如果需要显示所有的汉字(短信显示屏等),就需要把电脑中整个字库文件取出,放在一个大容量的存储器件中(二级字库大约700K字节)。

这个实验还只是一个基本的演示实验,当你掌握后,就应该考虑实际应用中16*16汉字的显示,了解整个过程中所涉及的概念和方法。这样才是真正学习过程。

比如公司老板让你设计一块32*160点阵显示屏(可以显示2行*10个汉字),你的硬件系统如何设计?软件又任何实现?

出0入0汤圆

45
发表于 2009-10-23 16:31:25 | 只看该作者
请问马老师,MEGA64中存储器编程有实例吗?
我想要

出0入0汤圆

46
发表于 2009-11-21 16:34:10 | 只看该作者
马老师您好,学生刚学习单片机,对于"贴上实验二中的2个参考代码"有几个不懂的地方
1.time_20ms_ok只是定义了数据类型但是没有初始化,c语言中定义变量后必须初始化啊
2.if ( time_20ms_ok && int1_off )         // 这段是间隔20ms检测按键是否释放
            {                                      // 确认释放后开INT1中断,可以接收下次的按键
                if (PIND.3 && pre_pind3)           // 这样就防止了一次按键过程中按键抖动对INT1的影响,构成消抖功能
                {
                    GIFR |= 0x80;
                    GICR |= 0x80;
                    int1_off = 0;
                }   
                pre_pind3 = PIND.3;
            }
  这段防抖动程序不是很明白,能不能再详细注释下啊!
提的问题有点BC,请马老师见谅!

出0入0汤圆

47
发表于 2009-12-17 15:59:27 | 只看该作者
自己设计的程序没有老师想得那么多,细,一个功能出来了就觉得很兴奋,没有再静下心来考虑。差距很大。。。。。
马老师是我佩服的少数几个华师大的老师之一,虽然以后可能不会做这一行。。。。。。

出0入0汤圆

48
发表于 2010-12-23 11:49:23 | 只看该作者
回复【楼主位】machao  
------------------------------------------------------------------
马老师威武 马老师荡漾

出0入0汤圆

49
发表于 2011-5-27 10:18:52 | 只看该作者
标记!

出0入0汤圆

50
发表于 2011-8-2 00:04:23 | 只看该作者
膜拜马老师的教学精神!我们有你真好!好好学习吧!

出0入0汤圆

51
 楼主| 发表于 2011-10-19 17:26:10 | 只看该作者
请正在学习AVR课程的同学,和购买我的教程的朋友:把这个帖子仔细看上几遍,体会一下,我所提倡的真正学习AVR和嵌入式系统是一个什么样的概念和过程。只有这样,你才能真正的掌握和应用。

出115入0汤圆

52
发表于 2011-10-19 20:35:12 | 只看该作者
mark

出0入0汤圆

53
发表于 2011-10-19 20:58:05 | 只看该作者
回复【5楼】lonely88
我觉得马老师教学生真的是浪费了,应该来教教我们的部分大学老师。。。
-----------------------------------------------------------------------

是的 先把教师较好更为重要
而且,所有的教师,我个人认为,都应该在实验室里好好待几年,真正带带实验

出0入0汤圆

54
发表于 2011-10-19 21:01:48 | 只看该作者
回复【11楼】machao
实际上,学生如果前面2年认真学习的话(不是那种应试型的“认真”学习),完成基本的实验不需要化很多时间的。可惜的是....
实验板和工具都是发给学生带回家去的,随便你如何“玩”。
附加的题是给有兴趣、有一定能力和想多学的学生准备的。不是必做。
至于成绩肯定记入总分,占到60%以上,还有40%是学生最后自己设计和实现的小系统。主要是要学生动手,要做。
得到85分以上比较难,要的确有一定的能力,自己完成的。很多人是“参考”别人的,一看就看出来的。这些人根本也不会化时间,因为现在的学生至少有1/3是不喜欢电子专业。
-----------------------------------------------------------------------

是啊,感觉特别是上海本地的孩子,可能搞电子太苦了,而且没有更多的“钱”途吧

出0入0汤圆

55
发表于 2011-10-19 21:30:04 | 只看该作者
mark

出0入0汤圆

56
发表于 2011-10-22 23:42:18 | 只看该作者
mark。

出0入0汤圆

57
发表于 2011-12-16 18:05:45 | 只看该作者
回复【50楼】machao
    请正在学习avr课程的同学,和购买我的教程的朋友:把这个帖子仔细看上几遍,体会一下,我所提倡的真正学习avr和嵌入式系统是一个什么样的概念和过程。只有这样,你才能真正的掌握和应用。
     

-----------------------------------------------------------------------

膜拜马老师的教学精神!我们有你真好!好好学习!

出0入0汤圆

58
发表于 2012-1-4 13:45:02 | 只看该作者
有空看看

出0入0汤圆

59
发表于 2012-1-4 22:39:34 | 只看该作者
要是现在手上有书就好了

出0入0汤圆

60
发表于 2014-4-27 21:00:18 | 只看该作者
路过路过了  顺便看看

出0入0汤圆

61
发表于 2014-5-3 16:33:42 | 只看该作者
好东西啊         

出0入0汤圆

62
发表于 2018-5-25 12:01:25 | 只看该作者
谢谢!留着怀疑,回去研究一下。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 18:29

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表