嵌入式系统与单片机课程(实验讲义,实践操作测试复
本帖最后由 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 课堂设计操作练习题以及参考代码
http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_694386HOCOQD.jpg
(原文件名:未标题-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={0x39,0x09,0x09,0x09,0x09,0x09,0x09,0x0f}; //封闭图像的8段码表
unsigned char blk_7 = {
{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={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)
PORTA = blk_7;
else
PORTA = led_7;
PORTC = ~(1<<posit);
if (++posit >= 8 ) posit = 0;
}
// Timer 0 比较匹配中断服务,2s执行一次
interrupt 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)
{
}
} 关于试验3广告牌的
flash unsigned char char_7= //采用二进制定义,可以方便的调整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}};
for (i=0;i<=7;i++)
{
k1= number/8;
k2= number%8;
display_buff = display_buff << 1;
if (char_7 & (0x80>>k2)) display_buff += 1;
}
if (++number>= bit_number) number = 0;
}
display_buff,刚开始display( )是没有显示的。当number=0时,K1=0;K2=0;i=0-3时,display_buf是空的;当i=4,char_7 & (0x80>>k2 & (0x80>>k2为真,这时display_buff=0x01;i=5,display_buff左移一位,等于0x20。。。。。。
好像并不能把第一列的第一个bit读出来??????????????????、、 帖子这么好,我竟然没来凑热闹
真是罪过啊 真的碰上我上你的课,你就开始骂我了。 羡慕马老师的学生呀,我做梦都想遇上这样一位老师,哎~~~!!! mark 单片机与嵌入式系统期末笔试复习纲要已经发在LZ位 实践操作测试复习纲要发在LZ位。 马老师:请你转告你那个保送北大的学生,欢迎他到北大未名bbs的elecdiy版来,这是一个讨论各种电子制作的版面 支持马老师,可惜离华东师大有点远,不然要去旁听学习。 可能马老师还没明白我的意思。
如果学校抓得严,那就抓严些。如果有可能,就放学生一些生路。
也许这个学生没有学习技术的天份,正如我所说的那个过个幸福生活的同学。它并不是靠技术吃饭的,至少不是做开发的。
如果马老师因为你令这样的学生不能毕业的话,我想对他来说也许连工作都找不到。
这里我在声明一下对学生的处理方法
1.对于整天游戏,不思学习的。坚决打击。也就是本质上不想学的。
2.对于努力学习理论好,但没有动手能力的,放行。也就是睁只眼闭只眼。
3.对于努力学习但理论动手都不行的,只能忍痛割爱了。
在现有的素质教育下,想有很好的动手能力是很难的。严格要求固然好,但在社会主义的初级阶段,应变一下吧。
本贴被 gliet_su 编辑过,最后修改时间:2008-12-01,00:05:34. 看到马老师的课程讲义和讲解,想起在校时得感觉。马老师上课真的很认真~~~
题外话,很感兴趣,不知马老师的课,每次实验预计学生要花多少时间准备,上课实验时间多少,实验报告花多少时间完成。
平时实验成绩是否算入总分(百分比)?
本贴被 testcode 编辑过,最后修改时间:2008-11-06,04:08:04. 本帖最后由 machao 于 2012-11-8 21:29 编辑
k1=number/8;
k2=number%8;
注意这两句的区别!比如当number=2时,K1、K2为多少?number=9时,K1、K2又为多少? #include <mega16.h>
#include <delay.h>
#define move_speed 8 // 改变此值就可以调整左移的速度
#define bit_number 5*8 // n个字符,就只要定义成n*8,把下面的点阵定义扩大就可以了,程序不需要再动了。
flash unsigned char char_7= //采用二进制定义,可以方便的调整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;
void display() // 显示扫描子程序,就单一的做显示扫描,把display_buff[]的点阵送出。至于是什么,就不要管了。
{
char i;
for (i=0;i<=7;i++)
{
PORTA = display_buff;
PORTC = ~(1<<i);
delay_ms(2);
PORTC = 0xFF;
}
}
void main(void)
{
char gap,i,k1,k2,number=0;
PORTA=0x00;
DDRA=0xFF;
PORTC=0xFF;
DDRC=0xFF;
while (1)
{
display();
if (++gap>= move_speed) // 以下这段是关键,自己分析吧,看做了什么,有何技巧。
{
gap = 0;
for (i=0;i<=7;i++)
{
k1= number/8;
k2= number%8;
display_buff = display_buff << 1; //display_buff的内容左移一位
if (char_7 & (0x80>>k2)) display_buff += 1; //char的第(7-k2)位为1, display_buff += 1
}
//以下我分析的这段代码
//number: 0 1 2 ....
//k1,k2: 0,0 0,0 0,0 .... // 《======= ??!!错误
//i display_buff
//===========================
//0 0b0000 0000 0b0000 0000 0b0000 0000 ....
//1 0b0000 0000 0b0000 0000 0b0000 0000 ....
//2 0b0000 0000 0b0000 0000 0b0000 0001 ....
//3 0b0000 0000 0b0000 0001 0b0000 0011 ....
//4 0b0000 0001 0b0000 0011 0b0000 0111 ....
//5 0b0000 0000 0b0000 0001 0b0000 0011 ....
//6 0b0000 0000 0b0000 0000 0b0000 0001 ....
//7 0b0000 0000 0b0000 0000 0b0000 0000 ....
if (++number>= bit_number) number = 0;
}
}
}
================================================================================
请马老师回答下你的这段代码是这个意思吗?这样理解对吗?
本贴被 machao 编辑过,最后修改时间:2008-11-06,02:39: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={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
flash unsigned char position={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char time; //时、分、秒计数单元
unsigned char dis_buff; //显示缓冲区,存放要显示的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];
if (posit==2 || posit==4) PORTA |= 0x80;
PORTC = position;
if (++posit>=6) posit = 0;
}
//External Interrupt 0 service routine 2ms 一次
interrupt void ext_int0_isr(void)
{
display(); //调用LED扫描显示
if (++time_counter>=5)
{
time_counter = 0;
time_10ms_ok = 1;
}
}
//External Interrupt 1 service routine 外部按键中断
interrupt 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 = time%10;
dis_buff = time/10;
}
}
void main(void)
{
PORTA=0x00; //显示控制I/O端口初始化
DDRA=0xFF;
PORTC=0x3F;
DDRC=0x3F;
PORTD = 0xFF; //PD2,PD3输入,上拉有效
time = 0; time = 0; time = 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;
time=0;
time=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 >= 100) //以下时间调整
{
time = 0;
if (++time>=60)
{
time = 0;
if (++time>=60) time = 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_speed8 //改变此值就可以调整左移的速度
#define bit_number 5*8 //n个字符,就只要定义成n*8,把下面的点阵定义扩大就可以了,程序不需要再动了
flash unsigned char char_7= //采用二进制定义,可以方便的调整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;
void display() //显示扫描子程序,就单一的做显示扫描,把display_buff[]的点阵送出。至于是什么,就不要管了。
{
for (k=0; k<=7; k++)
{
PORTA = display_buff;
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 = display_buff << 1;
if (char_7 & (0x80>>k2)) display_buff += 1;
}
if (++number >= bit_number) number = 0;
}
}
}
本段程序,执行代码大小为233字,如果要左移显示10个字符,只要将define中的bit_number定义成10*8,然后重新定义flash unsigned char char_7和点阵(这个省不掉的,是必须做的)就可以了,执行程序的本身不需要做改动了。代码长度的增加,就仅仅为点阵定义本身增加的数量。 我觉得马老师教学生真的是浪费了,应该来教教我们的部分大学老师。。。 实验二的要求已经在LZ位了。 呵呵 有3个同学说并口线不工作,结果是打印连接延长线的一头根本没插在电脑的接口上......有一个还是我帮她插上的...... 好好学AVR了......好好动手了 有这样的老师 学生应该好好学 呵呵,马老师好幽默。“熊”他!! 初学AVR,马老师的设计一个8X8点阵LED广告,能够水平移动显示“<- 2月1日”。要求显示连续不闪烁,移动平稳,字符亮度均匀的程序终于看懂了,直接改了改马老师的程序(稍做改动),变成水平右移显示了 ,只需将
display_buff = display_buff << 1;
if (char_7 & (0x80>>k2)) display_buff += 1; 两句换为下面两句即可,由于点阵字符的代码没改所以箭头是倒着的.
display_buff = display_buff>>1;
if (char_7 & (0x01<<k2)) display_buff|=0x80; thanks 水平移动的广告
#include <mega16.h>
#include<delay.h>
char char_HELLO={0x9f,0x98,0x98,0xff,0x98,0x98,0x98,0x9f, //HE
0xff,0x88,0x88,0x88,0x88,0x88,0x88,0x88, //LL
0x64,0x90,0x94,0x94,0x94,0x94,0x90,0x64}; //O!
char temp;
void display( )
{
unsigned char i,j;
unsigned char a,b,c,d,e=0;
for (a=0;a<24;a++)
temp=char_HELLO;
for(d=0;d<24;d++)
{
for(b=0;b<20;b++)
{
for(c=0;c<8;c++)
{
temp=temp<<1;
PORTA = temp;
PORTC = ~(1<<c);
delay_ms(2);
PORTC = 0xFF;
}
}
}
}
void main()
{
PORTA=0x00;
DDRA=0xFF;
PORTC=0xFF;
DDRC=0xFF;
while (1)
{
display( );
}
}
// External Interrupt 1 service routine 外部按键中断
interrupt void ext_int1_isr(void)
{
GICR &= 0x7F; // 关INT1中断,是做消抖处理
int1_off = 1;
pre_pind3 = 0;
if (++key_state>=3) key_state = 0;
}
马老师 按键中断中关闭中断能起到消抖的处理吗? 呵呵。
本贴被 zhenke 编辑过,最后修改时间:2008-11-24,23:01:25. 不知道 A |= 0x80,很正常,哪怕是学过C语言程序设计,不知道也正常。
不正常的是,当不知道时,并不去打开书去找找,了解一下是什么意思,这就不正常了。
“c/有同学不知道 A |= 0x80 是什么意思。 ”
这么难,不知道很正常。
不知道0x的大有人在。 实验四的要求已经在LZ位了。
实验三,基本练习2的参考代码见楼上
本贴被 machao 编辑过,最后修改时间:2008-11-22,16:53:07. 实验三的要求已经在LZ位了。
===========================================================
实验三,基本练习2的参考代码
/*********************************************
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>
#define row 12
#define speed 25*8 //移动速度调节
flash unsigned char char_7={0x10,0x38,0x7C,0xFE,0x38,0x38,0x38,0x38,0x00,0x00,0x00,0x00};
bit time_1ms_ok;
unsigned char dis_buff;
// Timer 0 output compare interrupt service routine
interrupt void timer0_comp_isr(void) // 1ms 中断一次
{
time_1ms_ok = 1;
}
void display(void)
{
static unsigned char i;
PORTC = 0xFF;
PORTA = dis_buff;
PORTC = ~(1<<i);
if (++i>= 8 ) i = 0;
}
void main(void)
{
unsigned char move_speed,i,j;
PORTA=0x00;
DDRA=0xFF;
PORTC=0xFF;
DDRC=0xFF;
// Timer/Counter 0 initialization
// Clock source: System Clock,Clock value: 62.500 kHz
// Mode: CTC top=OCR0, OC0 output: Disconnected
TCCR0=0x0B;
TCNT0=0x00;
OCR0=0x3D;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02; //允许T/C0 CTC中断
// Global enable interrupts
#asm("sei") // 开全局中断
for (i=0;i<=8;i++) {dis_buff = char_7;}
j = 8;
while (1)
{
if (time_1ms_ok)
{
time_1ms_ok = 0;
display();
if (++move_speed>= speed)
{
move_speed = 0;
for (i=0;i<=6;i++)
{
dis_buff = dis_buff;
}
if (++j>= row) j = 0;
dis_buff = char_7;
}
}
}
}
本贴被 machao 编辑过,最后修改时间:2008-11-22,16:56:49. 光多写程序还不行,关键是有一定的理论基础。如果是写了一大堆“烂”程序,收获也不大,到反而可能走向另一面,封住了脚步,阻止了自己的进步。
最好是学习些《数据结构》的课程,因为软件上有种说法:程序 = 算法 + 结构。有了一定的数据结构的基础,你编写程序时,就会有思路和想法,看别人的程序就容易读懂,能够清楚的分辩出好还是不好。这里的“好”不是仅指能实现功能。 我也写过这个练习的代码,不过没有马老师的好,效率也不高,亮度也不均匀,还会会闪烁,根本没有想到这样来处理。
看来还要多写写程序,多做些马老师书上的练习。
谢谢马老师!! 那下面的2句就可以知道做什么了。 k1= number/8;
k2= number%8;
注意这两句的区别!比如当number = 2时,K1、K2为多少?number = 9时,K1、K2又为多少?
=====================================================================================
比如当number = 2时,K1=0,K2=2
number = 9时,K1=1,K2=1
发帖的时候上面注释忘记改了。 实际上,学生如果前面2年认真学习的话(不是那种应试型的“认真”学习),完成基本的实验不需要化很多时间的。可惜的是....
实验板和工具都是发给学生带回家去的,随便你如何“玩”。
附加的题是给有兴趣、有一定能力和想多学的学生准备的。不是必做。
至于成绩肯定记入总分,占到60%以上,还有40%是学生最后自己设计和实现的小系统。主要是要学生动手,要做。
得到85分以上比较难,要的确有一定的能力,自己完成的。很多人是“参考”别人的,一看就看出来的。这些人根本也不会化时间,因为现在的学生至少有1/3是不喜欢电子专业。 错人当中的一个,顶它个fuc!
^_^ 楼上不会就是我所在的学校吧?!我也是本系的四大名补之一。
另外,楼上学校控制不及格的比例是多少,能透露吗?
“如果马老师所在的学校没那么严格的话,就睁只眼闭只眼了。不要和学生过不去,不要和现有教育过不去。”
你现在还喝SANLU的牛奶吗?喝吧,不要和。。。。过不去。
我现在就是制造含SANJUQINGAN产品的一员。学校的产品是学生,学生达不到要求就是不合格的产品。现在已经是“睁只眼闭只眼”了,而且就是那只睁的眼也已经闭上一半了。就是实在不愿意把最后半只眼也闭上,才这样的。
大家都非常痛恨社会上造假酒、假奶粉、假食品的,因为害了不少人。可是学校里造的假合格学生,会害了几代人,害了整个社会。
人人痛恨做假,人人又在自己做假,多么可怕的现象! 回machao老师
可能马老师真的是要满足所有人了。
也许各个学校不同吧。
我所在学校要求就很严格,不过就是不给过,当然要控制一定的比例。
一次不过的,重修,重修的可以出题轻些,再不过的就没法了,修到过为止。
记得《微机原理》就有50%不过,教这门课的老师被称为四大名补。
如果马老师所在的学校没那么严格的话,就睁只眼闭只眼了。不要和学生过不去,不要和现有教育过不去,
问心无愧就行了。 凡有的还要加给他,叫他有余。没有的,连他所有的也要夺过来。
这是马太福音的话。个人支持马老师。
想我上学的时候,四个人在实验室泡了一个暑假,整个学校都找不出一个老师可以指导我们,当然不是我们水平高,是老师。。。
我们师弟现在热情都很高,但指导只能靠师兄,还好现在他们能够独立解决一些问题了。
如果能有一个马老师一样的老师指导我们,呵呵,会幸福得天天打滚。 to 26楼:
我非常认可和同意你的说法,况且我自己也是这个观点,也同学生讲过。
目前我的难处是:
1。我上的课只是AVR,只能按你掌握和使用AVR的程度给出本门专业技术的分数。而不是学生的整体素质的成绩(这个我也评价不了)。
2。如果认真按最基本的要求给出本门课程的分数,那么至少有1/3的学生是不及格的。
3。我个人的观点是“精英教育”,也就是你说的“只要把那些想学的,好学的教好,让他们的能力再上一个台阶”。可是在现行的教育体制下做不到。
4。作为学校的一个专业,对本专业的学生要掌握的知识和能力是有一定标准的。如果你达不到这个基本的标准怎么办?
5。还有更充分的例子就是微软的前总裁“老毕”,大学都没毕业。我总不能让那些不想学的学生都退学吧?
6。况且我在课上要求学生基本掌握的东西并不高,都是最基本的(你从实验要求可以看出),离社会对本专业人才的要求差的远了。
7。我教AVR,要求学生看外语的资料。将来就是不做AVR应用设计的工作,外语的锻炼总是有用的吧。你知道有多少学生会看吗?
你说该怎么办? 想到一个笑话:你不能满足所有的人,因为不是所有的人都是人。
所以马老师不必过于责全求备,你不可能要求每个学生都学好单片机,也不可能要求他们都把C学得滚瓜烂熟。
只要把那些想学的,好学的教好,让他们的能力再上一个台阶就可以了。
每个人的能力都不同,有的理论方面强,但动手不行。
有的动手不错,但理论不行。有的这两个方面都不行,但人际关系就很NB。
出来工作了,就是社会的大学。社会大学是不以你的知识水平论高低的,它需要的是一个人的整体素质。
有个同学,至今三极管的三个脚仍分不清,但英语就NB,现在做电子外贸。已经过个幸福的小日子了。
所以人不可以以一而论之。
大学之大就是在于它能融入很多不同东西,所以作为大学教师,海纳百川吧。 我怎么就没遇到过那么好的老师啊…… 熊。。 那个水平移动的广告,字库是自己写的吗,还是有统一的标准啊......? 8*8字库(字型)只能自己定义,只要大家认得,而且比较舒服。
8*8能显示的汉字还只能是比较简单的,但它的基本思想同16*16的。
实际应用中需要16*16点阵显示汉字,此时的汉字字型可以从电脑中字库获得,可以为黑体、宋体.....等等。
网上有很多免费的从电脑字库提取字型的软件,只要作用是从电脑字库文件中得到1(n)个汉字的字型,转换成二进制或十六进制的数据,这样就可以直接贴到自己的代码中。
如果需要显示所有的汉字(短信显示屏等),就需要把电脑中整个字库文件取出,放在一个大容量的存储器件中(二级字库大约700K字节)。
这个实验还只是一个基本的演示实验,当你掌握后,就应该考虑实际应用中16*16汉字的显示,了解整个过程中所涉及的概念和方法。这样才是真正学习过程。
比如公司老板让你设计一块32*160点阵显示屏(可以显示2行*10个汉字),你的硬件系统如何设计?软件又任何实现? 请问马老师,MEGA64中存储器编程有实例吗?
我想要 马老师您好,学生刚学习单片机,对于"贴上实验二中的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,请马老师见谅! 自己设计的程序没有老师想得那么多,细,一个功能出来了就觉得很兴奋,没有再静下心来考虑。差距很大。。。。。
马老师是我佩服的少数几个华师大的老师之一,虽然以后可能不会做这一行。。。。。。 回复【楼主位】machao
------------------------------------------------------------------
马老师威武 马老师荡漾 标记! 膜拜马老师的教学精神!我们有你真好!好好学习吧! 请正在学习AVR课程的同学,和购买我的教程的朋友:把这个帖子仔细看上几遍,体会一下,我所提倡的真正学习AVR和嵌入式系统是一个什么样的概念和过程。只有这样,你才能真正的掌握和应用。 mark 回复【5楼】lonely88
我觉得马老师教学生真的是浪费了,应该来教教我们的部分大学老师。。。
-----------------------------------------------------------------------
是的 先把教师较好更为重要
而且,所有的教师,我个人认为,都应该在实验室里好好待几年,真正带带实验 回复【11楼】machao
实际上,学生如果前面2年认真学习的话(不是那种应试型的“认真”学习),完成基本的实验不需要化很多时间的。可惜的是....
实验板和工具都是发给学生带回家去的,随便你如何“玩”。
附加的题是给有兴趣、有一定能力和想多学的学生准备的。不是必做。
至于成绩肯定记入总分,占到60%以上,还有40%是学生最后自己设计和实现的小系统。主要是要学生动手,要做。
得到85分以上比较难,要的确有一定的能力,自己完成的。很多人是“参考”别人的,一看就看出来的。这些人根本也不会化时间,因为现在的学生至少有1/3是不喜欢电子专业。
-----------------------------------------------------------------------
是啊,感觉特别是上海本地的孩子,可能搞电子太苦了,而且没有更多的“钱”途吧 mark mark。 回复【50楼】machao
请正在学习avr课程的同学,和购买我的教程的朋友:把这个帖子仔细看上几遍,体会一下,我所提倡的真正学习avr和嵌入式系统是一个什么样的概念和过程。只有这样,你才能真正的掌握和应用。
-----------------------------------------------------------------------
膜拜马老师的教学精神!我们有你真好!好好学习! 有空看看 要是现在手上有书就好了 路过路过了顺便看看 好东西啊 谢谢!留着怀疑,回去研究一下。。。
页:
[1]